Подскажите пожалуйста, как можно организовать простой кэш на 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"
Как можно правильно проверить устаревание файла в моем случае ?
У меня не воспроизводиться. Что показывает
perl -V:usethreads -V:usemultiplicity
?
PS. Приложение таково, что busy locks не существенны, однако по-хорошему их
тоже хочется. Сделать их можно было бы на встроенном перле, однако пробуждать
ожидающие в очереди соединения не представляется возможным без специальной
поддержки со стороны nginx. Даже с одним worker процессом. Скажите, busy
locks вообще сложно сделать в nginx ?