> Лучше ещё переделать конфиг так, чтобы 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 [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-ru
