520 `recv() falhou` somente ao executar o aplicativo como www-data

520 `recv() falhou` somente ao executar o aplicativo como www-data

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 mynameconta 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 60000e isso está causando falhas (embora possa ser apenas uma pista falsa). A verificação ulimitde 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

informação relacionada