| Nginx-ru mailing list archive (nginx-ru@sysoev.ru) [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
 cache
 
To: nginx-ru@xxxxxxxxxSubject: cacheFrom: Andrei Nigmatulin <anight@xxxxxxxxxxxxxxxx>Date: Mon, 13 Nov 2006 14:53:35 +0300Domainkey-signature: a=rsa-sha1; q=dns; c=nofws;	d=eyelinkmedia.com; s=m23uiy46;	h=Received:From:To:Subject:Date:User-Agent:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-Disposition:Message-Id;	b=HT5yyMF/agl7bOvqKworOjXfF0YiKQYFIQTh+Qoytki0sExgVkR2Fk/CRzCNjbYoxLtZABkYQ6x/MYYghH/b/2CLi5ntDLXrTDrL4AsM8kZcfLwPpEqIBPeSeXE8R3whkc9yVJVb26R7Ex8lD8cM8xgd5sfPkPFk21+0mfqgI5Y= 
 Добрый день, Игорь !
Подскажите пожалуйста, как можно организовать простой кэш на 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
 |