我有一个奇怪的问题,只有在我使用 nginx 和 unicorn 时才会出现在生产环境中。当我在没有 nginx 的情况下使用独角兽时,它不会发生。
问题。我有一个简单的 oauth 身份验证,允许用户通过 GitHub 注册。在 GitHub 的授权页面上按“允许”后,用户将被重定向到回调路由。然后,他/她得到302 Bad Gateway
错误。Nginx 日志向我显示此错误(键被替换为“...”)
2012/12/26 18:03:08 [错误] 1467#0: *1 上游过早关闭连接,同时从上游读取响应标头,客户端:10.0.2.2,服务器:_,请求:“GET /auth/github/callback ?code=&state=... HTTP/1.1", 上游: "http://unix:/tmp/unicorn.tm.sock:/auth/github/callback?code=...&state=...",主机:“本地主机:3000”
这是我的 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
独角兽配置
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