Як відключити тайм-аут для 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

як відповідь.

Як я можу відключити час очікування та змусити мого зворотного проксі вічно чекати відповіді? І мені подобається, щоб налаштування було глобальним, так що мені не доведеться встановлювати його для кожного проксі.


1
Подумайте про початок фонового завдання та дозволити користувачеві перевірити його стан пізніше.
Майкл Хемптон

Відповіді:


61

Це може бути взагалі неможливо відключити, але можливим рішенням є збільшення часу виконання. На сайті підручника nginx було написано:

Якщо ви хочете збільшити часовий ліміт для всіх сайтів вашого сервера, ви можете редагувати основний nginx.confфайл:

vim /etc/nginx/nginx.conf

Додайте наступне в розділ http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

і перезавантажте nginx 'config:

sudo service nginx reload

Я використав досить велике значення, яке навряд чи трапиться, тобто, 999999або використовуючи одиниці часу , за один день через 1d.

Слідкуйте за тим, що встановлення значення значення 0негайно спричинить помилку таймауту шлюзу.


3
Шановний випадковий підручник, коментар щодо поганого в цій практиці був би непоганим.
k0pernikus

7
@kb. Це смішно, бо я ОП, і щойно опублікував найбільш реальне рішення як відповідь, очікуючи на справжнє рішення ^^
k0pernikus

2
Ха-ха, я зовсім пропустив, що ти був ОП. Але ваша відповідь правильна, ви можете зробити це ще більш зрозумілим (для майбутніх гуглерів, як я), що немає можливості її відключити. =)
кб.

5
Дякуємо за інформацію про те, що 0не працює! Зауважте, що ви можете вказати одиниці часу за допомогою читаних суфіксів , щоб ви могли використовувати таке значення 1d.
Справжнє ім’я змінено

3
Я додав і це, і proxy_connect_timeout 600;до файлу nginx.conf, але час очікування все ще становить 60 секунд. Що ще я повинен спробувати?
andreszs

9

Якщо ви використовуєте AWS та Load Balancer, слід змінити час очікування. Я думаю, що за замовчуванням - 60 секунд


Я розумію, чому за це було проголосовано, але, можливо, якщо відповідь буде оновлена, щоб пояснити її використання, було б корисніше. Незважаючи на те, що це не відповідає на оперативну програму, це є корисним для розгляду, якщо ви використовуєте ELB, оскільки існує обмеження часу, коли вони також будуть тримати з'єднання відкритим.
doz87

@ doz87 так, це просто щось для розгляду
szeljic

Це дійсно варто перевірити, особливо в моєму випадку, що робота з Magento в рамках AWS. Хороший момент @szeljic
vnpnlz

Дякую брате, це працює для мене, оскільки я використовую балансир навантаження AWS для розповсюдження в моєму екземплярі EC2
Vũ Thành Tâm

Це заслуговує на всі результати - будь-які користувачі AWS все ще будуть обмежені 60 секундами, незалежно від налаштувань
NGINX,

4

Я боровся з помилкою тайм-аута nginx 502 і не міг вирішити проблему. Однак трапилось, що саме курча викликає помилку тайм-аута. Тому вам може знадобитися перевірити свої швидкі налаштування.

Для рушниці це:

gunicorn wsgi:application --timeout 300
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.