Welcome! Log In Create A New Profile

Advanced

Nginx + proxy_cache + ssi

July 04, 2011 11:48AM
Всем привет!
Вопрос возможно глупый, и я не совсем понимаю что делаю, но тем не менее прошу помощи комьюнити.
В данный момент пытаюсь разобраться с кешированием динамического контента в бекенде при помощи 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>



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

Nginx + proxy_cache + ssi

sergeyarl July 04, 2011 11:48AM

Re: Nginx + proxy_cache + ssi

Maxim Dounin July 11, 2011 09:02AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 302
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready