背景
railsアプリケーションをnginx+unicornで稼働させている際、以下のエラーが発生していました。
nginxとunicorn間は、UNIXソケットで通信しています。
nginx.log
connect() to unix:/tmp/unicorn.sock failed (11: Resource temporarily unavailable) while connecting to upstream
この時の事象としては、UNIXソケットへの接続がbacklogの値(接続キューのサイズ)を超えてしまったため発生していました。
AmazonLinuxですと、最大接続数の上限はデフォルトだと128となっていました。
ss
コマンドで、各ソケットのbacklogの値を確認できます。
$ ss -ax | grep -e unicorn
u_str LISTEN 0 128 /tmp/unicorn.sock 38120 * 0
$ sysctl net.core.somaxconn
net.core.somaxconn = 128
対応内容
OSのbacklogの上限変更を行います。
以下のコマンドで変更可能ですが、再起動で元に戻ってしまいます。
$ sudo sysctl -w net.core.somaxconn=256
net.core.somaxconn = 256
/etc/sysctl.conf
に追記すると起動の都度反映されるようになります。
/etc/sysctl.conf
net.core.somaxconn = 256
railsアプリケーション上での設定は、listenする際に指定可能です。
config/unicorn.rb
に指定した値は、OSでの上限より大きくはなりません。
config/unicorn.rb
listen "/tmp/unicorn.sock", backlog: 256
unicornを再起動すると、以下のようにbacklogの値が変更されていることを確認できます。
$ ss -ax | grep -e unicorn
u_str LISTEN 0 256 /tmp/unicorn.sock 38120 * 0