Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Nginx、Rails和Oauth。上游过早闭合连接_Ruby On Rails_Http_Nginx - Fatal编程技术网

Ruby on rails Nginx、Rails和Oauth。上游过早闭合连接

Ruby on rails Nginx、Rails和Oauth。上游过早闭合连接,ruby-on-rails,http,nginx,Ruby On Rails,Http,Nginx,我有一个奇怪的问题,只有在使用nginx和unicorn时才会出现在生产环境中。当我使用没有nginx的unicorn时,它不会发生 这个问题。我有一个简单的oauth身份验证,允许用户通过GitHub注册。在GitHub的授权页面上按“允许”后,用户将被重定向到回调路由。然后,他/她得到302坏网关错误。 Nginx日志向我显示此错误(键被替换为“…”) 2012/12/26 18:03:08[错误]1467#0:*1上游提前关闭 从上游读取响应头时的连接,客户端: 10.0.2.2,服务器:

我有一个奇怪的问题,只有在使用nginx和unicorn时才会出现在生产环境中。当我使用没有nginx的unicorn时,它不会发生

这个问题。我有一个简单的oauth身份验证,允许用户通过GitHub注册。在GitHub的授权页面上按“允许”后,用户将被重定向到回调路由。然后,他/她得到
302坏网关
错误。 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\u 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配置中,您只需要设置超时超过30秒

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
至少试试

timeout 60

你试过调整keepalive\u超时吗?@EvgeniyRyzhkov,是的,我试过增加它,但没用。日志中也出现了相同的错误。有趣的失败\u超时实际上与上游响应时间无关文档建议使用代理\u连接\u超时和代理\u读取\u超时来控制上游响应时间是否尝试删除或设置默认值?是的,我添加了60秒的代理连接超时和代理读取超时,但同样的事情再次发生感谢您的帮助。在unicorn的配置中将超时更改为60秒修复了错误。虽然完成这个请求需要31秒,但问题是错误,而不是请求太慢,所以我想我们会解决剩下的问题。您是否设法弄清楚为什么需要这么长时间?我偶尔也会看到rails/unicorn/nginx的混合版出现类似的情况……我在Shopify上也面临着同样的问题@evfwcqcg——如果您能够更新导致缓慢请求的原因的答案,那就太好了。缓慢的请求可能来自缓慢的API调用、大量的API调用或独角兽的大量处理。请记住,增加独角兽超时意味着用户必须坐在那里30秒以上。您可能需要将处理(或多次调用)移动到后台作业。
timeout 60