Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: как лучше управлять кешированием fastcgi_cache
- To: nginx-ru@xxxxxxxxx
- Subject: Re: как лучше управлять кешированием fastcgi_cache
- From: VovansystemS <vovansystems@xxxxxxxxx>
- Date: Thu, 26 Dec 2013 21:19:13 +0300
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; bh=Fk+cjeUMBW/F4at5FsYvss+TAdtHkFfXHTAKAeQ61ac=; b=PHwFMji5ZiSnpLxZJgRMmJV1QBlyLMcUv2VG3+2AkWqIjO/Jv/c96oz3wRYJZHn7+x n1UoQV5wHMNn7DXb51do5iBws9ofTKLtSPtK3xHaaS1hcwjSBnzVDUW7y5vWHbbMPeHJ hAM3HSBZ1CxtLepNfdXmHHhd3t3eSBeEhe5pQsFKLfrb1VYO2CPWMUf0lpinU8eViNKt 4kmh58mNyF2SmCpLD+AhO6rbFt9ANhdWzhbSMlp8rhASYvATrJDy+Y1DW9IKKhr1v7De FqHgC1R5uARVk40l8stOqOU+4esrfEWl48cEnu4l+ByNekSKIzfBQQQti/KDscscR/AC L6Hw==
- In-reply-to: <20131226154314.GF95113@mdounin.ru>
- References: <CAAwq3jxC+JMsn+hYA21SjZC7O1rpeLPgPs6b6NkVtcM3TAfHZA@mail.gmail.com> <20131226122902.GZ95113@mdounin.ru> <CAAwq3jwqYcZAhNMG=7jRu49dMQH31EnUEdbHH2y8dLQDvW4V3w@mail.gmail.com> <20131226154314.GF95113@mdounin.ru>
> Лучше ещё переделать конфиг так, чтобы 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 mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
|