Zu viele offene Dateien mit Nginx können das Limit scheinbar nicht erhöhen

22

Der Server ist Ubuntu 13.04 (GNU / Linux 3.9.3-x86_64-linode33 x86_64).

Nginx ist Nginx / 1.2.6.

Ich arbeite jetzt seit einigen Stunden daran, also bekomme ich Folgendes und was ich getan habe.

tail -f /usr/local/nginx/logs/error.log
2013/06/18 21:35:03 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:05 [crit] 3426#0: accept4() failed (24: Too many open files)

Nginx läuft:

geuis@localhost:~$ ps aux | grep nginx
root      3422  0.0  0.0  39292   380 ?        Ss   21:30   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    3423  3.7 18.8 238128 190848 ?       S    21:30   0:13 nginx: worker process      
nobody    3424  3.8 19.0 236972 192336 ?       S    21:30   0:13 nginx: worker process      
nobody    3426  3.6 19.0 235492 192192 ?       S    21:30   0:13 nginx: worker process      
nobody    3427  3.7 19.0 236228 192432 ?       S    21:30   0:13 nginx: worker process      
nobody    3428  0.0  0.0  39444   468 ?        S    21:30   0:00 nginx: cache manager process

Geänderte Soft / Hard-Limits in /etc/security/limits.conf (Einstellungen vom Ende der Datei)

root soft  nofile 65536
root hard  nofile 65536

www-data soft nofile 65536
www-data hard nofile 65536

nobody soft nofile 65536
nobody hard nofile 65536

Ein Lesen der max Dateien

cat /proc/sys/fs/file-max
500000

Und in /etc/pam.d/common-session:

session required pam_limits.so

Wenn dies hinzugefügt wurde und der Server aus gutem Grund neu gestartet wurde, zähle ich für nginx die weichen / harten Grenzen, indem ich die PID des übergeordneten Prozesses erhalte und:

cat /proc/<PID>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 4096                 files     

Der übergeordnete Prozess wird als "root" und die vier Worker als "nobody" ausgeführt.

root      2765  0.0  0.0  39292   388 ?        Ss   00:03   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    2766  3.3 17.8 235336 180564 ?       S    00:03   0:21 nginx: worker process      
nobody    2767  3.3 17.9 235432 181776 ?       S    00:03   0:21 nginx: worker process      
nobody    2769  3.4 17.9 236096 181524 ?       S    00:03   0:21 nginx: worker process      
nobody    2770  3.3 18.3 235288 185456 ?       S    00:03   0:21 nginx: worker process      
nobody    2771  0.0  0.0  39444   684 ?        S    00:03   0:00 nginx: cache manager process

Ich habe alles ausprobiert, was ich tun kann, und konnte es von Google bekommen. Ich kann die Dateibeschränkungen für Nginx nicht erhöhen.

Hilfe?

Geuis
quelle

Antworten:

32

Fügen Sie Ihrem Nginx die folgende Zeile hinzu und starten Sie den Prozess neu:

worker_rlimit_nofile 30000;

Auf diese Weise können die Mitarbeiter mehr Dateien aufnehmen. Sie können dann überprüfen mit:

su - nobody
ulimit -Hn
ulimit -Sn

Dies sollte die neuen harten / weichen Grenzen ausgeben.

Referenz

Nathan C
quelle
6
Wenn Sie nur die worker_rlimit_nofileuWSGI-Einstellung und nicht die Systemgrenzen ändern (was bei mir funktioniert hat), können Sie dies nicht über überprüfen ulimit. Stattdessen sollten Sie direkt anschauen /proc/<pid of worker>/limits.
Jan Fabry
Ich denke, dass Benutzer (nobody / www-data) sich aus- und wieder einloggen müssen. Starten Sie den Server neu. ulimit für mich zeigt, dass es erhöht ist, aber der Prozess ist immer noch begrenzt, wie pro cat / proc / {pid} / limits
Felix
@felix Das OP hat erwähnt, dass der Server bereits neu gestartet wurde, aber dies ist erforderlich.
Nathan C
3

Bearbeiten Sie in Ubuntu /etc/pam.d/su und fügen Sie die für die Zeilensitzung erforderliche Datei pam_limits.so hinzu oder kommentieren Sie sie aus

Stellen Sie außerdem in /etc/security/limits.conf sicher, dass zwischen den Zeichen TABS und keine Leerzeichen stehen.

Rusty Hodge
quelle
1

Stellen Sie sicher, dass Sie den folgenden Befehl ausführen, nachdem Sie diese Dateien bearbeitet haben

sysctl -p

Starten Sie dann nginx neu

Mike
quelle
1
Hat keine Wirkung. Die Grenzen blieben gleich.
Geuis