Как отключить тайм-аут для nginx?

47

На локальной машине разработки у меня есть обратный прокси-сервер nginx, например:

server {
  listen 80;
  server_name myvirtualhost1.local;
  location / {
    proxy_pass http://127.0.0.1:8080;
}

server {
  listen 80;
  server_name myvirtualhost2.local;
  location / {
    proxy_pass http://127.0.0.1:9090;
}

Тем не менее, если я отлаживаю свое приложение, ответ может быть отложен на бесконечное время, но через 30 секунд я получу:

504 Gateway Time-out

в ответ.

Как я могу отключить тайм-аут, и мой обратный прокси-сервер всегда будет ждать ответа? И мне нравится, чтобы настройки были глобальными, поэтому мне не нужно устанавливать их для каждого прокси.

k0pernikus
источник
1
Попробуйте запустить фоновое задание и позволить пользователю проверить его состояние позже.
Майкл Хэмптон

Ответы:

61

Возможно, его вообще не удастся отключить, однако возможный обходной путь - увеличить время выполнения. На учебном сайте nginx было написано:

Если вы хотите увеличить срок для всех сайтов на вашем сервере, вы можете отредактировать основной nginx.confфайл:

vim /etc/nginx/nginx.conf

Добавить следующее в разделе http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

и перезагрузите конфигурацию nginx ':

sudo service nginx reload

Я использовал довольно большое значение, которое вряд ли произойдет, т. Е. 999999Или с использованием единиц времени , до одного дня через 1d.

Имейте в виду, что установка значения сразу 0вызовет ошибку тайм-аута шлюза.

k0pernikus
источник
3
Уважаемый случайный downvoter, комментарий о том, что плохо об этой практике, был бы хорош.
k0pernikus
7
@kb. Забавно, так как я являюсь OP и только что опубликовал самый работоспособный обходной путь в качестве ответа, ожидая реального решения ^^
k0pernikus
2
Ха-ха, я полностью скучал, что ты был ОП. Но ваш ответ правильный, вы могли бы сделать еще более ясным (для будущих гуглеров, таких как я), что его невозможно отключить. =)
кб.
5
Спасибо за информацию о 0не работает! Обратите внимание, что вы можете указать единицы времени с читаемыми суффиксами , чтобы вы могли использовать значение, подобное 1d.
Настоящее имя отредактировано
3
Я добавил это и proxy_connect_timeout 600;в файл nginx.conf, но время ожидания все еще составляет 60 секунд. Что-нибудь еще, что я должен попробовать?
andreszs
9

Если вы используете AWS и балансировщик нагрузки, вам следует изменить время ожидания. Я думаю, что по умолчанию составляет 60 секунд

szeljic
источник
Я понимаю, почему за это проголосовали, но, возможно, если ответ был обновлен, чтобы объяснить его вариант использования, он был бы более полезным. Хотя это и не отвечает на OP, полезно подумать о том, используете ли вы ELB, поскольку существует ограничение на то, как долго они будут держать соединение открытым.
doz87
@ doz87 да, это просто кое-что для рассмотрения
szeljic
Это действительно стоит проверить, особенно в моем случае работы с Magento в рамках AWS. Хороший вопрос @szeljic
vnpnlz
Спасибо, брат, это работает для меня, так как я использую балансировщик нагрузки AWS для распределения в своем экземпляре EC2
Vũ Thành Tâm
Это заслуживает всех положительных отзывов - любые пользователи AWS будут по-прежнему ограничены 60 секундами, независимо от их настроек NGINX, без этого
Aphire
4

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

Для Gunicorn это:

gunicorn wsgi:application --timeout 300
Kostyantyn
источник