%20%E5%A4%B1%E6%95%97%60.png)
我正在運行一個 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
?
答案1
您可能為登入使用者設定的資源限制(例如 in limits.conf
)不適用於 systemd 啟動的服務。這些資源限制需要在服務單元本身配置或透過設定係統範圍的預設值systemd-system.conf。
例如:
[Service]
LimitNOFILE=1048576