Open4
TIL(Today I Learned) 2025/09〜

TIL (Today I Learned) 1日1個、その日学んだことを投下していく。

📘 TIL (Today I Learned)
📅 2025-09-04
NginxのActive connectionsが意図した値に届いていない状態で張り付くように見えたので挙動を調査した
- ActiveConnections
- nginxの
stub_status
で把握可能 - Watingを含む全てのクライアントとのアクティブコネクション数
- nginxの
Active connections: 12
server accepts handled requests
643 643 10491
Reading: 0 Writing: 5 Waiting: 7
- worker_connections
- 1プロセスが処理可能なコネクションの上限。コンフィグファイルで指定する
- ファイルディスクリプタ
- ≒nginxなどのプロセスが同時にオープンできるファイルの数。
- こちらが上限に達している状態だと、そもそもコネクションを増やせなくなる
# 上限を確認
root@ip-10-0-1-XXX:/# ulimit -n
12345
# pidを確認
root@ip-10-0-1-XXX:/# pidof nginx
111 222 333
# プロセスが利用しているファイルディスクリプタの数を確認
ls /proc/222/fd | wc -l
44
# システム全体のFD使用状況を確認
# (左から現在使われているFD数、未使用だけど割り当て済みの FD数、システム全体の最大 FD 上限)
root@ip-10-0-1-XXX:/# cat /proc/sys/fs/file-nr
567 0 999999

NginxのActive connectionsが意図した値に届いていない状態で張り付くように見えたので挙動を調査した
調査した結果、Nginxやファイルディスクリプタの設定は問題なく意図した通りに動いていた。
Nginx側の設定は余裕があったが、Railsのコネクションプールが枯渇していたことによりコネクションを開けなかったっぽい。
Railsでは下記のエラーが出ていた。
ActiveRecord::ConnectionTimeoutError could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use

📘 TIL (Today I Learned)
📅 2025-09-05
- nginx mapディレクティブの使い方について
- 特定のパスの場合は404を返す処理を、mapディレクティブを使って実装した
書き方のサンプル
http {
# ファイル拡張子でMIMEタイプを判定
map $uri $my_content_type {
default "text/plain";
~*\.html?$ "text/html";
~*\.css$ "text/css";
~*\.js$ "application/javascript";
}
server {
listen 8080;
location / {
add_header Content-Type $my_content_type;
return 200 "Content-Type: $my_content_type\n";
}
}
}