Есть сервер Debian, nginx 1.1.19 --with-http_perl_module, apache, и сайты на джумле.
Перепробовал 1000 вариантов научить джумлу корректно отдавать 304 not modified и last modified при этом кэшируя контент, но все время что-то да не работает, поэтому хочу поэкспериментировать реализовать на встроенном в nginx perl.
Включаю кэширование в nginx, проксирую запрос к apache, и ставлю обработчик location, -virtualHost nginx
perl_modules /opt/perl;
perl_require mysite.pm;
proxy_cache_path /srv/web/cache/mysite levels=1:2 keys_zone=mysite:1m inactive=24h;
server {
listen 80;
server_name mysite.ru www.mysite.ru;
set $root_path /var/www/mysite.ru;
access_log /var/www/nginx.logs/nginx.mysite.ru.access.log;
error_log /var/www/nginx.logs/nginx.mysite.ru.error.log;
location ~* ^.+\.(jpg|jpeg|gif|png|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|ico|flv|js|css|ttf|otf|eot|svg|txt)$ {
root $root_path;
error_page 404 = @fallback;
}
location / {
set $do_not_cache 0;
if ( $cookie_caching = "stop" ) {
set $do_not_cache 1;
}
if ( $request_uri ~* "administrator|cart" ) {
set $do_not_cache 1;
}
if ( $request_uri ~* ".php" ) {
set $do_not_cache 1;
}
if ( $request_uri ~* "oneclickcheckout" ) {
set $do_not_cache 1;
}
if ( $request_method = POST ) {
set $do_not_cache 1;
}
if ( $request_method != GET ) {
set $do_not_cache 1;
}
proxy_cache_bypass $do_not_cache;
proxy_no_cache $do_not_cache;
proxy_pass http://127.0.0.1:81;
proxy_redirect http://127.0.0.1:81/ /;
proxy_hide_header "Cache-Control";
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache mysite;
proxy_cache_valid 200 301 302 304 180h;
proxy_cache_valid 404 10m;
proxy_cache_valid any 10m;
proxy_cache_key "$request_method|$host|$request_uri";
perl mysite::handler;
}
location @fallback {
proxy_pass http://127.0.0.1:81;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
location ~* ^.+\.(jpg|jpeg|gif|png|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|ico|flv|js|css|ttf|otf|eot|svg|txt)$ {
root $root_path;
error_page 404 = @fallback;
}
}
Отдельный скрипт парсит sitemap.xml и складывает в файл время модификации страницы, аля: mysite.lst
url1|2014-09-28T23:39:10+04:00
url2|2014-09-28T23:39:10+04:00
.....
Теперь затык в обработчике location mysite.pm, как мне добавить заголовок last-modified в ответ клиенту?
если допустим
package mysite;
use nginx;
sub handler {
my $r = shift;
$r->send_http_header("text/html");
$r->print("hello world!");
return OK;
}
1;
__END__