как лучше управлять кешированием fastcgi_cache

VovansystemS vovansystems at gmail.com
Thu Dec 26 09:17:16 UTC 2013


Добрый день,

скажите, пожалуйста, каким образом правильнее в nginx 1.5.x + php5-fpm (chroot):

1. выставлять разные параметры кеширования для различных локейшнов,
при использовании CMS на основе kohana (всё реврайтится на index.php)?
сейчас я делаю это через if и $request_uri.

2. Есть ли смысл в ключе кеширования указывать также
"$http_if_modified_since|$http_if_none_match|"? Etag будет одинаковый
для некоторого числа запросов, а вот $http_if_modified_since просто
будет плодить элементы кэша, но работать они будут тогда, когда два
таких запроса придут в одну и ту же секунду?

Сейчас использую примерно вот такой конфиг - как лучше его переписать:

fastcgi_cache_path /run/shm/MAIN levels=1:2 keys_zone=MAIN:64m
max_size=100m inactive=240h;

server {
    listen          80;
    server_name     domain.com;
    charset         utf-8;
    error_log /var/log/nginx/domain.error.log error;
    access_log /var/log/nginx/domain.access.log;

    root /home/user/domain.com/public_html/;

    set $no_cache 0;
    if ($request_method = POST) {
        set $no_cache 1; # не кешируем POST
    }
    if ($https = on) {
        set $no_cache 1; # не кешируем https
    }
    if ($query_string != "") {
        set $no_cache 0; # кешируем страницы с аргументами
    }
    if ($request_uri ~* "^/admin(/?.*)$") {
        set $no_cache 1; # не кешируем админку
    }
    if ($request_uri ~* "^/search/(.*)$") {
        set $no_cache 1; # не кешируем поиск
    }
    # не кешируем, если есть такие куки
    if ($http_cookie ~*
"auth_user|login|comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in")
{
        set $no_cache 1;
    }

    location / {
        rewrite ^/(.*)/$ /$1 redirect; # все ури должны быть без слэша на конце
        try_files $uri /index.php$is_args$args;
    }

    location = /index.php {

        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9001;
        fastcgi_intercept_errors on;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /public_html/index.php;
        fastcgi_param DOCUMENT_ROOT /public_html;
        fastcgi_param KOHANA_ENV production;

        # если $no_cache отличен от нуля, отдаём некешированную страницу
        fastcgi_cache_bypass $no_cache;
        fastcgi_no_cache $no_cache;
        # ревалидируем элемент кэша при помощи условных запросов с
полем заголовка "If-Modified-Since"
        fastcgi_cache_revalidate on;
        fastcgi_temp_path /run/shm/fcgi 1 2;
        fastcgi_cache MAIN;
        fastcgi_cache_key
"$scheme|$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
        fastcgi_ignore_headers  "Cache-Control" "Expires" "Set-Cookie";
        fastcgi_cache_min_uses  1;
        fastcgi_cache_valid  1h;
        fastcgi_cache_valid any 10s;
        fastcgi_cache_use_stale updating error timeout invalid_header
http_500; # отдаём устаревший закешированный ответ в этих случаях

    }

    # все остальные .php файлы
    location ~* \.php$ { return 403; }

    # статика
    location ~*
^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|docx)$
{
        expires 60d;
        access_log off;
    }
}


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