Ruby on RailsアプリケーションのWebサーバとしてnginxを設定する際、初心者の方はunicornが公開している設定サンプルなどを利用する場合も多いのではないでしょうか。 最低限動かすならこれでもよいのですが、各項目を理解した上でチューニングすることで、より高いパフォーマンスのWebサーバを構築することができます。

今回から3回に分けて、nginxの設定についてまとめたいと思います。

目次

nginxとは

nginxは静的なコンテンツを高速に配信できるという特徴をもつWebサーバです。 また、リバースプロキシとしての機能もあり、バックエンドにunicornなどのアプリケーションサーバを配置することで、動的なコンテンツも配信できるようになります。

ディレクティブとコンテキスト

このシリーズではたくさんのディレクティブ(設定項目)について説明していきますが、各ディレクティブは定義できるコンテキストが決まっています。 たとえば、worker_processesディレクティブはmainコンテキストでのみ定義可能です。

nginxには次のコンテキストがあります:

  • main: 全般的なふるまいやプロセスに関する設定
  • event: イベントの処理に関する設定
  • http: HTTPに関する設定
  • mail: メールに関する設定

今回は、main/eventコンテキストに関するディレクティブについて見ていきます。

プロセス

main/eventコンテキストではworkerプロセスに関する設定も多いため、簡単に説明しておきます。

nginxは1つのmasterプロセスといくつかのworkerプロセスをもちます。 masterプロセスはnginx全体の設定やworkerプロセスの管理などを行ない、workerプロセスが実際のリクエストを処理します。

1つのworkerプロセスで数千もの接続を処理できるため、nginx全体として同時に多くのリクエストを処理することができる設計となっています。

mainコンテキスト

user

workerプロセスを起動するユーザを指定します。 なお、masterプロセスはrootで起動します。

worker_processes

workerプロセスの数を設定します。 CPUのコア数以下に設定しなければなりませんが、autoにすることで自動でコア数を設定してくれます。

worker_rlimit_nofile

workerプロセスが同時に扱えるファイル数を設定します。 後述するworker_connectionsの4倍程度が適切とされています。 デフォルトではulimit -nの値がセットされますが、これが少ない場合はこのディレクティブで設定します。

worker_cpu_affinity

workerプロセスが使用するCPUコアを設定します。 nginxのバージョン1.9.10からautoを設定することができます。

eventコンテキスト

use epoll

コネクションの処理方法を設定します。 値としてはselectなどいくつかありますが、Linux 2.6+ではepollがもっとも効率がよいです。

accept_mutex

アクセスの際にすべてのworkerプロセスを起こさず、新しい接続として受け入れます。 worker_processesが1より大きい場合にonにします。

accept_mutex_delay

mutexの受け入れに失敗した際の待機時間を設定します。

multi_accept

複数の接続をすべて1度に受け入れるかどうかを設定します。

worker_connections

workerプロセスあたりの最大接続数を設定します。

ここまでの設定まとめ

以上の設定をまとめると、次のようになります。 設定の際の参考にしてみてください。

/etc/nginx/nginx.conf:

user nginx;

worker_cpu_affinity auto;
worker_processes auto;
worker_rlimit_nofile 4096;

error_log /var/log/nginx.error.log;
pid /var/run/nginx.pid;

events {
  use epoll;
  accept_mutex on;
  accept_mutex_delay 100ms;
  multi_accept on;
  worker_connections 1024;
}

参考記事

おわりに

今回はnginx全体のふるまいを定義するmain/eventコンテキストについて見ていきました。 次回はサーバの動きを定義するhttpコンテキストのディレクティブについてまとめます。