Open4

TIL(Today I Learned) 2025/09〜

takaratakara

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

takaratakara

📘 TIL (Today I Learned)
📅 2025-09-04
NginxのActive connectionsが意図した値に届いていない状態で張り付くように見えたので挙動を調査した

  • ActiveConnections
    • nginxのstub_statusで把握可能
    • Watingを含む全てのクライアントとのアクティブコネクション数
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
takaratakara

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
takaratakara

📘 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";
    }
  }
}