Mam aplikację Rails (v3.2.13, Ruby 2.0.0) działającą na nginx + Unicorn (Ubuntu 12.04). Wszystko działa dobrze, z wyjątkiem sytuacji, gdy użytkownik admin przesyła użytkowników (tysiące) za pośrednictwem pliku CVS. Problem polega na tym, że ustawiłem limit czasu na 30 sekund, a proces importowania zajmuje znacznie więcej czasu. Tak więc, po 30 sekundach otrzymuję stronę z błędną bramką nginx 502 (robot Unicorn zostaje zabity).Jak skonfigurować nginx + Unicorn, aby uniknąć błędów przekroczenia limitu czasu?
Oczywistym rozwiązaniem jest zwiększenie limitu czasu, ale nie chcę tego, ponieważ spowoduje to inne problemy (chyba), ponieważ nie jest to typowe zachowanie.
Czy istnieje sposób radzenia sobie z tego rodzaju problemami?
Dziękuję bardzo z góry.
PS: Może rozwiązaniem jest zmodyfikowanie kodu. Jeśli tak, chcę, aby użytkownik nie wykonał innego żądania.
Niektóre pomysły (nie wiem czy to możliwe):
- skonfigurować pracownik dedykowany do tego wniosku.
- Wyślij sygnał "praca w toku" do jednorożca, aby uniknąć zabicia.
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"
Zbyt krótki PS, wydłuż go. – juanpastas
Dzięki @juanpastas, bardzo pomocne. – cortex
Wystarczy notatkę. Wartości 'proxy_connect_timeout',' proxy_send_timeout', 'proxy_read_timeout' są nienormalnie duże. Proszę przeczytać dokumentację, prawdopodobnie nie rozumiesz ich znaczenia. A 'fail_timeout = 0' jest całkowicie bez znaczenia. – VBart