Ubuntu

520 recv() failed 僅在將應用程序作為 www-data 執行時

  • August 27, 2018

我正在執行一個 nginx 代理伺服器,它面向具有數千個連接的 WebSocket 客戶端的 SignalR 應用程序。

為了適應所有這些連接,我在 中設置了以下內容nginx.conf

worker_rlimit_nofile 60000;
events {
       worker_connections 30000;
}

如果我使用myname使用者帳戶執行我的應用程序,一切都會按預期執行。

當我嘗試使用帶有 user 的 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什麼?

您可能為登錄使用者(例如 in limits.conf)配置的資源限制不適用於 systemd 啟動的服務。這些資源限制需要在服務單元本身中配置,或者通過在systemd-system.conf中設置系統範圍的預設值來配置。

例如:

[Service]
LimitNOFILE=1048576

引用自:https://serverfault.com/questions/928203