Nginx + proxy_cache + ssi

sergeyarl nginx-forum на nginx.us
Пн Июл 4 19:48:53 MSD 2011


Всем привет!
Вопрос возможно глупый, и я не совсем
понимаю что делаю, но тем не менее прошу
помощи комьюнити.
В данный момент пытаюсь разобраться с
кешированием динамического контента в
бекенде при помощи nginx. Т.е. proxy_cache и все
что с этим связанно.
Цель в принципе тривиальная - всем
пользователям отдавать кешированную
страницу, а тем, у кого установлена
специальная кука отдавать уже контент
напрямую с бекенда (в моем случае apache +
php).
Но есть одно но - куку нужно
устанавливать с той же страницы,
которую собираюсь кешировать. Т.е.
нужно кешировать все, кроме блока на
странице, который управляет установкой
куки. Поискал на просторах интернета и
нашел, что подобное можно сделать при
помощи ssi в nginx. Т.е. блок, который мне не
нужно кешировать предлагают вывести в
отдельный инклуд, а в основном файле
сделать на него ссылку вида:
<!--# include virtual="/link/" -->

Собственно это я и пытаюсь сделать у
себя на тестовом стенде. Разбил
страницу на два файла - один - index.php -
страница которую нужно кешировать,
второй - cookie.php - шапка страницы,
содержащая интерфейс установки куки
(TestCookie ).

Пока в nginx не включено кеширование
инклуд работает, отправляет запросы в
бекенд и я вижу контент в браузере. Как
только включаю кеширование в nginx - то в
браузере получаю пустую страницу, а в
логе nginx следующее:
2011/07/03 04:22:48 [alert] 2420#0: *3 http request count is zero,
client: 192.168.1.2, server: , request: "GET / HTTP/1.1", subrequest:
"/cookie.php", host: "192.168.1.4", referrer: "http://192.168.1.4/"

В чем дело, не понимаю. Привожу
собственно содержимое конфига nginx и
самих кскриптов.

nginx.conf:

user                              www-data www-data;
worker_processes                  2;
worker_rlimit_nofile 		  100000;

error_log                         /var/log/nginx/error.log;
pid                               /var/run/nginx.pid;

events {
    worker_connections            1024;
    use                           epoll;    
}

http {
    include                       /etc/nginx/mime.types;
    access_log	                  /var/log/nginx/access.log;

    client_header_timeout         3m;
    client_body_timeout           3m;
    send_timeout                  3m;

    client_header_buffer_size     1k;
    large_client_header_buffers   4 4k;

    gzip                          on;
    gzip_min_length               1100;
    gzip_buffers                  4 8k;
    gzip_types                    text/plain;
    gzip_disable                  "MSIE [1-6]\.(?!.*SV1)";

    output_buffers                1 32k;
    postpone_output               1460;

    sendfile                      on;
    tcp_nopush                    on;
    tcp_nodelay                   on;

    server_names_hash_bucket_size 64;    

    proxy_cache_path /var/lib/nginx/cache levels=
keys_zone=proxycache:32m max_size=200m inactive=1d;

    server {
        listen				80;
	ssi				on;
	
        location / {
		proxy_pass            	http://127.0.0.1:8080;

		proxy_cache		proxycache;
		proxy_hide_header 	"Set-Cookie";
		proxy_pass_header 	"Cookie";
		proxy_ignore_headers 	"Cache-Control" "Expires";
		proxy_cache_valid 	200 301 302 304 5m;

		proxy_cache_key
	"$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
		include               	/etc/nginx/proxy.nginx.conf;

		if ( $http_cookie ~* TestCookie ) { return 412; }

		error_page 412 		= @backend;
        }

	location @backend {
		proxy_pass		http://127.0.0.1:8080;
		include			/etc/nginx/proxy.nginx.conf;
	}
    }
}


index.php:

<!--# include virtual="/cookie.php" -->
<html>
<head></head>
<body>

<form name=cookie method=get action=/>

<input type=checkbox name="cookie" value="place" /> Place cookie<br />
<input type=checkbox name="cookie" value="delete" /> Delete cookie<br
/><br />

<input type=submit value=ok>
</form>
<hr>

<?php
function genRandomString() {
    $length = 10;
    $characters = ’0123456789abcdefghijklmnopqrstuvwxyz’;
    $string = ”;
    for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0,
strlen($characters))]; }
    return $string;
}

$str = genRandomString();
echo "$str <br>";

?>

</body>


cookie.php:

<?php
if ( $_GET ){
        if ( $_GET[cookie] == "place" ){
                setcookie("TestCookie", "Cookie Value", time()+3600);
        }

        if ( $_GET[cookie] == "delete" ){
                setcookie ("TestCookie", "", time() - 3600);
        }
}
?>

Так же вот содержимое кеш-файла,
который появляется в /var/lig/nginx/cache

??N??????Nq??82?
KEY: GET|||192.168.1.4|/
HTTP/1.1 200 OK
Date: Sun, 03 Jul 2011 04:22:47 GMT
Server: Apache/2.2.16
X-Powered-By: PHP/5.3.3-7+squeeze1
Content-Length: 330
Connection: close
Content-Type: text/html; charset=UTF-8

<!--# include virtual="/cookie.php" -->
<html>
<head></head>
<body>

<form name=cookie method=get action=/>

<input type=checkbox name="cookie" value="place" /> Place cookie<br />
<input type=checkbox name="cookie" value="delete" /> Delete cookie<br
/><br />

<input type=submit value=ok>
</form>
<hr>

”sr?mj0?66c <br>
</body>



Буду очень признателен за любую помощь.

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,211937,211937#msg-211937




Подробная информация о списке рассылки nginx-ru