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