Come evitare un timeout del gateway con FastCGI su Nginx


203

Gestisco Django, FastCGI e Nginx. Sto creando una sorta di api in cui qualcuno può inviare alcuni dati tramite XML che elaborerò e quindi restituire alcuni codici di stato per ciascun nodo che è stato inviato.

Il problema è che Nginx genererà un timeout del gateway 504 se impiegherò troppo tempo per elaborare l'XML - penso più di 60 secondi.

Quindi vorrei impostare Nginx in modo che se tutte le richieste corrispondenti alla posizione / api non scadessero per 120 secondi. Quale impostazione lo farà.

Quello che ho finora è:

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

Modifica: quello che ho non funziona :)


7
È possibile impostare i valori di timeout su "2m" anziché "120".
Cenk Alti,

1
Sembra negativo che i dati non vengano trasmessi in streaming ... vale a dire che un server che inizi a rispondere entro 60 secondi o più sembra inaccettabile.
Adam Gent,

Risposte:


245

I timeout proxy sono buoni, per i proxy, non per FastCGI ...

Le direttive che interessano i timeout FastCGI sono client_header_timeout, client_body_timeoutesend_timeout .

Modifica : considerando ciò che si trova sul wiki di nginx, la direttiva send_timeout è responsabile dell'impostazione del timeout generale della risposta (che era un po 'fuorviante). Per FastCGI c'è ciò fastcgi_read_timeoutche sta influenzando il timeout di risposta del processo fastcgi .

HTH.


8
Per chiunque usi uwsgi e abbia questo errore, uwsgi_read_timeout 600; risolto il mio problema.
Homer6

2
La mia domanda qui sarebbe (come amatore dell'amministratore del server) dove posso cambiare? file httpd.conf?
jeffkee,

2
Se aiuta, il mio era su / etc / nginx / sul sistema DV di Media Temple.
jeffkee,

Abdo offre un buon modo per eseguire il debug. Se i problemi persistono, potrebbe essere necessario aumentare la dimensione massima del messaggio client in nginx.conf (client_max_body_size ** M;)
Sam Grondahl,

2
Aumentare l'imho di timeout non è una soluzione adeguata.
JazzCat

24

Per coloro che usano nginx con unicorno e rotaie, molto probabilmente il timeout è nel tuo unicorn.rb file

inserire un timeout di grandi dimensioni in unicorn.rb

timeout 500

se stai ancora riscontrando problemi, prova ad avere fail_timeout = 0 nel tuo upstream in nginx e vedi se questo risolve il tuo problema. Questo è a scopo di debug e potrebbe essere pericoloso in un ambiente di produzione.

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}

3
Penso che la gente abbia votato in downgrade perché si tratta di Django, tuttavia la tua risposta ha risolto il mio problema di timeout del gateway con Rails + Unicorn :)
ZiggyTheHamster

4

Nella httpsezione nginx (/etc/nginx/nginx.conf) aggiungi o modifica:

keepalive_timeout 300s

Nella serversezione nginx (/etc/nginx/sites-available/your-config-file.com) aggiungi queste righe:

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

Nel phpfile nel caso 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) modificare:

request_terminate_timeout = 300

Spero di aiutarti.


Succederebbe qualcosa di "brutto" se cambio il tempo a 10000 secondi?
utdev,

Non succede nulla di male, ma il tuo servizio attende più tempo. Puoi cambiarlo come vuoi.
Jose Carlos Ramos Carmenates,

1

Se usi unicorno.

Guarda topsul tuo server. L'unicorno probabilmente sta usando il 100% della CPU in questo momento. Esistono diverse ragioni per questo problema.

  • Dovresti controllare le tue richieste HTTP, alcune delle quali possono essere molto difficili.

  • Controlla la versione dell'unicorno. Potrebbe essere che lo hai aggiornato di recente e qualcosa non ha funzionato.


0

Nel proxy server impostato in questo modo

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

Nel server php impostato così

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
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.