Jak skonfigurować nginx + Unicorn, aby uniknąć błędów przekroczenia limitu czasu?
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 ładuje użytkowników (tysiące) za pomocą pliku CVS. Problem polega na tym, że ustawiłem limit czasu do 30 sekund, a proces importowania zajmuje znacznie więcej czasu. Tak więc po 30 sekundach otrzymuję stronę nginx 502 Bad Gateway (pracownik Unicorn zostaje zabity).
Oczywistym rozwiązaniem jest zwiększenie limitu czasu, ale nie chcę tego, ponieważ spowoduje to kolejne problemy (chyba), ponieważ nie jest to typowe zachowanie.
Czy istnieje sposób na rozwiązanie tego rodzaju problemów?
Z góry dziękuję.
PS: Może rozwiązaniem jest modyfikacja kodu. Jeśli tak, chcę uniknąć wykonywania przez użytkownika innego żądania.
Niektóre pomysły (nie wiem, jeśli to możliwe):
Skonfiguruj pracownika dedykowanego do tego żądania.Wyślij sygnał „praca w toku” do Unicorn, aby uniknąć śmierci.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"