今回と次回の2回に分けてnginxの設定について紹介します。今回の前半は設定ファイルの構成について、後半は設定ファイルのサンプルを元に設定ディレクティブについて説明を行います。
設定ファイルについて
パッケージシステムからnginxをインストールすると、nginxの設定ファイル用のディレクトリは通常は/etc/nginxになります。このディレクトリに設定ファイルnginx.confを配置します。
さらに、他のファイルから設定を読み込むincludeディレクティブを次のような内容でnginx.confに記述して、conf.dというサブディレクトリ内の拡張子がconfであるファイルを読み込む設定を行うことがよくあります。
include /etc/nginx/conf.d/*.conf;
その他に次のようなファイルもインストールされます。
mime.types | MIMEタイプと拡張子の関連付けを定義したファイル。 |
fastcgi_params | FastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定集。 |
fastcgi.conf | fastcgi_paramsと同じ。パッケージによっては同梱されない場合もある。 |
scgi_params | SCGI用の変数を定義するファイル。scgi_paramディレクティブによる設定集。 |
uwsgi_params | uWSGI用の変数を定義するファイル。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 | イベント処理に関するモジュール |
http | httpに関するモジュール |
mailに関するモジュール |
ディレクティブはこのモジュールのカテゴリ毎に記述します。ただし、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モジュールとディレクティブがあるかは次のサイトで確認できます。
- Module Reference(nginx.org)のngx_httpで始まるモジュール
- Modules(Nginx Wiki)の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コンテキストにおけるディレクティブについて説明します。