ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Баг или фича ? (ssi + memcached + wait="yes")



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
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;


 




Copyright © Lexa Software, 1996-2009.