今回と次回の2回に分けてnginxの設定について紹介します。今回の前半は設定ファイルの構成について、後半は設定ファイルのサンプルを元に設定ディレクティブについて説明を行います。設定ファイルについてパッケージシステムからnginxをインストールすると、nginxの設定ファイル用のディレクトリは通常は/etc/nginxになります。このディレクトリに設定ファイルnginx.confを配置します。他のファイルから設定を読み込むincludeディレクティブを次のような内容でnginx.confに記述して、conf.dというサブディレクトリ内の拡張子がconfであるファイルを読み込む設定を行うことがよくあります。/etc/nginx/conf.d/*.conf;その他に次のようなファイルもインストールされます。MIMEタイプと拡張子の関連付けを定義したファイル。FastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定集。fastcgi_paramsと同じ。パッケージによっては同梱されない場合もある。SCGI用の変数を定義するファイル。scgi_paramディレクティブによる設定集。uWSGI用の変数を定義するファイル。uwsgi_paramディレクティブによる設定集。ロシア語の文字エンコーディングkoi8-rとUTF-8の文字コードのマッピングを行うファイル。ロシア語の文字エンコーディングkoi8-rとwindows-1251の文字コードのマッピングを行うファイル。ロシア語の文字エンコーディングwindows-1251とUTF-8の文字コードのマッピングを行うファイル。これらのファイルのファイル名は特別な意味を持っているのではなく、設定ファイルからincludeディレクティブによりこのファイル名を指定して読み込むことで利用します。次のようにしてはmime.typesを読み込みます。win-utfの3つのファイルを使うことはありません。設定ファイルの記述方法nginxの設定の命令(ディレクティブ)は設定ファイル内のどこにでも記述できるものではなく、ディレクティブ毎に決められたコンテキスト内に記述します。コンテキストはnginxのモジュールのカテゴリと関連があるため、モジュールのカテゴリについて先に説明します。モジュールは大きく分けて4種類のカテゴリに分けられます。mailに関するモジュールディレクティブはこのモジュールのカテゴリ毎に記述します。coreモジュールに関してはmainコンテキスト、すなわち、設定ファイル内の最上位の階層に記述します。設定ファイルの構成は次のようになります。mailモジュールの設定}httpコンテキストはさらに、バーチャルサーバ(バーチャルドメイン)毎の設定を行うserverディレクティブ、さらにURI毎の設定を行うlocaltionディレクティブにより階層化されます。次のような構成になります。}}nginx.confの説明ここからは、nginx.orgのパッケージからインストールしたnginxが提供している設定ファイルnginx.confをサンプルとして設定について説明をしていきます。mainコンテキストまず、mainコンテキストでの設定について確認していきます。mainコンテキストに記述できる設定はコアモジュールで提供されるディレクティブです。どのようなディレクティブがあるかは次のサイトで確認できます。Wiki)設定ファイルnginx.confのmainコンテキストには次の設定が行われています。/var/run/nginx.pid;この設定を一つずつ確認していきましょう。nginx;userディレクティブはnginxのworkerプロセスの実行権限のユーザを設定します。この例ではnginxユーザで動作します。nginxが動作しているときのpsコマンドの出力例は次のようになります。processがnginxユーザで動作していることが確認できます。1;worker_processesディレクティブは動作させるnginxのworkerプロセスの数を設定します。通常はCPUのコア数以下に設定します。イベント駆動のアーキテクチャであるため、CPUのコア数より多い数のプロセスを動作させても意味がありません。デフォルトの設定値は1です。この例ではworkerプロセスの数を1個にするように設定されています。warn;error_logディレクティブはエラーログの出力先のファイル名とロギングのレベルを指定します。locationのどのコンテキストでも設定できるため、必要に応じてエラーログの出力先を変えることができます。error"であり、errorレベル以上のログをlogs/error.logに出力します。この例ではwarnレベル以上のログを/var/log/nginx/error.logに出力します。/var/run/nginx.pid;pidディレクティブはmasterプロセスのプロセスIDを保存するファイルを設定します。この例ではnginxのmasterプロセスのプロセスIDを/var/run/nginx.pidに保存します。eventsコンテキストeventsコンテキストでの設定について確認していきます。eventsコンテキストに記述できる設定はeventモジュールで提供されるディレクティブです。どのようなディレクティブがあるかは次のサイトで確認できます。Wiki)設定ファイルnginx.confのeventsコンテキストには次の設定が行われています。1024;worker_connectionsディレクティブは一つのworkerプロセスが同時に処理できる最大コネクション数を設定します。デフォルトの設定値は512です。この例では一つのworkerあたり最大1024個のコネクションを処理します。httpコンテキストhttpコンテキストでの設定について確認していきます。httpコンテキストに記述できる設定はhttpモジュールで提供されるディレクティブです。どのようなhttpモジュールとディレクティブがあるかは次のサイトで確認できます。Wiki)のHTTPモジュール設定ファイルnginx.confのhttpコンテキストには次の設定が行われています。/etc/nginx/conf.d/*.conf;}それぞれの設定について確認していきましょう。/etc/nginx/mime.types;このincludeディレクティブでは次のような内容のファイルmime.typesを読み込んでいます。rss;中略}typesディレクティブはMIMEタイプと拡張子のマッピングを設定します。nginxでは上記のような内容のtypesディレクティブの設定を行ったmime.typesというファイルを用意しており、上述のようにincludeディレクティブで読み込むようにします。application/octet-stream;default_typeディレクティブではレスポンスのデフォルトのMIMEタイプを設定します。上述のmime.typesで拡張子からMIMEタイプを決定できなかったときに、ここで指定したMIMEタイプが適応されます。デフォルトの設定値はtext/plainです。この例ではデフォルトのMIMEタイプをapplication/octet-streamに設定します。"$http_x_forwarded_for"';log_formatディレクティブはアクセスログの書式を定義します。後述するaccess_logディレクティブでここで定義した名前を指定することにより利用できます。このディレクティブはhttpコンテキストのみで利用できます。この例ではmainという名前で書式を定義しています。次のような"combined"という名前の定義が予め組み込みで用意されています。Serverでよく定義されている"combined"と同じ形式です。main;access_logディレクティブはアクセスログの出力先のパスとlog_formatで定義した書式の名前を設定します。combined"です。書式を省略すると"combined"が適応されます。設定値を"off"にすると、アクセスログを出力しないため、アクセスログの出力を抑制したい場合に利用します。limit_exceptのどのコンテキストでも利用できるため、必要に応じて異なるファイル名のファイルにログを出力することができます。この例では/var/log/nginx/access.logというファイルにmainの書式でアクセスログを出力します。ログに関してはhttp_logモジュールの機能です。次のサイトでその機能の詳細を確認できます。APIを使うかを設定します。sendfile()を使うとカーネル空間内でファイルの読み込みと送信が完了するため、効率良くファイルの内容をクライアントに送信できます。デフォルトの設定値はoffです。sendfile()はプラットフォームやファイルシステムによっては問題が起きることもありますので、そのときは無効にしてください。EnableSendfileディレクティブが参考になります。この例ではsendfile()を利用します。on;tcp_nopushディレクティブはsendfileが有効なときに、FreeBSDの場合はTCP_NOPUSHソケットオプション、Linuxの場合はTCP_CORKソケットオプションを使うかを設定します。このオプションを使うと、レスポンスヘッダとファイルの内容をまとめて送るようになり、少ないパケット数で効率良く送ることができます。デフォルトの設定値はoffです。この例ではtcp_nopushの機能を有効にします。65;keepalive_timeoutディレクティブはサーバ側でのキープアライブのタイムアウトの秒数を設定します。デフォルトの設定値は75sです。この例ではキープアライブのタイムアウトを65秒に設定しています。on;gzipディレクティブではレスポンスのコンテンツを圧縮するかを設定します。デフォルトの設定値はoffです。この例では圧縮を行います。gzipディレクティブはhttp_gzipモジュールの機能です。次のサイトで関連するディレクティブを確認できます。11.10でのnginxのパッケージで提供される設定ファイルには次の内容のgzip関連の設定が行われています。gzip関連の設定の参考になると思います。/etc/nginx/conf.d/*.conf;この例では/etc/nginx/conf.dディレクトリにある拡張子がconfのファイルを読み込みます。conf.dディレクトリにはバーチャルサーバ毎の設定ファイルを置きます。このバーチャルサーバ毎の設定については次回で紹介します。serverコンテキストおよびlocaltionコンテキストにおけるディレクティブについて説明します。株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。こちら「みんな仲良く」「プライドを持って」「変化を楽しむ」という企業理念に共感していただけるエンジニアを募集しています。