Re: как лучше управлять кешированием fastcgi_cache
VovansystemS
vovansystems at gmail.com
Thu Dec 26 15:14:05 UTC 2013
> Нет. При кешировании заголовки If-Modified-Since и If-None-Match
> на бекенд не передаются (за исключением ревалидации кеша самим
> nginx'ом), так что в ключе их указывать бессмысленно и может
> принести лишь проблемы.
спасибо!
> Если нужна обработка одним и тем же index.php, то в нужных
> location'ах явно указывать SCRIPT_FILENAME.
вынес в отдельные location'ы то, что требует особых параметров
кеширования, а сами настройки кеширования теперь задаются на уровне
server.
> Лучше - по возможности избегать использование if'ов и rewrite'ов.
А вот как убирать слэши в конце URI без rewrite я не смог придумать
(так, чтобы было перенаправление на URI без слэша) - есть ли какое-то
иное решение?
Также не совсем понятно, как избавится от if, когда на то, нужно ли
кешировать (отдавать закешированный) контент, влияет несколько
факторов (есть ли определённая кука ИЛИ метод запроса post ИЛИ есть
аргументы (например)). Возможно ли и стоит ли переписать это на 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/;
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 ($http_cookie ~*
"auth_user|login|comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in")
{
set $no_cache 1;
}
include fastcgi_params;
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|$host|$request_uri";
fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
fastcgi_cache_valid 1h;
fastcgi_cache_valid any 10s;
fastcgi_cache_use_stale updating error timeout invalid_header
http_500; # отдаём устаревший закешированный ответ в этих случаях
rewrite ^/(.*)/$ /$1 redirect; # все ури должны быть без слэша на конце
location / {
try_files $uri /index.php$is_args$args;
}
location ~* "^/(admin|search)((/.*)$|/$)" {
set $no_cache 1;
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