ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Nginx + proxy_cache + ssi


  • To: nginx-ru@xxxxxxxxx
  • Subject: Nginx + proxy_cache + ssi
  • From: "sergeyarl" <nginx-forum@xxxxxxxx>
  • Date: Mon, 04 Jul 2011 11:48:53 -0400
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mickey.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=6rnCn/tpzWqFmmdxpviNhZCkyGK0HxlFwJqCBGLcyuI=; b=VXvNcVf5stoQFtLK3FCXBplTGjG8TqatTvvsDu6zUxI3sWQtUsybHa6tYH1JKz+OunngnspT96v9bHuV1xSxvSZCuuCElx5VDQdsL00ofibPYDOOVDuO3cScQTZEYNM4;

Всем привет!
Вопрос возможно глупый, и я не совсем
понимаю что делаю, но тем не менее прошу
помощи комьюнити.
В данный момент пытаюсь разобраться с
кешированием динамического контента в
бекенде при помощи 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 mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.