Configurando o ulimit de 'max arquivos abertos' para o processo mestre nginx daemonizado

3

Eu tenho um nginx -daemon rodando em um Debian (8.3). O processo nginx ocasionalmente é executado em limitações de recursos ao tentar gravar arquivos de log: too many open files .

O processo nginx master é executado com raiz, enquanto cada um dos quatro processos de trabalho é executado com www-data de permissões de usuário.

Quando eu verifiquei o nginx-master e cada configuração de limite de processo de trabalho, descobri algo estranho.

cat /proc/{nginx-master-process-id}/limits
Limit                     Soft Limit           Hard Limit           Units
…
Max open files            1024                 4096                 files
…

cat /proc/{nginx-any-worker-process-id}/limits
…
Max open files            30000                30000                files
…

Cada funcionário do nginx tem permissão para abrir 30000 arquivos.

O processo mestre nginx só tem permissão para abrir 1024 arquivos, respectivamente 4096 arquivos referentes ao limite máximo.

Quando eu verifico as configurações ulimit do usuário root, não vejo esse limite definido! De onde essa configuração 1024/4096 pode vir?

configurações de ulimit raiz

# logged in as root
ulimit -H
unlimited

Além disso, verifiquei a configuração do daemon:

/lib/systemd/system/nginx.service

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Não vejo nenhuma configuração ulimit aqui.

Que lugares posso verificar para modificar o limite de 1024/4096 nofile para o processo nginx -master?

    
por Gregory Igelmund 07.05.2016 / 14:03

1 resposta

3

Parece que o problema , por assim dizer, foi uma suposição errada de que um serviço systemd respeita o ulimit configurado em /etc/security/limits.conf .

Como acontece, um daemon configurado via systemd ignora intencionalmente as configurações no limits.conf e requer uma configuração LimitNOFILE no arquivo de configuração do serviço.

A atualização do arquivo de unidade do meu systemd corrigiu o problema:

/lib/systemd/system/nginx.service

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --signal QUIT --retry QUIT/5 --pidfile /run/nginx.pid
# Give Passenger a chance to clean up before being killed by systemd.
ExecStop=/bin/sleep 1
TimeoutStopSec=5
KillMode=mixed
LimitNOFILE=30000 # <= This line was added

[Install]
WantedBy=multi-user.target

Veja alguns links e recursos relacionados a esse problema:

Obrigado a @ ijaz-khan por me apontar nessa direção.

    
por 08.05.2016 / 22:17