Ich verwende einen Nginx-Server, der als Proxy für einen Upstream-Unix-Socket fungiert, wie folgt:
upstream app_server {
server unix:/tmp/app.sock fail_timeout=0;
}
server {
listen ###.###.###.###;
server_name whatever.server;
root /web/root;
try_files $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
Einige App Server-Prozesse ziehen Anforderungen ab, sobald /tmp/app.sock
sie verfügbar sind. Der hier verwendete App-Server ist Unicorn, aber ich denke nicht, dass dies für diese Frage relevant ist.
Das Problem ist, es scheint nur, dass Nginx nach einer bestimmten Last keine Anfragen mehr schnell genug über den Socket erhalten kann. Es spielt keine Rolle, wie viele App Server-Prozesse ich eingerichtet habe.
Ich erhalte eine Flut dieser Meldungen im Nginx-Fehlerprotokoll:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
Viele Anfragen führen zu Statuscode 502 und solchen, deren Fertigstellung nicht lange dauert. Die Nginx-Schreibwarteschlangen-Statistik liegt bei 1000.
Wie auch immer, ich habe das Gefühl, dass ich hier etwas Offensichtliches vermisse, da diese spezielle Konfiguration von Nginx und App Server ziemlich häufig ist, insbesondere bei Unicorn (es ist die empfohlene Methode). Gibt es irgendwelche Linux-Kernel-Optionen, die gesetzt werden müssen, oder etwas in Nginx? Irgendwelche Ideen, wie der Durchsatz zum Upstream-Socket erhöht werden kann? Etwas, das ich eindeutig falsch mache?
Zusätzliche Informationen zur Umwelt:
$ uname -a
Linux servername 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
$ unicorn -v
unicorn v4.3.1
$ nginx -V
nginx version: nginx/1.2.1
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled
Aktuelle Kernel-Optimierungen:
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
net.netfilter.nf_conntrack_max = 524288
Ulimit-Einstellungen für den Nginx-Benutzer:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
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) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -n
sagt 65535
.
ulimit
, insbesondere die Anzahl der geöffneten Dateien?