这些服务器上配置了 django、gunicorn、supervisor 和 nginx,流量非常大。但很多时候我都会看到 502 错误。所以我检查了 nginx 日志以查看错误是什么,记录的内容如下:
[错误] 2388#0: *208027 connect() 到 unix:/tmp/gunicorn-ourapp.socket 失败 (11: 资源暂时不可用) 连接到上游时
有人能帮忙调试导致这种情况发生的原因吗?
这是我们的 nginx 配置:
sendfile on;
tcp_nopush on;
tcp_nodelay off;
listen 80 default_server;
server_name imp.ourapp.com;
access_log /mnt/ebs/nginx-log/ourapp-access.log;
error_log /mnt/ebs/nginx-log/ourapp-error.log;
charset utf-8;
keepalive_timeout 60;
client_max_body_size 8m;
gzip_types text/plain text/xml text/css application/javascript application/x-javascript application/json;
location / {
proxy_pass http://unix:/tmp/gunicorn-ourapp.socket;
proxy_pass_request_headers on;
proxy_read_timeout 600s;
proxy_connect_timeout 600s;
proxy_redirect http://localhost/ http://imp.ourapp.com/;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $my_scheme;
#proxy_set_header X-Forwarded-Ssl $my_ssl;
}
我们已将 Django 配置为在 Gunicorn 中作为通用 WSGI 应用程序运行。Supervisord 用于启动 gunicorn 工作程序:
主页/用户/virtenv/bin/python2.7 /home/user/virtenv/bin/gunicorn --config /home/user/shared/etc/gunicorn.conf.py daggr.wsgi:应用程序
gunicorn.conf.py 如下所示:
import multiprocessing
bind = 'unix:/tmp/gunicorn-ourapp.socket'
workers = multiprocessing.cpu_count() * 3 + 1
timeout = 600
graceful_timeout = 40
有人知道我应该从哪里开始挖掘以查看可能导致问题的原因吗?
这是我的 ulimit -a 在服务器上的输出:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 59481
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 50000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
答案1
我通过将 128 修改为 20000 解决了这个问题/proc/sys/net/core/somaxconn
。这允许更大的流量突发。我可能不需要将其设置得这么高,但这个应用程序可能会爆发非常高。我也在使用 gunicorn 和 nginx。
答案2
就我而言,此错误是由于我的 gunicorn 配置造成的:
worker_class =“同步”
我使用以下方法修复了此问题:
worker_class = "gevent" # "同步"
答案3
我可以通过这个例子重现这个问题:https://github.com/pawl/somaxconn_test
增加net.core.somaxconn
最终可以修复它。
如果它不是 docker 容器,你可以使用 来执行此操作sysctl -w net.core.somaxconn=<your value>
。如果它是 docker 容器,你可以使用此标志:--sysctl net.core.somaxconn=1024
答案4
这听起来像是因为所有 gunicorn 工作者都在使用中。我会暂时打开 gunicorn 中的登录。请参阅在此处记录设置。这应该可以让你看到 gunicorn 工作者的状态以及为什么在 502 发生时无法建立新的连接。