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