%20falhou%60%20somente%20ao%20executar%20o%20aplicativo%20como%20www-data.png)
Estou executando um servidor proxy nginx que faz frente a um aplicativo SignalR com milhares de clientes WebSocket conectados.
Para acomodar todas essas conexões, configurei o seguinte em nginx.conf
:
worker_rlimit_nofile 60000;
events {
worker_connections 30000;
}
Se eu executar meu aplicativo usando a myname
conta do usuário, tudo funcionará conforme o esperado.
Quando tento executar o aplicativo usando uma definição de serviço systemd com user www-data
, o aplicativo inicia bem, no entanto, cerca de 80% das solicitações ao servidor/aplicativo agora falham com (de nginx error.log
):
nginx recv() failed (104: Connection reset by peer) while reading response header from upstream
O que resulta em 520 códigos de status (cloudflare) para o aplicativo cliente.
Os outros 20% das solicitações são bem-sucedidos conforme o esperado, por isso sei que o aplicativo está funcionando corretamente.
[Unit]
Description=MyApp
[Service]
WorkingDirectory=/home/myname/app/
ExecStart=/usr/bin/dotnet /home/myname/app/publish/App.dll
Restart=always
RestartSec=10
SyslogIdentifier=MyApp
User=www-data
EnvironmentFile=/myapp.env
[Install]
WantedBy=multi-user.target
Sinto que estou atingindo algum limite abaixo do que especifiquei worker_rlimit_nofile 60000
e isso está causando falhas (embora possa ser apenas uma pista falsa). A verificação ulimit
de ambos os usuários mostra que eles têm o mesmo:
# su - myname -c 'ulimit -aH' -s '/bin/bash'
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31823
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 31823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
# su - www-data -c 'ulimit -aH' -s '/bin/bash'
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31823
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1048576
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 31823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
O que poderia estar causando essas falhas ao operar como www-data
?
Responder1
Os limites de recursos que você pode ter configurado para usuários logados (por exemplo, em limits.conf
) não se aplicam a serviços iniciados pelo systemd. Esses limites de recursos precisam serconfigurado na própria unidade de serviçoou definindo padrões para todo o sistema emsystemd-system.conf.
Por exemplo:
[Service]
LimitNOFILE=1048576