Muitos arquivos abertos com nginx parecem não aumentar o limite

22

O servidor é o Ubuntu 13.04 (GNU / Linux 3.9.3-x86_64-linode33 x86_64).

nginx é nginx / 1.2.6.

Estou trabalhando nisso há várias horas, então aqui está o que estou recebendo e o que fiz.

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 em execução:

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

Limites flexíveis / rígidos modificados em /etc/security/limits.conf (configurações no final do arquivo)

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

Uma leitura dos arquivos máximos

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

E em /etc/pam.d/common-session:

session required pam_limits.so

Com isso adicionado e o servidor reiniciado por uma boa medida, para o nginx eu conto os limites flexíveis / rígidos obtendo o PID do processo pai e:

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

O processo pai é executado como 'raiz' e os 4 trabalhadores são executados como 'ninguém'.

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

Eu tentei tudo o que sei fazer e consegui obter do Google. Não consigo obter os limites de arquivo para o nginx aumentar.

Socorro?

Geuis
fonte

Respostas:

32

Adicione a seguinte linha ao seu nginx e reinicie o processo:

worker_rlimit_nofile 30000;

Isso permitirá que os trabalhadores obtenham mais arquivos. Você pode verificar com:

su - nobody
ulimit -Hn
ulimit -Sn

Isso deve gerar os novos limites rígidos / flexíveis.

Referência

Nathan C
fonte
6
Se você alterar apenas a worker_rlimit_nofileconfiguração do uWSGI e não os limites do sistema (o que funcionou para mim), não será possível verificar isso via ulimit. Em vez disso, você deve olhar diretamente para /proc/<pid of worker>/limits.
Jan Fabry
Eu acho que o usuário (ninguém / www-data) precisa sair e entrar novamente. reinicie o servidor. ulimit para mim está mostrando que sua maior, mas o processo ainda é limitado conforme cat / proc / pid {} / limites
felix
@felix O OP mencionou que já havia reiniciado o servidor, mas sim, isso é necessário.
Nathan C
3

No Ubuntu, edite /etc/pam.d/su adicione ou remova o comentário da sessão de linha necessária pam_limits.so

Além disso, em /etc/security/limits.conf, verifique se você possui TABS entre os caracteres e não os espaços.

Rusty Hodge
fonte
1

certifique-se de executar o seguinte comando após editar esses arquivos

sysctl -p

Em seguida, reinicie o nginx

Mike
fonte
1
Não tem efeito. Os limites permaneceram os mesmos.
Geuis