J'exécute un serveur nginx qui agit comme un proxy vers un socket Unix en amont, comme ceci:
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;
}
}
Certains processus de serveur d'applications, à leur tour, retirent les demandes au /tmp/app.sock
fur et à mesure qu'elles deviennent disponibles. Le serveur d'application particulier utilisé ici est Unicorn, mais je ne pense pas que cela soit pertinent pour cette question.
Le problème est, il semble juste qu'au-delà d'une certaine quantité de charge, nginx ne puisse pas recevoir les requêtes via le socket à un rythme assez rapide. Peu importe le nombre de processus de serveur d'applications que je configure.
Je reçois un flot de ces messages dans le journal des erreurs nginx:
connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream
De nombreuses demandes aboutissent au code d'état 502 et à celles qui ne prennent pas beaucoup de temps. La statistique de file d'attente d'écriture nginx oscille autour de 1000.
Quoi qu'il en soit, j'ai l'impression de manquer quelque chose d'évident ici, car cette configuration particulière de nginx et du serveur d'applications est assez courante, en particulier avec Unicorn (c'est la méthode recommandée en fait). Y a-t-il des options de noyau Linux qui doivent être définies, ou quelque chose dans nginx? Des idées sur la façon d'augmenter le débit vers le socket en amont? Quelque chose que je fais clairement mal?
Informations supplémentaires sur l'environnement:
$ 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
Ajustements actuels du noyau:
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
Paramètres Ulimit pour l'utilisateur nginx:
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
dit 65535
.
ulimit
, en particulier le nombre de fichiers ouverts?