LINUX.ORG.RU

NginX и встроенный perl, обработка заголовков ответа

 ,


0

1

Есть сервер 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__
то в браузер попадает только hello world!, как мне тело страницы из кэша или от apache (если в кэше нет еще) отправить в браузер? и добавить заголовок? типа Last-Modified Sun, 28 Sep 2014 23:39:10 GMT

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.