Приветствую! Директива fastcgi_cache_background_update странно ведёт себя при ssi подзапросах. Есть сервис со сложной бизнес логикой, главная страница загружается 1 сек, стек nginx + php-fpm. В ходе оптимизации скорости загрузки было решено вынести генерацию самого долгого куска страницы в отдельный ssi подзапрос и кешировать его на 1 час. Кешированием управляет fastcgi сервер на php с помощью заголовка Cache-Control.
С кеширование проблем нет, nginx успешно кеширует подзапросы /ssi_dev/ и складывает их на диск. Проблемы начинаются когда кеш протухает. Текущее поведение nginx - если есть элемент в кеше, то он успешно отдается(HIT) - если есть элемент в кеше, но он устарел, то клиенту отдаётся устаревшая версия(STALE) и делается подзапрос на прогрев кеша(EXPIRED) Проблема заключается в том, что подзапрос на прогрев кеша выполняется в блокирующем режиме. То есть основной запрос ждёт выполнения подзапроса. Указанная выше проблема не наблюдается, если в кеш класть всю страницу, поведение nginx соответствует документации. Клиенту отдаётся старая версия контента и делается неблокирующий подзапрос на обновление. Конфиг nginx location / { try_files $uri /index_dev.php$is_args$args; } location ~ /ssi_dev/ { access_log /var/log/nginx/access-dev.log ssi; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; ssi on; ssi_silent_errors off; add_header X-Cache $upstream_cache_status; add_header X-Cache-Control $upstream_http_cache_control; add_header X-Expires $upstream_http_expires; fastcgi_cache_methods GET HEAD; fastcgi_cache MY_CACHE; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_hide_header Cache-Control; fastcgi_hide_header Expires; fastcgi_param REQUEST_URI $uri$is_args$args; fastcgi_param SCRIPT_FILENAME $document_root/index_dev.php; fastcgi_cache_key $scheme$request_method$host$uri$is_args$args; internal; } location ~ ^/(index_dev|config)\.php(/|$) { access_log /var/log/nginx/access-dev.log main; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; ssi on; ssi_silent_errors off; add_header X-Cache $upstream_cache_status; add_header X-Cache-Control $upstream_http_cache_control; add_header X-Expires $upstream_http_expires; fastcgi_cache_methods GET HEAD; fastcgi_cache MY_CACHE; fastcgi_cache_min_uses 1; fastcgi_cache_lock on; fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503; fastcgi_cache_background_update on; fastcgi_hide_header Cache-Control; fastcgi_hide_header Expires; fastcgi_param REQUEST_URI $request_uri; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_cache_key $scheme$request_method$host$request_uri$is_args$args; } Вопрос Возможно ли обновлять устаревшие элементы кеша при ssi подзапросах в НЕ блокирующем режиме? Posted at Nginx Forum: https://forum.nginx.org/read.php?2,274136,274136#msg-274136 _______________________________________________ nginx mailing list nginx@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx