繁体   English   中英

Nginx + unicorn (rails) 经常在 nginx 错误日志中给出“连接被拒绝”

[英]Nginx + unicorn (rails) often gives “Connection refused” in nginx error log

在工作中,我们在铁路上运行一些高流量站点。 我们经常在 nginx 错误日志中遇到以下问题:

2011/05/24 11:20:08 [error] 90248#0: *468577825 connect() to unix:/app_path/production/shared/system/unicorn.sock failed (61: Connection refused) while connecting to upstream

我们的设置是前端服务器上的 nginx(负载平衡),以及我们的 4 个应用服务器上的独角兽。 每个独角兽都有 8 个工人运行。 该设置与 GitHub 使用的设置非常相似。

我们的大部分内容都被缓存了,当请求到达 nginx 时,它会在 memcached 中查找页面,并在可以找到时提供该页面 - 否则请求将转到 rails。

我可以解决上述问题 - 有时 - 通过对服务器上的独角兽进程执行 pkill,然后执行以下操作:

cap production unicorn:check (removing all the pid's)
cap production unicorn:start

你们对我如何调试这个问题有任何线索吗? 当这些问题发生时,我们的数据库服务器上没有任何显着的高负载..

我不认为这对我来说是 nginx 问题,重新启动 nginx 没有帮助。 它似乎是 gunicorn ......避免这种情况的一种快速而肮脏的方法是在系统未使用时回收 gunicorn 实例,例如凌晨 1 点,如果这是可接受的维护 window。 我将 gunicorn 作为一项服务运行,如果被杀死,该服务将恢复,因此 pkill 脚本负责回收/重生:

start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec /var/web/proj/server.sh

我开始怀疑这是否与 memory 分配有关。 我在同一系统上运行了 MongoDB,它为自己保留了所有 memory,但如果其他应用程序需要更多 memory,它应该会产生。

其他值得一试的事情是在运行 gunicorn 时摆脱 eventlet 或其他依赖模块。 uWSGI 也可以用作 gunicorn 的替代品。

某些东西在其中一台服务器上杀死了你的独角兽进程,或者它超时了。 或者您的上游 app_server { } 块中有一个不再有效的旧应用服务器。 Nginx 会不时重试。 默认情况下,如果出现连接错误,则重新尝试另一个上游,因此希望您的客户没有注意到任何事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM