Re: Часть запросов с анамольно большим $request time
Hello! On Wed, May 04, 2016 at 11:58:17AM -0400, malaf wrote: > Добрый день. > > Есть такая конфигурация: > - фронтенд c nginx > - бэкенды с php > - для динамических запросов настроено php fastcgi между nginx и php-fpm > через tcp порт с кешированием ответов > - log_format выглядит примерно так- '$remote_addr # $upstream_addr # > $request # $status # $uri # $upstream_response_time # $upstream_cache_status > # $request_time > - проект высоконагруженный > > Столкнулся с такой проблемой, судя по логам, то часть запросов имеет > существенно большее значение $request_time чем $upstream_response_time, > может быть больше как на 1 секунду так и 2, 5 и даже более 30. Особенно это > заметно на страницах из кеша, у которых upstream_cache_status = HIT, > upstream_response_time = 0 и c большим request_time, хотя для подавляющего > большинства этот параметр имеет значение 0-0.01s > > Влияние "медленных клиентов" на значение $request_time вроде отсёк, проверив > лог после обращения к странице в кеше с помощью curl --limit-rate 20K > example.com > /dev/null, время ответа было 4 секунды, в лог request_time > записался со значение 0. Использование "curl --limit-rate" для эмуляции медленных клиентов - более или менее работает только в том случае, если размер ответа превышает суммарный размер всех буферов в цепочке. Если в $request_time записалось значение 0 - это хороший признак, что ответ полностью влез в буфера, и с точки зрения nginx'а клиент - быстрее не бывает. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Часть запросов с анамольно большим $request time
Добрый день. Есть такая конфигурация: - фронтенд c nginx - бэкенды с php - для динамических запросов настроено php fastcgi между nginx и php-fpm через tcp порт с кешированием ответов - log_format выглядит примерно так- '$remote_addr # $upstream_addr # $request # $status # $uri # $upstream_response_time # $upstream_cache_status # $request_time - проект высоконагруженный Столкнулся с такой проблемой, судя по логам, то часть запросов имеет существенно большее значение $request_time чем $upstream_response_time, может быть больше как на 1 секунду так и 2, 5 и даже более 30. Особенно это заметно на страницах из кеша, у которых upstream_cache_status = HIT, upstream_response_time = 0 и c большим request_time, хотя для подавляющего большинства этот параметр имеет значение 0-0.01s Влияние "медленных клиентов" на значение $request_time вроде отсёк, проверив лог после обращения к странице в кеше с помощью curl --limit-rate 20K example.com > /dev/null, время ответа было 4 секунды, в лог request_time записался со значение 0. Проблема тоже не fastcgi или кеш-менеджере, так как такое же наблюдается и для запросов, которые обрабатываются с помощью nginx+redis через redis_pass. Подскажите, в чём может быть проблема, на что ещё обратить внимание, что проверить? nginx -V nginx version: nginx/1.8.1 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --without-http_memcached_module --without-http_uwsgi_module --without-http_scgi_module --with-http_stub_status_module --add-module=/root/rpmbuild/SOURCES/nginx_modules/ngx_cache_purge --add-module=/root/rpmbuild/SOURCES/nginx_modules/ngx_http_redis --add-module=/root/rpmbuild/SOURCES/nginx_modules/redis2-nginx-module --add-module=/root/rpmbuild/SOURCES/nginx_modules/lua-nginx-module --add-module=/root/rpmbuild/SOURCES/nginx_modules/ngx_devel_kit --add-module=/root/rpmbuild/SOURCES/nginx_modules/set-misc-nginx-module --with-file-aio --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' Posted at Nginx Forum: https://forum.nginx.org/read.php?21,266619,266619#msg-266619 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: ревалидация кеша fastcgi
> Вы изначально в ответе отдавали заголовки валидаторы (ETag и/ил > Last-Modified)? > Посмотрите на содержимое в папке кеша Nginx, есть ли там заголовки ETag и/ил > Last-Modified, без них ревалидация кеша невозможно. да, спасибо огромное дело оказалось именно в этом! заголовки-то мы отдавали, и у разработчика на машине nginx 1.8.0 и php 5.6 они ставятся нормально, а вот на конфигурации, которая дублирует продакшн nginx 1.9.15 и php 5.4 (fpm, chroot) что-то в приложении эти заголовки упорно снимало. приложение на основе wordpress и там какой-то ад и израиль. пока нашли воркэраунд - заголовки начали ставится и ревалидация заработала. Максим, S.A.N спасибо большое за помощь ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: ревалидация кеша fastcgi
VovansystemS Wrote: --- > >> fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match > if_not_empty; > >> fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since > if_not_empty; > > > > У вас в конфиге написано: установить заголовки If-None-Match и > > If-Modified-Since в запросах к бекенду в полученные от клиента > > значения. Ревалидация кеша в таких условиях работать не может по > > очевидным причинам. > > убрал эти строки. удалил кеш. ристартанул nginx > первая загрузка X-My-Cache: MISS (страницы нет в кеше) > вторая загрузка X-My-Cache: HIT (есть в кеше, получаю закешированную > версию) > жду 10 секунд > третья загрузка X-My-Cache: EXPIRED > > (а я ожидаю X-My-Cache: REVALIDATED ) > Вы изначально в ответе отдавали заголовки валидаторы (ETag и/ил Last-Modified)? Посмотрите на содержимое в папке кеша Nginx, есть ли там заголовки ETag и/ил Last-Modified, без них ревалидация кеша невозможно. Posted at Nginx Forum: https://forum.nginx.org/read.php?21,266607,266612#msg-266612 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: ревалидация кеша fastcgi
>> fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match if_not_empty; >> fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since >> if_not_empty; > > У вас в конфиге написано: установить заголовки If-None-Match и > If-Modified-Since в запросах к бекенду в полученные от клиента > значения. Ревалидация кеша в таких условиях работать не может по > очевидным причинам. убрал эти строки. удалил кеш. ристартанул nginx первая загрузка X-My-Cache: MISS (страницы нет в кеше) вторая загрузка X-My-Cache: HIT (есть в кеше, получаю закешированную версию) жду 10 секунд третья загрузка X-My-Cache: EXPIRED (а я ожидаю X-My-Cache: REVALIDATED ) заголовки запроса браузера: GET /product/name HTTP/1.1 Host: site.com Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 на всякий случай сделал то же самое через curl: curl -i "https://site.com/product/name; и получил точно такой же результат: первая загрузка X-My-Cache: MISS (страницы нет в кеше) вторая загрузка X-My-Cache: HIT (есть в кеше, получаю закешированную версию) жду 10 секунд третья загрузка X-My-Cache: EXPIRED > На бекенде в РНР, отвечайте http_response_code(304); вместо header('HTTP/1.0 304 Not Modified'); так быстрей и правильней. поправил > Судя по конфигу, у вас проблема с куками, если браузер присылает куки сессии, кеш не работает, curl куки не присылает, ответ отдается из кеша. вроде нет, см выше описание поведения curl при стандартном GET бэкэнд сейчас, к слову, выглядит примерно так: http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: ревалидация кеша fastcgi
Hello! On Wed, May 04, 2016 at 02:58:19PM +0300, VovansystemS wrote: > Добрый день, > > пытаюсь настроить ревалидацию страниц сайта в кеше директивой > fastcgi_cache_revalidate on; > ожидаю, что если элемент кеша устарел, то nginx сам сделает запрос к > бекэнду с заголовком If-Modified-Since (как это описано тут > http://whitequark.org/blog/2014/04/05/page-caching-with-nginx/ ), но > этого не происходит. > > при устаревании элемента кеша $upstream_cache_status == EXPIRED и на > бэкэнд уходит стандартный GET без заголовков на ревалидацию при > включённом fastcgi_cache_revalidate on. > > я попробовал задавать fastcgi_cache_revalidate на разных уровнях, на > случай если есть особенности наследования, но всё равно безуспешно. > > если же я делаю > curl -i --header 'If-Modified-Since: Tue, 11 Dec 2015 10:10:24 GMT' > https://site.com > > то получаю X-My-Cache: REVALIDATED - потому что клиентский заголовок > был корректно передан на бэкэнд, который ответил header('HTTP/1.0 304 > Not Modified'); > > вопрос: я не понимаю как должна работать директива и хочу странного > или всё же задачу можно как-то решить? подскажите, пожалуйста. [...] > fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match if_not_empty; > fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since if_not_empty; У вас в конфиге написано: установить заголовки If-None-Match и If-Modified-Since в запросах к бекенду в полученные от клиента значения. Ревалидация кеша в таких условиях работать не может по очевидным причинам. -- Maxim Dounin http://nginx.org/ ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: ревалидация кеша fastcgi
Судя по конфигу, у вас проблема с куками, если браузер присылает куки сессии, кеш не работает, curl куки не присылает, ответ отдается из кеша. Убери из конфига fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match if_not_empty; fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since if_not_empty; Они не нужны На бекенде в РНР, отвечайте http_response_code(304); вместо header('HTTP/1.0 304 Not Modified'); так быстрей и правильней. Posted at Nginx Forum: https://forum.nginx.org/read.php?21,266607,266608#msg-266608 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
ревалидация кеша fastcgi
Добрый день, пытаюсь настроить ревалидацию страниц сайта в кеше директивой fastcgi_cache_revalidate on; ожидаю, что если элемент кеша устарел, то nginx сам сделает запрос к бекэнду с заголовком If-Modified-Since (как это описано тут http://whitequark.org/blog/2014/04/05/page-caching-with-nginx/ ), но этого не происходит. при устаревании элемента кеша $upstream_cache_status == EXPIRED и на бэкэнд уходит стандартный GET без заголовков на ревалидацию при включённом fastcgi_cache_revalidate on. я попробовал задавать fastcgi_cache_revalidate на разных уровнях, на случай если есть особенности наследования, но всё равно безуспешно. если же я делаю curl -i --header 'If-Modified-Since: Tue, 11 Dec 2015 10:10:24 GMT' https://site.com то получаю X-My-Cache: REVALIDATED - потому что клиентский заголовок был корректно передан на бэкэнд, который ответил header('HTTP/1.0 304 Not Modified'); вопрос: я не понимаю как должна работать директива и хочу странного или всё же задачу можно как-то решить? подскажите, пожалуйста. конфиг: fastcgi_cache_path /tmp/MAIN levels=1:2 keys_zone=MAIN:64m max_size=768m inactive=24h; server { listen ***:443 ssl; server_name site.com; ssl on; ssl_certificate /etc/nginx/ssl/certs-mcg/site_co_uk.pem; ssl_certificate_key /etc/nginx/ssl/certs-mcg/site_co_uk.key; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; error_log /home/site/logs/site-ssl.error.log error; access_log /home/site/logs/site-ssl.access.log wtimes; root /www/site/domains/site.com/public_html/; set $sock 127.0.0.1:9001; include fastcgi_params; fastcgi_index index.php; fastcgi_intercept_errors on; fastcgi_param DOCUMENT_ROOT /public_html; fastcgi_param SCRIPT_FILENAME /public_html$fastcgi_script_name; fastcgi_no_cache $cookie_login $cookie_authautologin $cookie_PHPSESSID; fastcgi_cache_bypass $cookie_login $cookie_authautologin $cookie_PHPSESSID; fastcgi_cache_revalidate on; fastcgi_temp_path /tmp/fcgi 1 2; fastcgi_cache MAIN; fastcgi_cache_key "$scheme|$request_method|$host|$request_uri"; fastcgi_cache_lock on; fastcgi_cache_methods GET HEAD; fastcgi_ignore_headers "Cache-Control" "Expires"; fastcgi_cache_valid 10s; add_header X-My-Cache $upstream_cache_status; fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match if_not_empty; fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since if_not_empty; index index.html index.php; location / { fastcgi_cache_revalidate on; try_files $uri $uri/ /index.php$is_args$args; } location ~* "^/wp-admin(/.*$|/$|$)" { fastcgi_cache off; try_files $fastcgi_script_name =404; fastcgi_pass $sock; add_header X-My-Cache-admin $upstream_cache_status; } location ~* "^/cart(/.*$|/$|$)" { fastcgi_cache off; try_files $fastcgi_script_name =404; fastcgi_pass $sock; add_header X-My-Cache-cart $upstream_cache_status; } location ~* \.php$ { fastcgi_cache_revalidate on; try_files $fastcgi_script_name =404; fastcgi_pass $sock; } # Static files location 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 version: nginx/1.9.15 (из официального репозитория) PHP 5.4.45-1~dotdeb+7.1 Debian GNU/Linux 7 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru