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

VovansystemS vovansystems at gmail.com
Thu Dec 26 18:19:13 UTC 2013


> Лучше ещё переделать конфиг так, чтобы fastcgi_cache был включён
> только там, где используется.
>
> Ибо если кеш выключен - это одно, а если он включён, но ему
> сказали bypass / no cache - это немного другое.  В частности, при
> обработке HEAD-запросов, а равно условных запросов будут различия
> (при включённом кеше на бекенд вместо HEAD уйдёт GET, а If-*
> заголовки будут убраны).
интересно, будем иметь в виду

>> А вот как убирать слэши в конце URI без rewrite я не смог придумать [..]
> Такие вещи лучше всего делать внутри приложения, а не на конфигах
> nginx'а.
хорошо, переделаем при возможности

>> Также не совсем понятно, как избавится от if, когда на то, нужно ли
>> кешировать (отдавать закешированный) контент, влияет несколько
>> факторов (есть ли определённая кука ИЛИ метод запроса post ИЛИ есть
>> аргументы (например)). Возможно ли и стоит ли переписать это на map'ы
>> и как это будет выглядеть? Как бы сделали Вы?
>
> И такие вещи лучше всего делать в рамках приложения, возвращая
> корректные значения Cache-Control.
>
> Впрочем, если речь идёт про fastcgi_no_cache /
> fastcgi_cache_bypass, то следует иметь ввиду, что эти директивы
> принимают несколько параметров. [..]
о, действительно, надо ещё раз перечитать документацию по модулю, т.к.
за последние годы появилось много очень удобных и полезных директив, а
я по-инерции продолжаю использовать костыли и воркэраунды от ранних
версий, да ещё и исправленые множество раз, которые содержат
логические ошибки, как показал Валентин.

>> не кешируем POST
> http://nginx.org/r/fastcgi_cache_methods/ru
спасибо!

> Обращаю ваше внимание на то, что вы таким образом разрешаете
> кешировать POST запросы по https с аргументами.  Сомневаюсь,
> что именно такая логика вам была нужна.
действительно, а ведь в одной продакшн системе так и крутится - пойду
исправлять - спасибо!

> Скорее всего вы хотите:
> map $args $empty_args {
>    default  0;
>    ""       1
> }
> fastcgi_no_cache $empty_args $https $cookie_auth_user $cookie_login .. ;
да, именно так и требовалось

в данном же конкретном случае нужно кешировать ответы безотносительно
того, имеет ли запрашиваемая страница аргументы или нет. поэтому
конечный конфиг будет выглядеть как-то так (без map, а на других
проектах оно будет использоваться), но мы будем учитывать те
рекоммендации, которые дал Максим. Всем огромное спасибо, я многое
сегодня понял.

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;
    error_log /var/log/nginx/domain.error.log error;
    access_log /var/log/nginx/domain.access.log;

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

    include fastcgi_params;
    fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME /public_html/index.php;
    fastcgi_param DOCUMENT_ROOT /public_html;
    fastcgi_param KOHANA_ENV production;

    # отдаём некешированную страницу и не помещаем такую страницу в кеш,
    # если значение хотя бы одного из строковых параметров непустое и
не равно "0"
    fastcgi_no_cache $https $cookie_login $cookie_auth_user;
    fastcgi_cache_bypass $https $cookie_login $cookie_auth_user;

    fastcgi_cache_revalidate on;

    fastcgi_temp_path /run/shm/fcgi 1 2;
    fastcgi_cache MAIN;
    fastcgi_cache_key "$scheme|$request_method|$host|$request_uri";

    fastcgi_cache_methods GET HEAD; # Если метод запроса клиента
указан в этой директиве, то ответ будет закэширован
    fastcgi_ignore_headers  "Cache-Control" "Expires" "Set-Cookie";
    fastcgi_cache_valid 20m;
    fastcgi_cache_valid any 10s;
    fastcgi_cache_use_stale updating error timeout invalid_header http_500;

    rewrite ^/(.*)/$ /$1 redirect; # все URI должны быть без слэша на конце

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~* "^/(admin|search)(/.*$|/$)" {
        fastcgi_cache off;
        fastcgi_pass 127.0.0.1:9001;
    }

    location ~* "^/(news|feed)(.*$|/$)" {
        fastcgi_cache_valid 10m;
        fastcgi_pass 127.0.0.1:9001;
    }

    location = /index.php {
        fastcgi_pass 127.0.0.1:9001;
    }

    # все остальные .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