2013-08-08 13 views
7

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" 
+0

Zbyt krótki PS, wydłuż go. – juanpastas

+0

Dzięki @juanpastas, bardzo pomocne. – cortex

+2

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

Odpowiedz

9

Jest to dobry powód, aby utworzyć kolejkę. I będzie:

  • upload plików csv (który powinien być w ciągu 30sek)
  • zadanie tła, które będą importować dane użytkownika (która może przejść przez kilka godzin ...)
  • podczas gdy ta praca jest w toku ty może obsługiwać jakąś stronę WIP ze statusem pracy/procentami/itp.

Sprawdź na przykład https://github.com/resque/resque. Istnieje wiele innych kolejek.

+0

W ten sposób możesz zrobić wiele rzeczy ... takich jak wysyłanie tysięcy wiadomości e-mail, konwersja filmów/obrazów ... Wiele rzeczy. – NilColor

+0

Czy Resque jest w istocie tym samym co Ruby Thread? Czy jestem daleko? http: //www.ruby-doc.org/core-2.1.1/Thread.html –

+0

Nie. To jest kolejka wiadomości (http://en.wikipedia.org/wiki/Message_queue). Sam Resque używa wątków, jasne. Wątek służy do przetwarzania równoległego. Kolejka do przetwarzania asynchronicznego. – NilColor

2

Czy istnieje sposób, aby obsłużyć tego rodzaju problemów?

Wykonaj zadanie w tle. Powinieneś mieć oddzielny proces, który pobiera zadania z kolejki jeden po drugim i przetwarza je. A ponieważ nie działa z żądaniami użytkowników, może wykonywać swoją pracę tak długo, jak to konieczne. Nie potrzebujesz do tego jednorożca, tylko oddzielnego demona.

Powiązane problemy