ssi+memcached key=??

Maxim Dounin mdounin на mdounin.ru
Ср Апр 14 03:30:40 MSD 2010


Hello!

On Tue, Apr 13, 2010 at 07:17:50AM -0400, john2do wrote:

> День добрый!
> 
> Всплыл тут пренеприятнейший момент, а именно:
> имеем index.html вида
> 
> <!--# include virtual="/cache/ssss?docid=12345" -->
> 
> <!--# include virtual="/cache/ssss?docid=8888" -->
> 
> <!--# include virtual="/cache/ssss?docid=9999" -->
> 
> имеем конфиг вида:
>         location / {
>                 ssi on;
>                 root   /home/www;
>                 index  index.html;
>         }
>         location /cache {
>                 default_type text/html;
>                 set $memcached_key "gen|$arg_docid";
>                 memcached_pass 127.0.0.1:11211;
>         }
> 
> приэтом, если запрашивать /cache/ssss?docid=....(тут то что нужно) отдается именно контент который нужен.
> при обработке же ssi странички, отдается(запрашивается в мемкэше) исключительно gen|12345 (лог мемкэша это подтверждает).
> я правильно понимаю что переменная $memcached_key не переопределяется?

Переменные $arg_* кешируются, а подзапросы имеют общее 
пространство переменных с основным запросом (и между собой).  В 
результате кто первый встал - от того и закешировалось...

> это баг-фича? или мои кривые руки?

Это багофича.

> Как быть что бы заработало?

Либо использовать для передачи ключа что-нибудь некеширующееся, 
например uri:

    <!--#include virtual="/cache/12345" -->
    <!--#include virtual="/cache/8888" -->

    location ~ ^/cache/([0-9]+)$ {
        set $memcached_key "gen|$1";
        memcached_pass ...;
    }

Либо накатить какой-то такой патч:

--- a/src/http/ngx_http_variables.c
+++ b/src/http/ngx_http_variables.c
@@ -1937,6 +1937,7 @@ ngx_http_variables_init_vars(ngx_conf_t
         if (ngx_strncmp(v[i].name.data, "arg_", 4) == 0) {
             v[i].get_handler = ngx_http_variable_argument;
             v[i].data = (uintptr_t) &v[i].name;
+            v[i].flags = NGX_HTTP_VAR_NOCACHEABLE;

             continue;
         }


Maxim Dounin



Подробная информация о списке рассылки nginx-ru