Jak wyłączyć limit czasu dla Nginx?

47

Na lokalnej maszynie programistycznej mam odwrotne proxy nginx, takie jak:

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;
}

Jednak jeśli debuguję aplikację, odpowiedź może zostać opóźniona na nieskończony czas, ale po 30 sekundach otrzymuję:

504 Gateway Time-out

w odpowiedzi.

Jak mogę wyłączyć limit czasu i pozwolić, aby mój zwrotny serwer proxy czekał wiecznie na odpowiedź? I podoba mi się, że ustawienie ma charakter globalny, więc nie muszę go ustawiać dla każdego serwera proxy.

k0pernikus
źródło
1
Rozważ rozpoczęcie zadania w tle i umożliwienie użytkownikowi sprawdzenia jego statusu później.
Michael Hampton

Odpowiedzi:

61

Wyłączenie go może być w ogóle niemożliwe, ale wykonalnym obejściem jest zwiększenie czasu wykonywania. Na stronie z samouczkami nginx napisano:

Jeśli chcesz zwiększyć limit czasu dla wszystkich witryn na swoim serwerze, możesz edytować nginx.confplik główny :

vim /etc/nginx/nginx.conf

Dodaj następujące w sekcji http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

i ponownie załaduj konfigurację nginx:

sudo service nginx reload

Użyłem dość dużej wartości, która jest mało prawdopodobna, tj. 999999Lub przy użyciu jednostek czasu , do jednego dnia 1d.

Uwaga: ustawienie tej wartości 0spowoduje natychmiastowy błąd przekroczenia limitu czasu bramy.

k0pernikus
źródło
3
Drogi losowy downvoter, komentarz na temat tego, co jest złe w tej praktyce, byłby miły.
k0pernikus
7
@kb. To zabawne, że jestem OP i właśnie opublikowałem najbardziej wykonalne obejście w odpowiedzi, czekając na prawdziwe rozwiązanie ^^
k0pernikus 17.10.16
2
Haha, całkowicie tęskniłem za tym, że byłeś OP. Ale twoja odpowiedź jest prawidłowa, możesz jeszcze bardziej wyjaśnić (dla przyszłych pracowników Google takich jak ja), że nie ma sposobu, aby ją wyłączyć. =)
kb.
5
Dzięki za informację o 0niedziałaniu! Pamiętaj, że możesz określić jednostki czasu z czytelnymi przyrostkami , abyś mógł użyć wartości takiej jak 1d.
Prawdziwe nazwisko zredagowano
3
Dodałem zarówno to, jak i proxy_connect_timeout 600;plik nginx.conf, ale limit czasu nadal wynosi 60 sekund. Coś jeszcze powinienem spróbować?
andreszs
9

Jeśli używasz AWS i modułu równoważenia obciążenia, powinieneś edytować limit czasu bezczynności. Myślę, że domyślnie jest to 60 sekund

szeljic
źródło
Rozumiem, dlaczego zostało to odrzucone, ale być może, jeśli odpowiedź zostanie zaktualizowana w celu wyjaśnienia jej przypadku użycia, będzie bardziej przydatna. Chociaż nie idzie to na odpowiedź na OP, warto zastanowić się, czy używasz ELB, ponieważ istnieje limit czasu, przez który utrzymają one również otwarte połączenie.
doz87
@ doz87 tak, to tylko coś do rozważenia
szeljic
Naprawdę warto to sprawdzić, szczególnie w moim przypadku, że praca z Magento w ramach AWS. Dobry punkt @szeljic
vnpnlz
Dzięki bracie, to działa dla mnie, ponieważ używam modułu równoważenia obciążenia AWS do dystrybucji do mojej instancji EC2
Vũ Thành Tâm
Zasługuje to na wszystkie pozytywne głosy - wszyscy użytkownicy AWS będą nadal ograniczeni do 60 sekund bez względu na ich ustawienia NGINX bez tego
Aphire
4

Walczyłem z błędem przekroczenia limitu czasu nginx 502 i nie mogłem rozwiązać problemu. Jednak zdarzało się, że był gunicorn, powodując błąd przekroczenia limitu czasu. Może być więc konieczne sprawdzenie ustawień fastcgi.

Dla gunicorn to:

gunicorn wsgi:application --timeout 300
Kostyantyn
źródło