Nginx, Rails и Oauth. восходящее, преждевременно закрытое соединение

У меня есть странная проблема, которая появляется в рабочей среде только тогда, когда я использую nginx и unicorn. Когда я использую единорог без nginx, этого не происходит.

Проблема. У меня есть простая аутентификация oauth, которая позволяет пользователям регистрироваться через GitHub. После нажатия "разрешить" на странице авторизации GitHub пользователь перенаправляется на маршрут обратного вызова. И затем он получает ошибку 302 Bad Gateway. Журнал Nginx показывает мне эту ошибку (ключи заменяются на "..." )

2012/12/26 18:03:08 [ошибка] 1467 # 0: * 1 вверх по течению преждевременно закрыта соединение при чтении заголовка ответа вверх, клиент: 10.0.2.2, server: _, request: "GET/auth/github/callback? Code = & state =... HTTP/1.1", вверх по течению: "HTTP://Unix:/tmp/unicorn.tm.sock:/авт/GitHub/обратный вызов код =... & состояние =...", host: "localhost: 3000"

Ther - моя конфигурация 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;
}

Итак, мой вопрос, почему это происходит и есть ли какое-либо возможное исправление для него?

Я искал его на некоторое время, но без везения.

Обновление

Спасибо за комментарий, я только что попытался установить fail_timeout=30s, и он действительно помогает, однако запрос занимает около 40 секунд. Но в любом случае спасибо, я постараюсь с этим параметром устаревать.

Я обновил свою конфигурацию немного, согласно предложениям, но все же получаю ту же ошибку.

Кроме того, это журнал ошибок единорога. Похоже, что он убивает запрос, который занимает больше 30 секунд, но я предполагаю, что перенаправление с сайта oauth не может быть таким длинным...

(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

unicorn 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

Ответы

Ответ 1

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

Само собой разумеется, что вам просто нужно настроить тайм-аут более 30 в конфигурации unicorn

Попробуйте как минимум

timeout 60

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