前回はnginxのインストールを行い、サンプルページを表示させる所まで行いました。
ここでサンプルページのファイルを差し替えれば、自分のWebページを公開することが出来ます。
しかし、サンプルページはどこにあるのでしょう。
また、もともとサンプルページが置いてあった場所以外にはWebページに表示するファイルを置くことは出来ないのでしょうか。
設定ファイルを確認・編集することでこのような問題を解決出来ます。
この記事で行うこと
1. nginxの設定の構成
1-1.ファイルの構成
nginxの設定ファイルは nginx.conf
と conf.d/
ディレクトリ内にある拡張子が .conf
のファイルに分かれています。
nginx全体に関わるメインの設定ファイル nginx.conf
、各バーチャルホストの設定が conf.d/
内のファイルとなります。
conf.d/
内の設定ファイルは後述する include
部分によって nginx.conf
に読み込まれます。
1-2. コンテキストの構成
nginxの設定はコンテキストと呼ばれる{ }で囲われたブロックの入れ子になっています。コンテキストによって設定できる項目が異なります。
主なコンテキストは以下の通りです
- mainコンテキスト:どのブロックにも囲われていない部分です。nginx全体として常に参照される設定を内包します。
- eventsコンテキスト:サーバが接続されるなど何かイベントが起きたときに参照する全般的な部分を設定します。
- httpコンテキスト:Webサーバに関する部分を設定します。nginxはWebサーバ以外にもロードバランサーやメール用のプロキシサーバ機能としての機能を持つため、Webサーバに関する設定はhttpコンテキスト内に記載する必要があります。
- serverコンテキスト:各ホスト特有の設定を行います。nginxでは同じサーバでもアクセスされたドメインによって動作を変える事が出来ます。
www.example.com
とblog.example.com
で両方とも同じサーバに接続されるものの、前者はHTML直置きで作ったWebサイトに、後者はWordPressで作ったブログにといった具合です。これがバーチャルホストです。 - locationコンテキスト:各ディレクトリ特有の設定を行います。例えばあるページだけパスワードを入れないと入れないようにする、あるページはPHPを使っているのでPHP実行環境に処理を引き渡すなどです。
mainコンテキスト内にeventコンテキストとhttpコンテキストが存在し、httpコンテキスト内には複数のserverコンテキストが存在し、serverコンテキスト内には複数のlocationコンテキストが存在するという構成です。
2. nginx設定ファイルの意味
実際に設定ファイルを見ていきましょう。
なお実際の設定ファイルよりも簡略化されていますが、省いているのはオプション的な設定のため、掲載している設定ファイルでも動くようになっています。
2-1. nginx.conf
nginxの公式リポジトリからインストールした場合、 /etc/nginx/nginx.conf
がメインの設定ファイルとなります。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
まずはmainコンテキストです。
- user:nginxの処理を実行するユーザです。これがnginxとなっているため、nginxというユーザにアクセス権がないファイルはnginxでは扱えません。
- worker_processes:nginxの処理を行うCPUスレッドの数です。1の場合はシングルコアで動かしている事になります。基本的にはサーバで使えるCPUのスレッド数に合わせます。ちなみにautoで自動設定も出来ます。
- error_log:エラーログの出力先と、どのレベルのエラーからログを出力するかの設定です。この場合「警告」以上のエラーを
/var/log/nginx/error.log
に出力します。 - pid:nginxのプロセスIDが格納されているファイルを指定します。プロセスIDはプログラムを識別するための連番です。例えば、プログラムを停止したい際に、名前が同じ別のプログラムを停止することがないように使います。
次はeventコンテキスト。
- worker_connections:ひとつの
worker_process
で何個まで接続を許すかという設定です。とりあえず個人サーバの場合は一旦1024で十分でしょう。
次にhttpコンテキストです。
- default_type:MIMEタイプが設定されていない拡張子が出た際に、どのMIMEタイプとして扱うかを設定します。MIMEタイプはそのファイルの内容が文書か、画像か、動画かといった内容を示す情報です。
application/octet-stream
は任意のバイナリデータ、つまり何か分からないということです。普通はその上の行でinclude(後述)されている/etc/nginx/mime.types
内で設定されているはずなので、そこからあぶれた未知のファイルという事ですね。 - log_format:ログの出力形式を設定できます。log_formatは複数設定出来ます。
- access_log:アクセスログの出力先と出力形式を設定できます。今回は
/var/log/nginx/access.log
にすぐ上のlog_formatで設定したmain
という出力形式で出力する設定になっています。 - keepalive_timeout:接続のタイムアウト時間を設定します。長く設定するほどタイムアウトで接続が途切れてしまうことが減りますが、よりリソースを使います。
- include:別の設定ファイルから設定を読み込むものです。
include /etc/nginx/mime.types;
は拡張子とMIMEタイプの関連付けを行うファイルで、include /etc/nginx/conf.d/*.conf;
はconf.d/
内にあるバーチャルホストの設定を読み込むものになります。つまり、conf.d/
内の設定ファイルは全てこの部分に展開される事になります。
serverコンテキストと、locationコンテキストはnginx.conf
内には記載がありませんでした。
これは、バーチャルホスト毎に /etc/nginx/conf.d/
内に設定ファイルを作ってincludeでhttpコンテキスト内に読み込ませた方が管理が楽だろうという考え方からです。
nginx.conf
にはserverコンテキストを書き込めないという事ではないので、例えばバーチャルホストがひとつだけでわざわざ別のファイルを作って管理する必要もない場合は直接 nginx.conf
に書き込むことも出来ます。
2-2. conf.d/default.conf
nginx.conf
内に記載されている include /etc/nginx/conf.d/*.conf;
によって読み込まれる設定ファイルの一つです。
他にも同じディレクトリに .conf
と拡張子の付くファイルを作成すると、同様に nginx.conf
に読み込まれます。
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
では、serverコンテキストから見ていきましょう
- listen:利用するポート番号を選択します。
一般的にはHTTP接続は80番ポート、HTTPSは443番ポートとなります。それ以外のポートを指定した場合、ブラウザから接続する際には明示的にポート番号を入力する必要があるため不便です。
SSL(TLS)やHTTP2を利用する場合はそれも記載します。
また、server_name
で設定されていないアドレスで接続してきた場合に利用したいコンテキストにはdefault_server
を付けます。default_server
が付いたコンテキストがない場合は最初のserverコンテキストに繋がってしまいます。
全部付けるとlisten 443 ssl http2 default_server;
といった具合になります。 - server_name:ここにはどのアドレスでこのサーバにたどり着いた際にこのコンテキストの設定を適用するかを記載します。
ここにwww.example.com
と記載すると、www.example.com
宛てに接続したときだけこのコンテキストの設定が適用されて、IPアドレスで直接接続してきたときには適用しないといった具合です。
これにより、1つのサーバでも複数のサーバを運用しているかのように扱えます。 - error_page:エラーがあった際にどのページに遷移させるかを設定します。
適用したいエラー番号を書き連ね、最後にそのエラーがあった際にどのページに遷移させるかを書きます。
この場合は例えばhttp://localhost
で500,502,503,504エラーが発生した際にはhttp://localhost/50x.html
に遷移することになります。
最後にlocationディレクトリです。
locationディレクトリの設定はlocationの直後に書かれているアドレスの時に有効になります。
例えばサーバのアドレスが http://localhost
の場合で、location /home { }
に囲われた部分は http://localhost/home
の時に適用されるといった具合です。
では、設定の中身を見ていきましょう。
- root:このlocationの時に参照するディレクトリです。基本的にこのディレクトリの中にあるファイルはその構造のままで参照できます。
今回の設定の場合、/usr/share/nginx/html/hogehoge/webpage.html
というファイルがあった場合、http://localhost/hogehoge/webpage.html
に接続すれば見ることが出来ます。 - index:このlocationに接続されたときに既定で表示するページを選びます。最初から
http://localhost/index.html
宛てに接続してくれれば困ることは無いですが、多くの場合http://localhost/
で止めることが多いのではないでしょうか。こういうときにどのファイルを表示すべきかを指定するものです。
まとめ
今回説明したのは最低限の、静的Webページを表示するための設定となります。
他にも、PHPの実行を他に回すための設定や、SSLの設定、キャッシュの設定などなど様々な設定がありますが、これは随時説明していきたいと思います。
今回は、
- 設定ファイルはnginx.confというメインの設定ファイルとconf.dディレクトリにある個別の設定ファイルがあること。(あと管理しやすいように分けているだけで、別に分けなくても動くこと)
- 設定にはコンテキストという概念があって入れ子になっていること。
の二点だけ最低限覚えてもらえればと思います。
次回はWebページの暗号化(SSL/TLS接続の有効化)について説明したいと思います。