@heinlein

Почему бот Яндекс Маркета не успевает получить ответ от nginx за 150 секунд, даже код 304 Not Modified?

Раз в, примерно, 20 минут на сайт заходит бот Яндекса чтобы скачать свежие прайс-листы или убедиться в том, что они не изменились. Как правило операция завершается успешно, но раз в сутки (время меняется, чаще по ночам) ему не удается получить ответ от сервера за отведенные 150 секунд и он отключается с ошибкой 408 Request Timeout. Причем как правило такие неудачные попытки случаются по две подряд.

В логах nginx при этом в соответствующее ошибкам в админке Маркета время ответ формируется нормально, занимает максимум 30 секунд если архив с прайс-листами не закэширован (пробовал отключить кэширование для директории с прайсами, не помогло), в случае если код ответа 304 -- сервер отвечает моментально.

При этом о том, что какая-то проблема действительно есть, сигнализирует то, что время неудавшейся загрузки в админке бывает на минуту-две раньше, чем время ответа nginx в логах, т.е. видимо что-то серьезно задерживает ответ.

Нагрузка на сервер в те моменты, когда это происходит, обычная (согласно ISPManager), и в целом в течение дня достаточно низкая, перебоев в работе самого сайта тоже нет.

Как это можно дебажить, куда копать?

Настройки nginx, которые могут быть релевантны:

proxy_read_timeout 1600;
proxy_send_timeout 1600;
proxy_connect_timeout 1600;
keepalive_timeout  150;
client_body_timeout 150;
client_header_timeout 150;


Также пробовал следующее, не помогло:
send_timeout 1600;
fastcgi_read_timeout 1600;
proxy_max_temp_file_size 2048m;
proxy_buffers 16 16k;
proxy_buffer_size 16k;
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 3
alekciy
@alekciy
Вёбных дел мастер
А этот файл формирует бекенд? То, что это происходит ночью наталкивает на мысль бэкапах либо других видах сервисных работ. У вас VDS/VPS?
Предлагают добавить такой формат лога в основной конфиг:
log_format  with_time '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" rqt=$request_time urst=$upstream_response_time';

В конфиге сервера задается:
access_log  /путь_до_файла_лога/access.log with_time;

Это позволит видеть время забора клиентом ответа (большое значение - проблема с клиентом/сетью до клиента) и время ответа бэка (большое значение - проблемы на беке). В зависимости от результатов нужно дальше думать куда двигаться.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
копать в сеть
Ответ написан
@vitaly_il1
DevOps Consulting
Как это можно дебажить, куда копать?

При этом о том, что какая-то проблема действительно есть, сигнализирует то, что время неудавшейся загрузки в админке бывает на минуту-две раньше, чем время ответа nginx в логах, т.е. видимо что-то серьезно задерживает ответ.

- а какое время ответа в остальные часы?
- я бы просимулировал запрос самостоятельно, и понаблюдал в это время за nginx и базой данных
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы