Nginx でバーチャルホストの設定を行います。いわゆるIPベースでのバーチャルホストの設定をしようとしてWebを漁っても名前ベースのものしか出てこないな~なんて思っていたら、Nginx ではそんな概念は必要ないらしい。
技術的情報としては基本的な部類に入るけど、いつもあれどうやるんだっけとなるのでまとめておきます。
バーチャルホストの設定
冒頭に記載したとおり、IPベースで構築します。
検証でいくつもアクセス先をつくりたいのですが、VM環境といえどもホストマシンでNICを追加して、、、なんてことは面倒なので、ゲスト環境内でIPアドレスを追加して対応します。
IPの追加は「IP 追加 Linux」などでぐぐるといっぱい出てきますので割愛します。
ip コマンドで確認すると以下の用に表示されている状態です(local loopback は省いた表示)
1 2 3 4 5 6 7 8 9 10 |
# ip a 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:1c:bb:d7 brd ff:ff:ff:ff:ff:ff inet 192.168.2.30/24 brd 192.168.2.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.2.31/24 brd 192.168.2.255 scope global secondary ens33:1 valid_lft forever preferred_lft forever inet 192.168.2.32/24 brd 192.168.2.255 scope global secondary ens33:2 valid_lft forever preferred_lft forever |
今回は、192.168.2.30 はホスト用のIPとして保持するのでWebサーバとしては使用しない。192.168.2.31 と 192.168.2.32 をそれぞれWebサーバ1号機と2号機として使用する想定です。
で、実際の設定は以下です。Server コンテキスト は複数記載できるんですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
### Virtual Host 1 server { listen 192.168.2.31:80 ; server_name hoge1.com ; access_log /var/log/nginx/hoge1.com.access.log main; location / { root /var/www/hoge1; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } ### Viertual Host 2 server { listen 192.168.2.32:80 ; server_name hoge2.com ; access_log /var/log/nginx/hoge2.com.access.log main; location / { root /var/www/hoge2; index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } |
説明をしていきます。
listen ディレクティブ
待ち受けポートを指定します。今回やりたかったIPベースでの設定はここにIPを指定するだけで可能。ドメインを指定できるなら(hosts に書くでも同じですが)ここはポートだけ書いておけば動きます。
https の場合には以下の様に指定します。
1 2 3 4 |
server { listen 443 ssl ; server_name hoge.com; : 略 |
http/2 を使いたいなら以下のように指定します。
1 2 3 4 |
server { listen 443 ssl http2 ; server_name hoge.com; : 略 |
また、今回はIPベースなので使っていませんが、default_server というパラメータがあって理解しておくべきだと思ったので最後にまとめまておきました。
server_name ディレクティブ
Webサーバのドメインを指定します。指定する必要が無い場合は、"" や _(アンダーバー) で問題無しです。もっと言えばディレクティブ自体が記載されていなくも動きます。
また、ワイルドカードが使用できます。
例えば、以下のように記載することでサブドメインを置き換えることができます。
1 |
*.hoge.com |
使う用途はあまりないかもしれませんが、同じようにトップレベルドメインを置き換えることもできます。(以下)
1 |
foo.hoge.* |
他には以下のように記載することで、hoge.com と *.hoge.com にマッチさせることもできる。
1 |
.hoge.com |
access_log ディレクティブ
バーチャルホストごとにアクセスログを分けたいのでそれぞれのコンテキストに記載をしています。出力を分ける場合はログファイル名も別の名前を指定します。同じファイル名でもエラーにはならないので注意。
location ディレクティブ
ドキュメントルートとディレクトリインデックス。
error_page ディレクティブ
エラー時のページですね。エラーとして扱われるレスポンスコードが発生した場合に返却するページを指定します。デフォルトでも /usr/share/nginx/html/ に用意されています。ちなみにこのディレクトリがデフォルトのドキュメントルートです。
default_server パラメータについて
listen ディレクティブに記載するパラメータですが、ちゃんと理解してちゃんと設定する必要があるなぁと思ったのでまとめておきます。
リクエストヘッダーの host フィールドと Nginx の server_name が一致しない場合に、参照させる server_name を指定するための設定です。この記述が無いとダウンしているバーチャルホストに対してリクエストが来た場合に、最初に記載された(読み込まれた)サーバーに振り分けられます。
例えば以下の設定がされていて、hoge3.com がダウンしているときに、hoge3.comへのリクエストが来た場合は hoge1.com に送られてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 80 ; server_name hoge1.com ; } server { listen 80 ; server_name hoge2.com ; } server { listen 80 ; server_name hoge3.com ; } |
以下のように default_server が設定されている場合は、hoge2.com に送られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 80 ; server_name hoge1.com ; } server { listen 80 default_server ; server_name hoge2.com ; } server { listen 80 ; server_name hoge3.com ; } |
対策としては、どの server_name にも当てはまらない場合は、コネクションを即クローズするという設定をしておいた方がいいんじゃないかと。default_server のserverコンテキストに「return 444」を記載することで設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
### Virtual Host 1 server { listen 80 ; server_name hoge1.com ; } ### Viertual Host 2 server { listen 80 ; server_name hoge2.com ; } ### Viertual Host 3 server { listen 80 ; server_name hoge3.com ; } ### Connection Close server { listen 80 default_server; server_name _ ; return 444 ; } |
おまけでした。以上です。
↓↓↓ 持っていると便利な一冊。