Ho un'applicazione Rails (v3.2.13, Ruby 2.0.0) in esecuzione su nginx + Unicorn (Ubuntu 12.04). Tutto funziona bene, tranne quando un utente amministratore sta caricando utenti (migliaia) tramite un file CVS. Il problema è che ho impostato il timeout a 30 secondi e il processo di importazione richiede molto più tempo. Quindi, dopo 30 secondi ricevo una pagina di Bad Gateway nginx 502 (l'operatore Unicorn viene ucciso).Come configurare nginx + Unicorn per evitare errori di timeout?
La soluzione ovvia è aumentare il timeout, ma non lo voglio perché causerà un altro problema (credo), perché non è un comportamento tipico.
C'è un modo per gestire questo tipo di problemi?
Grazie mille in anticipo.
PS: Forse una soluzione è modificare il codice. In tal caso, voglio evitare all'utente di eseguire un'altra richiesta.
Alcune idee (non so se è possibile):
- impostare un lavoratore dedicato a questa richiesta.
- Invia un segnale "work in progress" a Unicorn per evitare di essere ucciso.
nginx-app.conf
upstream xxx {
server unix:/tmp/xxx.socket fail_timeout=0;
}
server {
listen 80;
...
location/{
proxy_pass http://xxx;
proxy_redirect off;
...
proxy_connect_timeout 360;
proxy_send_timeout 360;
proxy_read_timeout 360;
}
}
unicorn.rb
worker_processes 2
listen "/tmp/xxx.socket"
timeout 30
pid "/tmp/unicorn.xxx.pid"
PS troppo corto, si prega di allungarlo. – juanpastas
Grazie @juanpastas, molto utile. – cortex
Solo una nota. I valori di 'proxy_connect_timeout',' proxy_send_timeout', 'proxy_read_timeout' sono anormali. Per favore, leggi la documentazione, probabilmente non capisci il loro significato. E 'fail_timeout = 0' è assolutamente privo di significato. – VBart