Demasiados archivos abiertos con nginx, parece que no puede aumentar el límite

22

El servidor es Ubuntu 13.04 (GNU / Linux 3.9.3-x86_64-linode33 x86_64).

nginx es nginx / 1.2.6.

He estado trabajando en esto durante varias horas, así que esto es lo que estoy obteniendo y esto es lo que he hecho.

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 corriendo:

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

Límites suaves / duros modificados en /etc/security/limits.conf (configuración desde el final del archivo)

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

Una lectura de los archivos max

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

Y en /etc/pam.d/common-session:

session required pam_limits.so

Con esto agregado y el servidor reiniciado en buena medida, para nginx cuento los límites suaves / duros obteniendo el PID del proceso principal y:

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

El proceso padre se ejecuta como 'root' y los 4 trabajadores se ejecutan como 'nobody'.

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

He intentado todo lo que sé hacer y he podido obtener de Google. No puedo obtener los límites de archivos para que nginx aumente.

¿Ayuda?

Geuis
fuente

Respuestas:

32

Agregue la siguiente línea a su nginx y reinicie el proceso:

worker_rlimit_nofile 30000;

Esto permitirá a los trabajadores tomar más archivos. Luego puede verificar con:

su - nobody
ulimit -Hn
ulimit -Sn

Esto debería generar los nuevos límites hard / soft.

Referencia

Nathan C
fuente
66
Si solo cambia la worker_rlimit_nofileconfiguración de uWSGI y no los límites del sistema (que funcionó para mí), no puede verificarlo a través de ulimit. En cambio, debe mirar directamente /proc/<pid of worker>/limits.
Jan Fabry
Creo que el usuario (nobody / www-data) tiene que cerrar sesión y volver a iniciarla. reiniciar el servidor. ulimit para mí está demostrando que ha aumentado, pero el proceso todavía es limitado según cat / proc / {pid} / limits
felix
@felix El OP mencionó que ya reiniciaron el servidor, pero sí, esto es necesario.
Nathan C
3

En Ubuntu, edite /etc/pam.d/su agregue o descomente la sesión de línea requerida pam_limits.so

Además, en /etc/security/limits.conf asegúrese de tener TABS entre los caracteres y no espacios.

Hodge oxidado
fuente
1

asegúrese de ejecutar el siguiente comando después de editar esos archivos

sysctl -p

Luego reinicie nginx

Micro
fuente
1
No tiene efecto. Los límites permanecieron igual.
Geuis