nginx連載3回目: nginxの設定、その1

今回と次回の2回に分けてnginxの設定について紹介します。今回の前半は設定ファイルの構成について、後半は設定ファイルのサンプルを元に設定ディレクティブについて説明を行います。

設定ファイルについて

パッケージシステムからnginxをインストールすると、nginxの設定ファイル用のディレクトリは通常は/etc/nginxになります。このディレクトリに設定ファイルnginx.confを配置します。

さらに、他のファイルから設定を読み込むincludeディレクティブを次のような内容でnginx.confに記述して、conf.dというサブディレクトリ内の拡張子がconfであるファイルを読み込む設定を行うことがよくあります。

include /etc/nginx/conf.d/*.conf;

その他に次のようなファイルもインストールされます。

mime.typesMIMEタイプと拡張子の関連付けを定義したファイル。
fastcgi_paramsFastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定集。
fastcgi.conffastcgi_paramsと同じ。パッケージによっては同梱されない場合もある。
scgi_paramsSCGI用の変数を定義するファイル。scgi_paramディレクティブによる設定集。
uwsgi_paramsuWSGI用の変数を定義するファイル。uwsgi_paramディレクティブによる設定集。
koi-utfロシア語の文字エンコーディングkoi8-rとUTF-8の文字コードのマッピングを行うファイル。
koi-winロシア語の文字エンコーディングkoi8-rとwindows-1251の文字コードのマッピングを行うファイル。
win-utfロシア語の文字エンコーディングwindows-1251とUTF-8の文字コードのマッピングを行うファイル。

これらのファイルのファイル名は特別な意味を持っているのではなく、設定ファイルからincludeディレクティブによりこのファイル名を指定して読み込むことで利用します。例えば、次のようにしてはmime.typesを読み込みます。

    include       /etc/nginx/mime.types;

なお、koi-utf, koi-win, win-utfの3つのファイルを使うことはありません。

設定ファイルの記述方法

nginxの設定の命令(ディレクティブ)は設定ファイル内のどこにでも記述できるものではなく、ディレクティブ毎に決められたコンテキスト内に記述します。

コンテキストはnginxのモジュールのカテゴリと関連があるため、モジュールのカテゴリについて先に説明します。モジュールは大きく分けて4種類のカテゴリに分けられます。

coreプロセスの制御や設定ファイルやエラーログに関するモジュール
eventイベント処理に関するモジュール
httphttpに関するモジュール
mailmailに関するモジュール

ディレクティブはこのモジュールのカテゴリ毎に記述します。ただし、coreモジュールに関してはmainコンテキスト、すなわち、設定ファイル内の最上位の階層に記述します。設定ファイルの構成は次のようになります。

coreモジュールの設定

events {
    eventモジュールの設定
}

http {
    httpモジュールの設定
}

mail {
    mailモジュールの設定
}

httpコンテキストはさらに、バーチャルサーバ(バーチャルドメイン)毎の設定を行うserverディレクティブ、さらにURI毎の設定を行うlocaltionディレクティブにより階層化されます。次のような構成になります。

http {
    httpモジュールの設定

    server {
        サーバ毎の設定

        location PATH {
            URI毎の設定
        }
        location PATH {
            URI毎の設定
	}
        ...
    }

    server {
        ...
    }
}

nginx.confの説明

ここからは、nginx.orgのパッケージからインストールしたnginxが提供している設定ファイルnginx.confをサンプルとして設定について説明をしていきます。

mainコンテキスト

まず、mainコンテキストでの設定について確認していきます。

mainコンテキストに記述できる設定はコアモジュールで提供されるディレクティブです。どのようなディレクティブがあるかは次のサイトで確認できます。

設定ファイルnginx.confのmainコンテキストには次の設定が行われています。

user  nginx;
worker_processes  1;

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

この設定を一つずつ確認していきましょう。

実行ユーザ - user

user  nginx;

userディレクティブはnginxのworkerプロセスの実行権限のユーザを設定します。

この例ではnginxユーザで動作します。nginxが動作しているときのpsコマンドの出力例は次のようになります。nginx: worker processがnginxユーザで動作していることが確認できます。

$ ps auxf | grep [n]ginx
root      1395  0.0  0.0  44516   844 ?        Ss   03:27   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     1398  0.0  0.1  44936  1528 ?        S    03:27   0:00  \_ nginx: worker process

workerのプロセス数 - worker_processes

worker_processes  1;

worker_processesディレクティブは動作させるnginxのworkerプロセスの数を設定します。通常はCPUのコア数以下に設定します。イベント駆動のアーキテクチャであるため、CPUのコア数より多い数のプロセスを動作させても意味がありません。なお、デフォルトの設定値は1です。

この例ではworkerプロセスの数を1個にするように設定されています。

エラーログ - error_log

error_log  /var/log/nginx/error.log warn;

error_logディレクティブはエラーログの出力先のファイル名とロギングのレベルを指定します。このディレクティブはmain, http, server, locationのどのコンテキストでも設定できるため、必要に応じてエラーログの出力先を変えることができます。なお、デフォルトの設定値は"logs/error.log error"であり、errorレベル以上のログをlogs/error.logに出力します。

この例ではwarnレベル以上のログを/var/log/nginx/error.logに出力します。

PIDファイル - pid

pid        /var/run/nginx.pid;

pidディレクティブはmasterプロセスのプロセスIDを保存するファイルを設定します。

この例ではnginxのmasterプロセスのプロセスIDを/var/run/nginx.pidに保存します。

eventsコンテキスト

eventsコンテキストでの設定について確認していきます。

eventsコンテキストに記述できる設定はeventモジュールで提供されるディレクティブです。どのようなディレクティブがあるかは次のサイトで確認できます。

設定ファイルnginx.confのeventsコンテキストには次の設定が行われています。

events {
    worker_connections  1024;
}

最大コネクション数 - worker_connections

worker_connections  1024;

worker_connectionsディレクティブは一つのworkerプロセスが同時に処理できる最大コネクション数を設定します。デフォルトの設定値は512です。

この例では一つのworkerあたり最大1024個のコネクションを処理します。

httpコンテキスト

httpコンテキストでの設定について確認していきます。

httpコンテキストに記述できる設定はhttpモジュールで提供されるディレクティブです。どのようなhttpモジュールとディレクティブがあるかは次のサイトで確認できます。

設定ファイルnginx.confのhttpコンテキストには次の設定が行われています。

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

それぞれの設定について確認していきましょう。

MIMEタイプの設定 - types, default_type

include       /etc/nginx/mime.types;

このincludeディレクティブでは次のような内容のファイルmime.typesを読み込んでいます。

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/x-javascript              js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;
中略
}

typesディレクティブはMIMEタイプと拡張子のマッピングを設定します。nginxでは上記のような内容のtypesディレクティブの設定を行ったmime.typesというファイルを用意しており、上述のようにincludeディレクティブで読み込むようにします。

default_type  application/octet-stream;

default_typeディレクティブではレスポンスのデフォルトのMIMEタイプを設定します。上述のmime.typesで拡張子からMIMEタイプを決定できなかったときに、ここで指定したMIMEタイプが適応されます。なお、デフォルトの設定値はtext/plainです。

この例ではデフォルトのMIMEタイプをapplication/octet-streamに設定します。

アクセスログの設定 - log_format, access_log

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

log_formatディレクティブはアクセスログの書式を定義します。後述するaccess_logディレクティブでここで定義した名前を指定することにより利用できます。このディレクティブはhttpコンテキストのみで利用できます。

この例ではmainという名前で書式を定義しています。

なお、次のような"combined"という名前の定義が予め組み込みで用意されています。

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
		    '"$http_referer" "$http_user_agent"';

これはApache HTTP Serverでよく定義されている"combined"と同じ形式です。

access_log  /var/log/nginx/access.log  main;

access_logディレクティブはアクセスログの出力先のパスとlog_formatで定義した書式の名前を設定します。デフォルトの設定値は"log/access.log combined"です。書式を省略すると"combined"が適応されます。なお、設定値を"off"にすると、アクセスログを出力しないため、アクセスログの出力を抑制したい場合に利用します。

このディレクティブはhttp, server, location, if, limit_exceptのどのコンテキストでも利用できるため、必要に応じて異なるファイル名のファイルにログを出力することができます。

この例では/var/log/nginx/access.logというファイルにmainの書式でアクセスログを出力します。

なお、ログに関してはhttp_logモジュールの機能です。次のサイトでその機能の詳細を確認できます。

sendfile, tcp_nopush

sendfile        on;

sendfileディレクティブはコンテンツのファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかを設定します。sendfile()を使うとカーネル空間内でファイルの読み込みと送信が完了するため、効率良くファイルの内容をクライアントに送信できます。デフォルトの設定値はoffです。

なお、sendfile()はプラットフォームやファイルシステムによっては問題が起きることもありますので、そのときは無効にしてください。これに関しては、Apacheでもsendfileを使う機能を持っているので、Apache HTTP Server - EnableSendfileディレクティブが参考になります。

この例ではsendfile()を利用します。

tcp_nopush     on;

tcp_nopushディレクティブはsendfileが有効なときに、FreeBSDの場合はTCP_NOPUSHソケットオプション、Linuxの場合はTCP_CORKソケットオプションを使うかを設定します。このオプションを使うと、レスポンスヘッダとファイルの内容をまとめて送るようになり、少ないパケット数で効率良く送ることができます。デフォルトの設定値はoffです。

この例ではtcp_nopushの機能を有効にします。

keepaliveの設定 - keepalive_timeout

keepalive_timeout  65;

keepalive_timeoutディレクティブはサーバ側でのキープアライブのタイムアウトの秒数を設定します。デフォルトの設定値は75sです。

この例ではキープアライブのタイムアウトを65秒に設定しています。

レスポンスの圧縮 - gzip

gzip  on;

gzipディレクティブではレスポンスのコンテンツを圧縮するかを設定します。デフォルトの設定値はoffです。

この例では圧縮を行います。

gzipディレクティブはhttp_gzipモジュールの機能です。次のサイトで関連するディレクティブを確認できます。

参考までに、Ubuntu 11.10でのnginxのパッケージで提供される設定ファイルには次の内容のgzip関連の設定が行われています。gzip関連の設定の参考になると思います。

gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

バーチャルサーバの読み込み

include /etc/nginx/conf.d/*.conf;

この例では/etc/nginx/conf.dディレクトリにある拡張子がconfのファイルを読み込みます。conf.dディレクトリにはバーチャルサーバ毎の設定ファイルを置きます。

このバーチャルサーバ毎の設定については次回で紹介します。特にserverコンテキストおよびlocaltionコンテキストにおけるディレクティブについて説明します。

株式会社ハートビーツのインフラエンジニアから、ちょっとした情報をお届けします。