Django、gunicorn、supervisor、nginxで構成されたこれらのサーバーで非常に大量のトラフィックを実行します。しかし、多くの場合、502エラーが発生する傾向があります。だから私はnginxログをチェックしてどのエラーを見て、これが記録されているものです:
[エラー] 2388#0:* 208027 unix:/tmp/gunicorn-ourapp.socketへのconnect()は、アップストリームへの接続中に失敗しました(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を汎用のWSGIアプリケーションとしてGunicornで実行するように設定しました。監視プログラムは、gunicornワーカーを起動するために使用されます:
home/user/virtenv/bin/python2.7/home/user/virtenv/bin/gunicorn --config /home/user/shared/etc/gunicorn.conf.py daggr.wsgi:application
これは、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
/proc/sys/net/core/somaxconn
を128から20000に編集することで、この問題を回避できました。これにより、トラフィックのバーストを大きくすることができます。それほど高く設定する必要はなかったかもしれませんが、このアプリケーションは非常に高くバーストする可能性があります。私もgunicornとnginxを使用しています。
私の場合、このエラーは私のgunicorn構成が原因でした:
worker_class = "同期"
私が使用して修正したもの:
worker_class = "gevent"# "sync"
私はこの例でこの問題を再現することができました: https://github.com/pawl/somaxconn_test
net.core.somaxconn
修正しました。
Dockerコンテナでない場合は、sysctl -w net.core.somaxconn=<your value>
。 Dockerコンテナの場合は、次のフラグを使用できます:--sysctl net.core.somaxconn=1024
これは、すべてのGunicornワーカーが使用されているために発生するようです。私は一時的にgunicornのログインをオンにしました。 ロギング設定はこちら を参照してください。これにより、gunicornワーカーの状態と、502が発生したときに新しい接続を確立できない理由を確認できます。