Как избежать тайм-аута первого байта с помощью nginx

У меня есть приложение в RubyOnRails, проксируемое сервером NGINX, который находится за службой CDN. CDN имеет ограничение: если первый байт ответа не приходит в течение 60 секунд, сервер CDN отвечает:

Ошибка 503, тайм-аут первого байта

Проблема в том, что у меня есть некоторые запросы, обработка которых на стороне Rails занимает более 60 секунд. Есть ли способ взломать ответ, отправив несколько байтов до того, как ответ завершит свою обработку? Как?

Редактировать 1 :

Я знаю, что 60-е - это долгий срок, и мы думаем, как этого избежать. Тем не менее, мне нужно временное решение, которое позволяет работать с запросами 60-х годов. Даже если я использую Ajax, некоторые вызовы ajax займут более 60 секунд и попадут в ту же проблему. Параметры tcp_nopush или tcp_nodelay не работали, я думаю, это потому, что nginx ожидает ответа приложения rails, чтобы узнать, какие заголовки он должен отправить. Так, возможно решение - это то, что мне нужно взломать в цикле запросов / ответов RubyOnRails

2
задан 4 September 2016 в 17:52
1 ответ

Запрос, занимающий более 60 секунд, занимает значительное время. Вы можете просмотреть свое приложение. При такой длительной загрузке страницы из вашего приложения может выйти много посетителей. Вы можете рассмотреть возможность асинхронной загрузки данных, например, с помощью AJAX или веб-сокетов.

Время до первого байта обычно применяется к заголовкам, а не к телу ответа.Клиент должен получать заголовки на ранней стадии. Вы уверены, что это ваш CDN время ожидания запросов? NGinx также будет отключать ваши запросы. Хороший способ проверить это с помощью curl:

curl -I -H "Host: <domain>" http://<ip of proxy>/request/uri 

(Используйте реальный IP-адрес вашего прокси, а не IP-адрес CDN)

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

Если вы не получаете заголовки быстро, попробуйте использовать:

http {
tcp_nopush off; 
tcp_nodelay on; # force socket to send buffer
}

Если вы получаете шлюз ошибка тайм-аута или аналогичная, попробуйте следующие параметры конфигурации:

http {
keepalive_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout    300;
proxy_send_timeout    300;
}
3
ответ дан 3 December 2019 в 10:37

Теги

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