Ubuntu520
520 recv() failed
僅在將應用程序作為 www-data 執行時
我正在執行一個 nginx 代理伺服器,它面向具有數千個連接的 WebSocket 客戶端的 SignalR 應用程序。
為了適應所有這些連接,我在 中設置了以下內容
nginx.conf
:worker_rlimit_nofile 60000; events { worker_connections 30000; }
如果我使用
myname
使用者帳戶執行我的應用程序,一切都會按預期執行。當我嘗試使用帶有 user 的 systemd 服務定義執行應用
www-data
程序時,應用程序啟動正常,但是,現在大約 80% 的伺服器/應用程序請求失敗(來自 nginxerror.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