Come disabilitare il timeout per nginx?


47

Su una macchina di sviluppo locale, ho un proxy inverso nginx in questo modo:

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

Tuttavia, se eseguo il debug della mia applicazione, la risposta potrebbe essere ritardata per un periodo di tempo infinito, ma dopo 30 secondi ottengo:

504 Gateway Time-out

come risposta.

Come posso disabilitare il timeout e far attendere per sempre una risposta dal mio proxy inverso? E mi piace che l'impostazione sia globale, quindi non devo impostarla per ciascun proxy.


1
Prendi in considerazione l'avvio di un processo in background e consenti all'utente di verificarne lo stato in un secondo momento.
Michael Hampton

Risposte:


61

Potrebbe non essere possibile disabilitarlo affatto, ma una soluzione alternativa possibile è quella di aumentare i tempi di esecuzione. Su un sito tutorial nginx , è stato scritto:

Se vuoi aumentare il limite di tempo per tutti i siti sul tuo server, puoi modificare il nginx.conffile principale :

vim /etc/nginx/nginx.conf

Aggiungi quanto segue nella sezione http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

e ricaricare la configurazione di nginx:

sudo service nginx reload

Ho usato un valore piuttosto grande che è improbabile che accada, cioè 999999o usando le unità di tempo , per un giorno via 1d.

Fare attenzione che l'impostazione del valore su 0causerà immediatamente un errore di timeout del gateway.


3
Caro downvoter casuale, un commento su ciò che è male di questa pratica sarebbe bello.
k0pernikus,

7
@kb. È divertente perché io sono l'OP e ho appena pubblicato la soluzione più praticabile come risposta, in attesa di una soluzione reale ^^
k0pernikus,

2
Haha, mi mancava completamente che tu fossi OP. Ma la tua risposta è quella corretta, potresti rendere ancora più chiaro (per i futuri googler come me) che non c'è modo di disabilitarlo. =)
kb.

5
Grazie per le informazioni sul 0mancato funzionamento! Nota che puoi specificare unità di tempo con suffissi leggibili , in modo da poter usare un valore simile 1d.
Nome reale redatto il

3
Ho aggiunto sia quello che proxy_connect_timeout 600;il file nginx.conf, ma il timeout è ancora su 60 secondi. Qualcos'altro che dovrei provare?
Andreszs,

9

Se si utilizza AWS e Load Balancer, è necessario modificare il timeout di inattività. Penso che il valore predefinito sia 60 secondi


Capisco perché questo è stato votato in negativo, ma forse se la risposta fosse aggiornata per spiegare il suo caso d'uso, sarebbe più utile. Sebbene ciò non vada a rispondere all'OP, è utile considerare se si utilizza ELB in quanto esiste un limite per quanto tempo manterranno aperta anche una connessione.
doz87,

@ doz87 sì, è solo qualcosa da considerare
szeljic,

Vale davvero la pena di verificare soprattutto sul mio caso che lavorare con Magento con AWS. Buon punto @szeljic
vnpnlz,

Grazie fratello, questo funziona per me dal momento che uso il bilanciamento del carico AWS per la distribuzione alla mia istanza EC2
Vũ Thành Tâm

Questo merita tutti i voti - tutti gli utenti AWS saranno comunque limitati a 60 secondi indipendentemente dalle loro impostazioni NGINX senza questo
Aphire

4

Ho combattuto con errore timeout nginx 502 e non sono riuscito a risolvere il problema. Tuttavia, è accaduto che il gunicorno causasse l'errore di timeout. Quindi potresti anche aver bisogno di controllare le tue impostazioni fastcgi.

Per Gunicorn è:

gunicorn wsgi:application --timeout 300
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.