nginxの設定 その1
nginxを稼働していくにあたり、nginxの設定について確認していきます。ここでは、インストール時に作成される設定ファイルの設定内容について一つずつ確認していきたいと思います。
設定ファイルについて
yumなどのパッケージシステムを使ってnginxをインストールすると、nginxの設定ファイルを配置するディレクトリは次のディレクトリとなります。このディレクトリ配下に設定ファイルを配置します。
/etc/nginx
|- /conf.d/
|- /default.d/
|- nginx.conf
・・・
nginxの設定は、/etc/nginxディレクトリのnginx.conf設定ファイルに設定していくこともできますし、他のファイルから設定を読み込むincludeディレクティブを次のような内容でnginx.confに記述して、conf.dというサブディレクトリ内の拡張子がconfであるファイルを読み込み設定を行うことも出来ます。
include /etc/nginx/default.d/*.conf;
インストール時に作られる設定ファイルを確認すると、conf.dにはモジュール関係の設定を配置しdefault.dにはバーチャルホストの設定をするようコメントが書かれています。
nginxの設定ファイル用ディレクトリには、インストール時に次のファイルも作成されています。
- fastcgi.conf
- FastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定など。
- fastcgi_params
- FastCGI用の変数を定義するファイル。fastcgi_paramディレクティブの設定など。(fastcgi.confと同じ?)
- koi-utf
- ロシア語のキリル文字koi8-rとUTF-8の文字コードのマッピングを行うファイル。
- koi-win
- ロシア語のキリル文字koi8-rとwindows-1251の文字コードのマッピングを行うファイル。
- mime.types
- MIMEタイプと拡張子の関連付けを設定するファイル。
- scgi_params
- SCGI用の変数を定義するファイル。scgi_paramディレクティブによる設定など。
- uwsgi_params
- uWSGI用の変数を定義するファイル。uwsgi_paramディレクティブによる設定など。
- win-utf
- ロシア語のキリル文字windows-1251とUTF-8の文字コードのマッピングを行うファイル。
これらは、必要に応じてincludeディレクティブで読み込みます。
設定ファイルの書き方
設定ファイルは、ディレクティブとそのパラメータで構成されています。単一行のディレクティブはセミコロンで終わり、その他のディレクティブは関連するディレクティブをグループ化して中括弧({})で囲んだブロックとして記述します。
ディレクティブの中でもコンテキストと呼ばれるいくつかのトップレベルディレクティブは、次のようなものが用意されておりグループとして記述します。このコンテキストは、nginxにおけるモジュールの分類と関連がありモジュールの分類は、次のコンテキストにcoreを追加した5つに分類されます。
コンテキスト | 内容 |
---|---|
event | イベント処理に関する設定(coreに含まれる) |
http | httpに関する設定 |
mailに関する設定 | |
stream | TCPの処理に関する設定(TCPロードバランシング等) |
これらのコンテキストの外側には、coreモジュールに関する設定があり、プロセスの制御や設定ファイル、ログに関する設定を記述します。
coreモジュールに関連する設定
events {
eventモジュールに関連する設定
}
http {
httpモジュールに関連する設定
}
mail {
mailモジュールに関連する設定
}
stream {
streamモジュールに関連する設定
}
httpコンテキストは、バーチャルホスト毎の設定を行うserverディレクティブ、URI毎の設定を行うlocaltionディレクティブにより階層化され、次のような構成となります。
http {
httpモジュールの設定
server {
サーバ毎の設定
location PATH {
URI毎の設定
}
location PATH {
URI毎の設定
}
...
}
server {
...
}
}
各ディレクティブについて
ここからは、インストール時に作成される設定ファイルを基にして各ディレクティブについて見ていきます。
全般的な設定(core)
まず、全般的な設定であるcoreについて確認していきます。
いちばん外側に記述できる設定は、コアモジュールで提供されるディレクティブとなります。ここで確認するディレクティブ以外にどのようなディレクティブがあるかは次のサイトで確認することができます。
それでは、順に確認していきます。設定ファイルnginx.confの最初には次の設定が書かれています。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
この設定が何を行っているのか一つずつ確認していきます。
userディレクティブ (実行ユーザの設定)
userディレクティブは、nginxのworkerプロセスを実行する権限のあるユーザを設定します。
user nginx;
この例では、nginxというユーザで実行します。psコマンドで確認するとnginx: worker processがnginxユーザで動作していることを確認することができます。
# ps -aux | grep [n]ginx
root 2417 0.0 0.2 122272 2244 ? Ss 7月06 0:00 nginx: master process /usr/sbin/nginx
nginx 2420 0.0 0.3 122728 3792 ? S 7月06 0:00 nginx: worker process
worker_processesディレクティブ (workerのプロセス数を設定)
worker_processesディレクティブは、nginxのworkerプロセスの数を設定します。workerプロセスの数は、CPUのコア数より多く設定してもパフォーマンスは上がらないとのことです。
この例では、workerプロセスの数を自動検出により設定するように設定されています。
worker_processes auto;
error_logディレクティブ(エラーログの出力先とロギングレベルの設定)
error_logディレクティブは、エラーログの出力先ファイル名とロギングのレベルを指定します。このディレクティブは、main, http, server, locationのどのコンテキストでも設定でき、必要に応じてエラーログの出力先を変えることができます。 ロギングレベルは、オプションとなっておりdebug, info, notice, warn, error, crit, alert, emergを指定することができます。省略した場合は、errorが適用されます。
この例では、/var/log/nginx/error.logへログを出力します。
error_log /var/log/nginx/error.log;
pidディレクティブ(PIDの保存先を設定)
pidディレクティブは、メインプロセスのプロセスIDを格納するファイルを設定します。
この例では、nginxのメインプロセスのプロセスIDを/run/nginx.pidに保存します。
pid /run/nginx.pid;
includeディレクティブ(モジュールの読み込み)
includeディレクティブは、外部の設定ファイルを読み込むよう指定します。
この例では、/usr/share/nginx/modules/ディレクトリにある設定ファイルを読み込みます。
include /usr/share/nginx/modules/*.conf;
/usr/share/nginx/modules/ディレクトリには、次のファイルがインストールされており各モジュールが読み込まれるよう設定されています。
- mod-http-geoip.conf
- mod-http-image-filter.conf
- mod-http-perl.conf
- mod-http-xslt-filter.conf
- mod-mail.conf
- mod-stream.conf
eventsコンテキスト
eventsコンテキストでの設定について確認していきます。eventsコンテキストは接続処理に関する設定を行います。
設定ファイルnginx.confのeventsコンテキストには次の設定が書かれています。
events {
worker_connections 1024;
}
worker_connectionsディレクティブ(最大同時接続数を設定)
worker_connectionsディレクティブは、1つのworkerプロセスが同時に処理できる最大接続数を設定します。初期設定ではworker_connectionsは1024に設定されており、通常のブラウザでは一回の接続につき複数のコネクションを消費します。例えば、1つの接続につき2コネクション消費する場合、worker1つあたりの最大同時接続数は512となります。
この例では、一つのworkerあたり最大1024個のコネクションを処理します。
worker_connections 1024;
コネクション数を増やしたい場合は、OSに設定された使用可能な資源を確認・設定しておくよ良いそうです。
# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3819
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024 ← 影響するパラメータ
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 3819 ← 影響するパラメータ
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
最大同時接続数を増やす場合は、open files とmax user processesが影響をするため、次のコマンドで設定を変更します。
# ulimit -n [設定したい数値]
# ulimit -u [設定したい数値]
httpコンテキスト
httpコンテキストでの設定について確認していきます。
httpコンテキストに記述できる設定はhttpモジュールで提供されるディレクティブが主なものになります。httpモジュールの種類とディレクティブについては次のサイトにて確認することができます。
設定ファイルnginx.confのhttpコンテキストには次の様に設定が書かれています。
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
...省略
}
この設定が何を行っているのか一つずつ確認していきます。
log_formatディレクティブ
log_formatディレクティブは、書き込まれるログのフォーマットを設定します。
この例では、フォーマットにmainという名前を設定し、出力するパラメータを設定しています。このmainという名前は、後に出てくる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"';
access_logディレクティブ(アクセスログの出力先を設定)
access_logディレクティブは、アクセスログの出力先ファイル名を指定します。このディレクティブは、http, server, location, limit_exceptのコンテキストに設定でき、必要に応じてログの出力先を変えることができます。
この例では、mainという名前でlog_formatディレクティブに定義した形式で/var/log/nginx/access.logへ出力されます。
access_log /var/log/nginx/access.log main;
sendfileディレクティブ
sendfileディレクティブは、コンテンツファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかどうかを設定します。sendfile()を使うとノンブロッキングI/Oが使用されるそうです。
この例では、sendfile()を利用するように設定されています。
sendfile on;
tcp_nopushディレクティブ
tcp_nopushディレクティブは、sendfileが有効なときにFreeBSDの場合はTCP_NOPUSHソケットオプション、Linuxの場合はTCP_CORKソケットオプションを使うかどうかを設定します。
この例では、tcp_nopushを利用するように設定されています。
tcp_nopush on;
tcp_nodelayディレクティブ
tcp_nodelayディレクティブは、TCP_NODELAYソケットオプションを使うかどうかを設定します。このオプションは、接続がキープアライブ状態に移行した場合にのみ有効です。
この例では、cp_nodelayを利用するように設定されています。
tcp_nodelay on;
keepalive_timeoutディレクティブ
keepalive_timeoutディレクティブは、サーバ側でのキープアライブのタイムアウトの秒数を設定します。
この例ではキープアライブのタイムアウトを65秒に設定しています。
keepalive_timeout 65;
types_hash_max_sizeディレクティブ
types_hash_max_sizeディレクティブは、コンテンツ配信などの最適化に利用するハッシュテーブルのサイズを設定します。
この例では、ハッシュテーブルのサイズを2048バイトに設定しています。
types_hash_max_size 2048;
mime.typesの読み込み
この例では、/etc/nginx/mime.typesを読み込んでいます。
include /etc/nginx/mime.types;
mime.typesファイルの内容は、次の様にtypesディレクティブに設定されます。
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
...
default_typeディレクティブ
default_typeディレクティブは、デフォルトで応答するMIMEタイプを設定します。
この例では、デフォルトのMIMEタイプがapplication/octet-streamとなります。
default_type application/octet-stream;
conf.d/ディレクトリにある設定ファイルの読み込み
この例では、/etc/nginx/conf.d/にある設定ファイルを読み込みます。インストール後の状態では、ファイルが存在しないため何も読み込まれません。
include /etc/nginx/conf.d/*.conf;
serverディレクティブ
serverディレクティブは、バーチャルホストの設定となります。が、大分長くなりましたので、「nginxの設定 その2」で見ていきたいと思います。