gunicorn + django + nginx unix: // socket fehlgeschlagen (11: Ressource vorübergehend nicht verfügbar)

8

Auf diesen mit Django, Gunicorn, Supervisor und Nginx konfigurierten Servern wird sehr viel Datenverkehr ausgeführt. Aber oft sehe ich 502 Fehler. Also habe ich die Nginx-Protokolle überprüft, um festzustellen, welcher Fehler vorliegt, und dies wird aufgezeichnet:

[Fehler] 2388 # 0: * 208027 connect () to unix: /tmp/gunicorn-ourapp.socket fehlgeschlagen (11: Ressource vorübergehend nicht verfügbar) beim Herstellen einer Verbindung zum Upstream

Kann jemand beim Debuggen helfen, was dies verursachen könnte?

Dies ist unsere Nginx-Konfiguration:

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;
}

Wir haben Django so konfiguriert, dass es in Gunicorn als generische WSGI-Anwendung ausgeführt wird. Supervisord wird verwendet, um die Gunicorn-Arbeiter zu starten:

home / user / virtenv / bin / python2.7 / home / user / virtenv / bin / gunicorn --config /home/user/shared/etc/gunicorn.conf.py daggr.wsgi: application

So sieht die gunicorn.conf.py aus:

import multiprocessing

bind = 'unix:/tmp/gunicorn-ourapp.socket'
workers = multiprocessing.cpu_count() * 3 + 1
timeout = 600
graceful_timeout = 40

Weiß jemand, wo ich anfangen kann zu graben, um zu sehen, was das Problem verursachen könnte?

So sieht meine ulimit -a-Ausgabe auf dem Server aus:

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
user1068118
quelle

Antworten:

3

Ich konnte dieses Problem /proc/sys/net/core/somaxconnumgehen, indem ich von 128 auf 20000 bearbeitete. Dies ermöglicht größere Verkehrsstöße. Ich musste es vielleicht nicht so hoch einstellen, aber diese Anwendung kann sehr hoch platzen. Ich benutze auch Gunicorn & Nginx.

Matt Williamson
quelle
3

In meinem Fall lag dieser Fehler an meiner Gunicorn-Konfiguration:

worker_class = "synchronisieren"

Was ich behoben habe mit:

worker_class = "gevent" # "sync"

estevo
quelle
In meinem Fall habe ich anstelle von Unterklassen gunicorn.workers.sync.SynWorkerUnterklassen erstellt gunicorn.workers.ggevent.GeventWorker. Arbeitete ein Vergnügen!
Markrian
2

Ich konnte dieses Problem mit diesem Beispiel reproduzieren: https://github.com/pawl/somaxconn_test

Erhöhen der net.core.somaxconnam Ende behoben.

Wenn es sich nicht um einen Docker-Container handelt, können Sie dies mit tun sysctl -w net.core.somaxconn=<your value>. Wenn es sich um einen Docker-Container handelt, können Sie dieses Flag verwenden:--sysctl net.core.somaxconn=1024

Klinke
quelle
0

Das hört sich so an, als würde es verursacht, weil alle Gunicorn-Arbeiter im Einsatz sind. Ich würde vorübergehend Loggin in Gunicorn einschalten. Siehe die Protokollierungseinstellungen hier . Dies sollte es Ihnen ermöglichen, den Zustand der Gunicorn-Arbeiter zu sehen und zu sehen, warum zum Zeitpunkt des 502 keine neue Verbindung hergestellt werden kann.

JaseAnderson
quelle