Баг или фича? (ssi + memcached + wait="yes")
Igor Sysoev
is at rambler-co.ru
Thu Mar 29 23:09:11 MSD 2007
On Fri, Mar 23, 2007 at 09:12:15PM +0300, Vlad S. Maximov wrote:
> nginx 0.5.14
>
> Имеем конфиг:
>
> ...
> upstream backend {
> server localhost:80;
> }
> ...
> location /memcached/ {
> internal;
> ssi on;
> set $memuri $uri;
> set $memcached_key "$memuri";
> memcached_pass localhost:10000;
> error_page 404 =200 /memcached-miss$memuri;
> }
> ...
> location /memcached-miss/ {
> internal;
> ssi on;
> rewrite ^/memcached-miss/(.*)$ /$1 break;
> proxy_set_header Host $host;
> proxy_set_header X-Real-IP $remote_addr;
> proxy_pass http://backend;
> proxy_redirect off;
> }
> ...
>
> Имеем примерно следующий index.shtml:
> ...
> <!--# include virtual="/memcached/frontpage/part1/" -->
> <!--# include virtual="/memcached/frontpage/part2/" -->
> <!--# include virtual="/memcached/frontpage/part3/" -->
> ...
>
> В итоге при обращении к странице в логах бэкенда имеем:
> ...
> GET /memcached/frontpage/part3/
> GET /memcached/frontpage/part3/
> GET /memcached/frontpage/part3/
> ...
> но если поставить в каждом из инклюдов wait="yes", то получаем желаемое
> ...
> GET /memcached/frontpage/part1/
> GET /memcached/frontpage/part2/
> GET /memcached/frontpage/part3/
> ...
>
> Почему такое происходит (параллельные запросы идут по последнему uri)?
> Как от этого избавиться?
Дело в том, что
1) переменные общие для всех подзапросов
2) большинство переменных кэшируется, поэтому для /memcached-miss$memuri
испорльзуется $memuri, равная /memcached/frontpage/part3/.
Переменная $uri не кэшируется, но в nginx есть ошибка из-за которой
даже значение $uri кэшируется даже в такой конфигцурации:
set $memcached_key $uri;
memcached_pass localhost:10000;
error_page 404 =200 /memcached-miss$uri;
Прилагаемый патч ошибку исправляет.
--
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_script.c
===================================================================
--- src/http/ngx_http_script.c (revision 470)
+++ src/http/ngx_http_script.c (working copy)
@@ -305,10 +305,21 @@
ngx_http_script_run(ngx_http_request_t *r, ngx_str_t *value,
void *code_lengths, size_t len, void *code_values)
{
- ngx_http_script_code_pt code;
- ngx_http_script_len_code_pt lcode;
- ngx_http_script_engine_t e;
+ ngx_uint_t i;
+ ngx_http_script_code_pt code;
+ ngx_http_script_len_code_pt lcode;
+ ngx_http_script_engine_t e;
+ ngx_http_core_main_conf_t *cmcf;
+ cmcf = ngx_http_get_module_main_conf(r, ngx_http_core_module);
+
+ for (i = 0; i < cmcf->variables.nelts; i++) {
+ if (r->variables[i].no_cachable) {
+ r->variables[i].valid = 0;
+ r->variables[i].not_found = 0;
+ }
+ }
+
ngx_memzero(&e, sizeof(ngx_http_script_engine_t));
e.ip = code_lengths;
More information about the nginx-ru
mailing list