お金をかけずにサーバーの勉強をしよう

NGiNXでバーチャルホストを使ってみる

2024年1月21日

メニューへ戻る

仮想ホスト機能を使って 1台の WEBサーバーで複数のホームページを提供します。

ホームページが一般になってきたばかりの頃は、回線は細いしサーバーリソースも貧弱だったので、1つのサーバー機を 1つのテーマの WEBサーバーにするのがやっとこ。
昔の WEB 1

Apache全盛で、公開範囲が 1つ(ドキュメントルートが 1つ)であったと記憶しています。
昔の WEB 2

ホームページが流行り出してくれば、ホームページでもっと多くのテーマで発信したいと思うのが人情です。

しかしサーバー機は安くありませんし、ホームページごときのために 1台買い増すなんて無理というのもまた当たり前でした。

以下のようにディレクトリ(フォルダ)で分けるなど、涙ぐましい努力をしていたような気がします。(うろ覚え)
http://subro.mokuren.ne.jp/lightan
http://subro.mokuren.ne.jp/polimar

図だとこんな感じで。
昔の WEB 3

でもこれだと運用主体が同じ人(組織)って分かっちゃうんですよね。
中の人が透けて見えるとちょっと…って事情もありました。

しかし世間のホームページ作成の熱は冷めやらず「1台でもっとたくさんのテーマのホームページを作れれば良いのに…」という多くの人の願いが、バーチャルホスト機能を生み出したと言うわけです。
(多分こんなストーリーだと思います。想像だけで書きました、スンマセン。)

技術の進歩とともに、回線もハードウェアも強力になってきて、サーバー側も余裕が出てきます。
昔の WEB 4

そんな中で朗報が。
具体的には HTTP/1.1でリクエスト情報に Hostヘッダ(URLに何と入れてアクセスしたか)を付けることが規定されまして、「名前ベースのバーチャルホスト」が使えるようになりました。

それまではお目当てのホームページにアクセスするのに使われていたのは以下の 2つの情報で、どこのサーバーかが決まれば「そこのホームページを見る」ってだけでした。


これに Hostヘッダの情報がリクエストに加えられることにより、Apache・IIS・NGiNXなどの WEBサーバーアプリケーションは、「何て URLを指定してここにやってきたのか」を判断して、違う内容のホームページを見せることができるのです。

具体的には得られた URLと独立した公開範囲(ドキュメントルート)の紐付けができるようになったんですね。
これだとお互いに乗り入れできないので、同じ運用主体とは中々分からないです。
昔の WEB 5

例えば、DNSが「http://lightan」と「http://polimar」という URLに対して同じ IPアドレスを返したにしても、URLが違うので WEBサーバープログラムはちゃんと別物として扱ってくれるという訳です。

これもまた論より証拠でやってみましょう。


NGiNXでバーチャルホストを作るには、
・それぞれのドキュメントルートを作っておく
・どういうURL(ドメイン)でアクセスさせるか決めておく
が必要です。

ここでは以下のようにします。

URLドキュメントルート
lightan.local/var/www/lightan
polimar.local/var/www/polimar

それぞれのドキュメントルートにあたるディレクトリに適当に [index.html]ファイルを作っておきました。

subro@UbuntuServer2204:/var/www$ ls -l lightan polimar
lightan:
合計 8
-rw-r--r-- 1 root root 7776  8月  8 17:58 index.html

lpolimar:
合計 12
-rw-r--r-- 1 root root 9400  8月  8 17:58 index.html

次に NGiNXのバーチャルホスト用設定ファイルを作ります。

[/etc/nginx/sites-available]ディレクトリに設定ファイルを作るのですが、ここにある [default]ファイルの中にバーチャルホスト設定の雛形が書いてありますので、このファイルをコピーして作ると楽です。

subro@UbuntuServer2204:/etc/nginx/sites-available$ ls -l
合計 4
-rw-r--r-- 1 root root 2412  8月 25  2020 default

ファイル名は何でも良いようなんですが、分かりやすくするため URLまんまにしておきました。

subro@UbuntuServer2204:/etc/nginx/sites-available$ ls -l
合計 12
-rw-r--r-- 1 root root 2412  8月 25  2020 default
-rw-r--r-- 1 root root  323  8月  8 18:01 lightan.local
-rw-r--r-- 1 root root  323  8月  8 18:02 polimar.local

lightanのほう

subro@UbuntuServer2204:/etc/nginx/sites-available$ cat lightan.local
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
server {
        listen 80;
        listen [::]:80;

        server_name lightan.local;

        root /var/www/lightan;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}

polimarのほう

subro@UbuntuServer2204:/etc/nginx/sites-available$ cat polimar.local
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
server {
        listen 80;
        listen [::]:80;

        server_name polimar.local;

        root /var/www/polimar;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}


次に、作った設定ファイルを指すシンボリックリンクを [/etc/nginx/sites-enabled]ディレクトリ以下に作ります。

NGiNXは起動時にこのディレクトリにある設定ファイルを全て読み込みます。
すなわちここにあるシンボリックリンクが指すファイルが起動時に読まれる設定ファイルということになります。

作業前の状態では、[default]ファイルを指すシンボリックリンクがあるので分かりやすいと思います。

subro@UbuntuServer2204:/etc/nginx/sites-enabled$ ls -l
合計 0
lrwxrwxrwx 1 root root 34  7月 27 17:51 default -> /etc/nginx/sites-available/default

シンボリックリンク名も何でも良いようですが、とりあえず URLまんまにしています。

subro@UbuntuServer2204:/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/lightan.local lightan.local

subro@UbuntuServer2204:/etc/nginx/sites-enabled$ sudo ln -s /etc/nginx/sites-available/polimar.local polimar.local

subro@UbuntuServer2204:/etc/nginx/sites-enabled$ ls -l
合計 0
lrwxrwxrwx 1 root root 34  7月 27 17:51 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root 40  8月  8 18:04 lightan.local -> /etc/nginx/sites-available/lightan.local
lrwxrwxrwx 1 root root 40  8月  8 18:04 polimar.local -> /etc/nginx/sites-available/polimar.local

できました。

NGiNXを再起動します。

subro@UbuntuServer2204:~$ sudo systemctl restart nginx

これで WEBサーバー側の作業は完了です。


Ubuntu Desktop 22.04の Firefoxで Ubuntu Server 22.04の NGiNXにアクセスさせます。

この際に Ubuntu Desktop 22.04上では、
[http://lightan.local] [http://polimar.local] という URLを IPアドレスに変換できないといけませんが、私の環境にはローカルDNSがないので [/etc/hosts]ファイルを使います。

ピンク部分を追加しました。

subro@Ubuntu2204:~$ cat /etc/hosts
# Host addresses
127.0.0.1  localhost
::1        localhost ip6-localhost ip6-loopback
ff02::1    ip6-allnodes

192.168.1.108   UbuntuServer2204 lightan.local polimar.local


では WEBブラウザでアクセスしてみます。

まずサーバー名で。
サーバー名でアクセス
NGiNXのデフォルトのページが表示されました。

lightan.localでアクセス。 lightan.localでアクセス
予定のホームページになりました。

polimar.localでアクセス。 polimar.localでアクセス
こちらも予定のホームページになりました。


上手くいきました。
1つのサーバー・1つの NGiNXで、3つの URLを捌いたことなりますね。


==========
昨今ではホームページを展開するのはそういうホスティングサービスを使うことが殆どと思いますが、例えばパブリッククラウド上の IaaS仮想マシンが 1つしかないけど複数の URLを捌きたいなんて要件があるときには NGiNXに限らず、「バーチャルホスト」「仮想ホスト」という機能がどの WEBサーバーにもあろうと思いますので、それを使ってみて下さい。


NGiNX本はもう出尽くしちゃってる感じで、以下も 2020年と 2021年の本です。
NGiNXのシェアは増え、かつ機能拡充を進めていますので、暫くしたら新しい本が出るかも知れません。