2012-12-26 17 views
15

Mam dziwny problem, który pojawia się w środowisku produkcyjnym tylko wtedy, gdy używam nginx i jednorożca. Kiedy używam jednorożca bez nginx, tak się nie dzieje.Nginx, Rails i Oauth. w górę przedwcześnie zamknięte połączenie

Problem. Mam proste uwierzytelnianie oauth, które umożliwia użytkownikom rejestrację za pośrednictwem GitHub. Po naciśnięciu "Pozwól" na stronie autoryzacji GitHub, użytkownik jest przekierowywany na trasę oddzwonienia. A następnie dostaje błąd 302 Bad Gateway. Nginx dziennika pokazuje mi ten błąd (klawisze są wyrazami "...")

2012/12/26 18:03:08 [Błąd] 1467 # 0: * 1 upstream przedwcześnie zamknięty połączenia podczas czytania nagłówek odpowiedzi od klienta, klient: 10.0.2.2, serwer: _, żądanie: "GET/auth/github/kod zwrotny? kod = & stan = ... HTTP/1.1", upstream: "http: // unix : /tmp/unicorn.tm.sock:/auth/github/callback code = ... & stan = ... ", host: "localhost: 3000"

Ther to moja konfiguracja nginx.

upstream unicorn { 
    server unix:/tmp/unicorn.tm.sock fail_timeout=0; 
} 

server { 
    listen 80 default deferred; 

    client_max_body_size 4G; 
    server_name _; 

    keepalive_timeout 75s; 

    proxy_connect_timeout 60s; 
    proxy_read_timeout 60s; 


    root /vagrant/public; 

    try_files $uri/index.html $uri.html $uri @app; 

    location @app { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 

    proxy_redirect off; 

    proxy_pass http://unicorn; 

    proxy_buffer_size 16k; 
    proxy_busy_buffers_size 16k; 
    } 

    error_page 500 502 503 504 /500.html; 
} 

Moje pytanie brzmi: dlaczego tak się dzieje i czy istnieje jakaś poprawka?

Od jakiegoś czasu googlowałem, ale bez powodzenia.

aktualizacja

Dzięki za komentarz, właśnie próbował ustawić fail_timeout=30s i to nie pomaga, jednak prośba trwa około 40s, aby zakończyć. Ale i tak dzięki, spróbuję przejść na emeryturę z tymi parametrami.

Zaktualizowałem nieco swoją konfigurację, zgodnie z sugestiami, ale nadal otrzymuję ten sam błąd.

Jest to również dziennik błędów jednorożca. Wygląda na to, że zabija wniosek, który trwa dłużej niż 30s, ale myślę, przekierowanie ze strony OAuth nie może być ewentualnie tak długo ...

(github) Request phase initiated. 
(github) Callback phase initiated. 
E, [2012-12-26T19:33:13.058183 #6002] ERROR -- : worker=0 PID:6005 timeout (31s > 30s), killing 
E, [2012-12-26T19:33:13.067011 #6002] ERROR -- : reaped #<Process::Status: pid 6005 SIGKILL (signal 9)> worker=0 
I, [2012-12-26T19:33:13.067198 #6002] INFO -- : worker=0 spawning... 
I, [2012-12-26T19:33:13.068631 #6012] INFO -- : worker=0 spawned pid=6012 
I, [2012-12-26T19:33:13.068726 #6012] INFO -- : Refreshing Gem list 
I, [2012-12-26T19:33:17.140948 #6012] INFO -- : worker=0 ready 

jednorożec config

rails_env = ENV['RAILS_ENV'] || 'production' 

worker_processes 1 

listen "/tmp/unicorn.tm.sock", :backlog => 64 
listen 8080, :tcp_nopush => true 

timeout 30 

pid "/tmp/unicorn.pid" 

stderr_path "/tmp/unicorn.log" 
stdout_path "/tmp/unicorn.log" 

check_client_connection false 
+0

Czy próbowałeś dostosować keepalive_timeout? –

+1

@EvgeniyRyzhkov, tak, próbowałem go zwiększyć, ale to nie pomogło. Ten sam błąd pojawia się w dzienniku. – evfwcqcg

+0

Interesujący fail_timeout właściwie nic wspólnego z czasem odpowiedzi na odpowiedź http://wiki.nginx.org/HttpUpstreamModule#server dokumentacja sugeruje użycie proxy_connect_timeout i proxy_read_timeout do kontrolowania czasu odpowiedzi w górę strumienia –

Odpowiedz

23
ERROR -- : worker=0 PID:6005 timeout (31s > 30s), killing 

Jest rzeczą oczywistą, że ciebie wystarczy skonfigurować limit czasu na więcej niż 30 w konfiguracji jednorożca:

Wypróbuj przynajmniej

timeout 60 

http://unicorn.bogomips.org/Unicorn/Configurator.html#method-i-timeout

+1

Dziękuję za pomoc. Zmiana limitu czasu do lat 60 w konfiguracji jednorożca naprawiła błąd. Podanie tej prośby trwa dokładnie 31 sekund, ale pytanie dotyczyło błędu, a nie powolnego żądania, więc myślę, że wymyślę resztę problemu. – evfwcqcg

+1

udało Ci się dowiedzieć, dlaczego trwa to tak długo? Poza tym widzę coś podobnego z naszym zestawem szyn/unicorn/nginx mix ... – gingerlime

+0

Mam do czynienia z tym samym problemem z Shopify. @evfwcqcg - będzie świetny, jeśli będziesz mógł zaktualizować odpowiedź na pytanie, co spowodowało powolne żądanie. – rohitmishra

Powiązane problemy