我正在运行一个 nginx 代理服务器,该服务器位于一个 SignalR 应用程序前面,其中包含数千个连接的 WebSocket 客户端。
为了适应所有这些连接,我已设置以下内容nginx.conf
:
worker_rlimit_nofile 60000;
events {
worker_connections 30000;
}
如果我使用用户帐户运行我的应用程序myname
,一切都将按预期运行。
当我尝试使用带有用户的 systemd 服务定义运行应用程序时www-data
,应用程序启动正常,但是,大约 80% 的对服务器/应用程序的请求现在失败(来自 nginx error.log
):
nginx recv() failed (104: Connection reset by peer) while reading response header from upstream
这会导致客户端应用程序出现 520 状态代码(cloudflare)。
其余 20% 的请求按预期成功,因此我知道应用程序正在正常运行。
[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
我感觉我达到的某些限制低于我指定的限制worker_rlimit_nofile 60000
,并且导致失败(尽管可能只是一种转移注意力的手段)。检查ulimit
这两个用户后发现他们有相同的:
# 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
当按 操作时,什么原因可能导致这些故障www-data
?
答案1
您可能为已登录用户(例如limits.conf
)配置的资源限制不适用于 systemd 启动的服务。这些资源限制需要在服务单元本身中配置或者通过设置系统范围的默认值systemd-系统配置文件。
例如:
[Service]
LimitNOFILE=1048576