Ich habe eine Rails (v3.2.13, Ruby 2.0.0) Anwendung läuft auf Nginx + Unicorn (Ubuntu 12.04). Alles funktioniert gut, außer wenn ein Admin-Benutzer Benutzer (Tausende) über eine CVS-Datei hochlädt. Das Problem ist, dass ich Timeout auf 30 Sekunden eingestellt habe und der Importvorgang viel mehr Zeit benötigt. Also, nach 30 Sekunden bekomme ich eine nginx 502 Bad Gateway Seite (Unicorn Arbeiter wird getötet).Wie konfiguriere ich nginx + Unicorn, um Timeout-Fehler zu vermeiden?
Die offensichtliche Lösung ist, Timeout zu erhöhen, aber ich will das nicht, weil es ein anderes Problem verursachen wird (ich denke), weil es kein typisches Verhalten ist.
Gibt es eine Möglichkeit, mit dieser Art von Problemen umzugehen?
Vielen Dank im Voraus.
PS: Vielleicht ist eine Lösung, den Code zu ändern. Wenn dem so ist, möchte ich vermeiden, dass der Benutzer eine andere Anfrage ausführt.
Einige Ideen (nicht wissen, wenn möglich):
- -Setup ein Arbeiter auf diese Anforderung gewidmet ist.
- Senden Sie ein "work in progress" -Signal an Unicorn, um zu vermeiden, getötet zu werden.
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"
zu kurz PS, bitte länger machen. – juanpastas
Danke @juanpastas, sehr hilfreich. – cortex
Nur eine Anmerkung. Ihre Werte 'proxy_connect_timeout',' proxy_send_timeout', 'proxy_read_timeout' sind ungewöhnlich groß. Bitte lesen Sie die Dokumentation, Sie verstehen ihre Bedeutung wahrscheinlich nicht. Und 'fail_timeout = 0 'ist absolut bedeutungslos. – VBart