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