%20failed%60%20%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%20www-data%20%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AB%E3%81%AE%E3%81%BF%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99.png)
私は、何千もの WebSocket クライアントが接続された SignalR アプリケーションの前面に nginx プロキシ サーバーを実行しています。
これらすべての接続に対応するために、 で以下を設定しました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によって開始されたサービスには適用されません。これらのリソース制限は、サービスユニット自体に設定されるまたはシステム全体のデフォルトを設定することでシステムd-system.conf。
例えば:
[Service]
LimitNOFILE=1048576