ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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


 




Copyright © Lexa Software, 1996-2009.