cache

Andrei Nigmatulin anight at eyelinkmedia.com
Mon Nov 13 14:53:35 MSK 2006


Добрый день, Игорь !

Подскажите пожалуйста, как можно организовать простой кэш на nginx. Хочется 
примерно следующее:

        location /dynamic/ {
                        internal;
                        fastcgi_param  REQUEST_URI      $request_uri;
                        fastcgi_param  CACHE_ROOT       $_cache_root;
                        fastcgi_param  SCRIPT_FILENAME  /path/cache.php;
                        fastcgi_pass   127.0.0.1:9000;
        }

        location / {
                        root $_cache_root;
                        if (!-f $request_filename) {
                                rewrite .* /dynamic/ last;
                        }
                        if ($cached_file_is_too_old) {
                                rewrite .* /dynamic/ last;
                        }
        }

Вся загвоздка в том, как правильно организовать $cached_file_is_too_old. Я 
пробовал вот так:

        perl_set $cached_file_is_too_old '
                sub {
                        my $r = shift;
                        if (time() - (stat $r->filename)[9] > 10) {
                                return "1";
                        }
                        return "";
                }
        ';

Но в момент запроса в error_log выдается следующее:

2006/11/12 22:43:25 [error] 23481#0: *1 call_sv("
                sub {
                        my $r = shift;
                        if (time() - (stat $r->filename)[9] > 10) {
                                return "1";
                        }
                        return "";
                }
        ") failed: "Can't call method "filename" on an undefined value at 
(eval 1) line 3.", client: 127.0.0.1, server: inspirer.lan, URL: "/5.html", 
host: "localhost:8080"

Как можно правильно проверить устаревание файла в моем случае ?

PS. Приложение таково, что busy locks не существенны, однако по-хорошему их 
тоже хочется. Сделать их можно было бы на встроенном перле, однако пробуждать 
ожидающие в очереди соединения не представляется возможным без специальной 
поддержки со стороны nginx. Даже с одним worker процессом. Скажите, busy 
locks вообще сложно сделать в nginx ?


-- 
Andrei Nigmatulin
GPG PUB KEY 6449830D

Now I lay me down to sleep(3)
Pray the OS my core to keep
If I die before I wake
Pray the Disk my core to take


More information about the nginx-ru mailing list