【发布时间】:2015-04-14 11:54:20
【问题描述】:
我在远程服务器中有两个 Rails 应用程序(生产环境和暂存环境)。
我目前遇到一个奇怪的问题,在我完成部署(通过 cap 部署)后,Puma 会有时让我超时。这种情况已经发生了一段时间,而且越来越频繁。每当发生这种情况时,我都需要重新启动 Puma 服务器(从cap puma:stop 和cap puma:start),或者手动执行kill -9 <pid of puma instance>。但是,在这两种情况下,我都需要首先从shared/tmp/sockets 目录中rm puma.sock。
另一方面,我的生产环境没有遇到这个问题。它们之间的区别只是 # 提交,我的暂存环境是几个(约 50 次)提交。早些时候,当我将登台合并到生产并部署时,同样的问题出现在生产中。所以我将我的产品回滚到以前的版本,重新启动 Puma,问题就消失了。
注意:cap puma:restart 无法解决这个问题;我必须杀死当前的 Puma 实例,并启动一个新实例才能解决此问题。
我目前的设置是:
- Rails 4.1
- 彪马
- Nginx
- Capistrano 3
发生错误时,Rails 日志中没有任何记录,但 Nginx 记录了一些错误:
-
upstream timed out (110: Connection timed out) while reading response header from upstream等待 60 秒后,显示 500 的页面。 -
recv() failed (104: Connection reset by peer) while reading response header from upstream立即显示 500 个页面。 -
connect() to unix:/var/deploy/medictrust-staging/shared/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream立即显示 500 个页面。
上述错误是随机发生的;有时连接超时,有时连接被拒绝。但最常见的是连接超时。
奇怪的是,如果我通过 cURL 访问我的应用程序,Puma 不会超时。 Puma 或 Nginx 配置中没有进行任何更改,那么这可能是由应用程序代码引起的吗?
如何让这个问题永远消失?
【问题讨论】:
-
你有想过这个吗?我正在处理类似的事情,但仅在我的生产环境中。 xkcd.com/979
-
嘿@steel,如果我没记错的话,Web 服务器正在超时,因为整个数据库中都有长时间运行(阅读:卡住)的查询。可用的数据库池已用尽,Puma 一直在等待卡住的查询完成。要检查我的问题是否与您的问题相似,只需登录到您的生产数据库并运行
SHOW FULL PROCESSLIST。这是一个对我有帮助的答案:stackoverflow.com/a/15252722/1266558
标签: ruby-on-rails nginx capistrano puma