nginx その2 -バーチャルホストのお話-

2022年5月29日

今回はnginx設定のお話のお話です。
今回はバーチャルホスト周りの設定をまとめていきたいと思います。

バーチャルホストってなに?

バーチャルホストとは、一つのWebサーバ(nginx)を複数のWebサーバのように見せる方法となります。
これはnginx特有の機能ではなく、apacheもIISでもできます。
Webサーバを作ったときに、1つのWebサイトしか作れないと勿体なくないですか?WebサーバのCPUやメモリはまだまだ余裕があるのに、1個しか作れないとリソースが無駄になっちゃいますよね?なら、一つのWebサイト上にいくつかディレクトリ作って分けることならってできないことはないですが、微妙じゃないですか?
以下のような感じだとカオス状態ですよね?「ticktack.biz」ってなんのサイト?ってなりませんか?
仮にレンタルサーバを契約して、割り当てられたWebサーバ上に、偶然にお兄さんむけのエッチなサイトがあって、そのドメインと同じドメインで子供向けのキッズサイトの運営なんて出来るわけ無いですよね。。
本人は気づかないかもしれませんが、Google検索したときに、エッチなサイトと同じドメイン名だと知らない人からすると真面目なWebサイトほど大丈夫かな?このサイトって思われてしまいますね。Google先生の評価(SEO)的にもデメリットしかないですよね。
現実においても少し前に都内の雑居ビルに、大人のお店と女の子向けのファンシーショップが同じフロアにあって問題になったのと同じです。


個人のブログやWebサイトだって、私のサイトのように自分でドメインとってそのURLでアクセスしたいわけですよね。
特に、ブランドイメージを大事にしているお店やさん、企業さんなら、自社のドメインはもちろん、新製品のドメインとって、マーケティング用のWebサイト作りたいですよね?
そんなときに、使う仕組みがバーチャルホストです、1つのWebサーバをマンションのように各部屋(Webサイト)分けて、各部屋に表札(ドメイン名)つけたければつけられます。って感じです。
以下のようにWebサイト毎に違うドメイン名でWebサイトを分けて作ることが出来るようにする仕組みがバーチャルホストといいます。

バーチャルホストの仕組み

バーチャルホストに関しては名前付きバーチャルホストとIPベースのバーチャルホストがあります。
名前付きバーチャルホストとは、先程の例のように1台のWebサーバ上に複数のドメイン名を持つようなWebサーバで、WebサーバはクライアントがアクセスしてきたときのURLのドメイン情報を見てどのWebサイトを表示すればよいか振り分けてくれます。
一方、IPベースのバーチャルホストとはWebサーバに複数のIPアドレスをもたせて、アクセスしてきたIPアドレス毎にWebサイトを振り分けます。
多く使われているのは、名前付きバーチャルホストです。WebサーバはIPアドレス一つで住みますし、あとからドメインを取得して追加するにも、ドメイン名に従った追加設定だけすれば動いてくれます。
企業さんで新商品のコマーシャルサイトを作る際に商品名のドメインを次々にとっても同じWebサーバ上にWebサイトを作れちゃうわけです。また、外から見ると同じWebサーバで動いているなんてわからないですし。
また、IPアドレスベースが少ないかというと、そもそもブラウザでアクセスする際にIPアドレス直打ちでアクセスするようなサイトがないことから、あまり使われることがありません。さらにグローバルIPアドレス(インターネット上のIPアドレス)は取得するのにお金がかかるので社内の部門サーバでもない限り使うことはないと思います。

nginxのバーチャルホスト設定

だらだら前書きを書いてしまってすいません。
それでは本題のnginxのバーチャルホスト設定について見ていきましょう。
バーチャルホストの設定は、前回の記事でも触れた「sites-available」ディレクトリに定義ファイルを作成し、「sites-enabled」ディレクトリにシンボリックリンクを作成することでバーチャルホストが出来上がります。
ただ、Ubuntuサーバのnginxだとの話です。今回もUbuntu版を前提にまとめていきます。
一方、RHEL系のCentOSやAmalaLinuxの場合は、そもそも「site-XXXX」というディレクトリはないので、メインの設定ファイル「nginx.conf」で読み込まれる設定ファイルに書くか、nginx.conf自体に設定を書いてしまえばできます。

それでは、お試しとして、前回初期インストールが終わったnginxに対して、「http://tick.com」にアクセスすると「Welcome tick site!!!」と表示させてくれる、「tick.com」のバーチャルホストを作って見ましょう。

バーチャルホスト用のWebコンテンツディレクトリを作る

まずは、バーチャルホスト用のWebコンテンツの配置場所を作ります。
慣習的にデフォルトの配置場所は、「/var/www/html」となっていますが、特に制限もなく、アクセス権さえ、きちんとしていれば、どこに作っても構いません。
今回は、「/var/html/tick」として作ってみましょう。以下のような感じでできました。
ディレクトリはrootユーザでも構いませんが、そうした場合、rootユーザ以外でWebコンテンツ(htmlファイル等)をアップロードするときにrootユーザでログインする必要があるので、nginx等の実行ユーザや、Webサイト毎に一般ユーザを作ってそのユーザ権限にしておいたほうがメンテナンスは楽になると思います。

# バーチャルホスト用のコンテンツディレクトリを作る場所に移動する
$ pwd
/var/www
# バーチャルホスト用のコンテンツディレクトリを作る
$ sudo mkdir tick
$ ll
total 16
drwxr-xr-x  4 root root 4096 Mar 13 03:58 ./
drwxr-xr-x 14 root root 4096 Mar  6 07:41 ../
drwxr-xr-x  2 root root 4096 Mar  6 07:41 html/
drwxr-xr-x  2 root root 4096 Mar 13 03:58 tick/
# バーチャルホスト用のコンテンツディレクトリのアクセス権限をnginx実行用ユーザに設定する
$ sudo chown www-data:www-data tick
$ ll
total 16
drwxr-xr-x  4 root     root     4096 Mar 13 03:58 ./
drwxr-xr-x 14 root     root     4096 Mar  6 07:41 ../
drwxr-xr-x  2 root     root     4096 Mar  6 07:41 html/
drwxr-xr-x  2 www-data www-data 4096 Mar 13 03:58 tick/
# 動作テスト用のHTMLを作って配置します
$ cd tick
$ cat index.html 
<h1>Welcome tick site!!!</h1>

バーチャルホスト用の設定ファイルを作る

バーチャルホスト用の設定ファイルは以下のような感じで、nginx設定ファイルの「server」部をバーチャルホスト毎に作っていくことになります。個人的な設定上のオススメとしては、バーチャルホスト毎に設定ファイルを分けたほうが、バーチャルホストの追加、変更、削除時に他のバーチャルホスト設定を意図せず変更する可能性が減るのでファイル数は増えてしまいますが、安全面を考えるとファイルは分けたほうが良いと思います。

# バーチャルホスト用の設定ファイルの内容
$ sudo vi tick
$ cat tick
# 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 {
  #通信ポートの設定(IPv4のみ有効)
	listen 80;
  #	listen [::]:80;

  #名前付きバーチャルホストの設定
	server_name tick.com;

  #バーチャルホスト用のnginxログ出力ファイル設定
	access_log /var/log/nginx/tick_access.log;
	error_log /var/log/nginx/tick_error.log;

  #Webコンテンツのディレクトリ先
	root /var/www/tick;
	index index.html;

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

# nginxの設定ファイルの書き方にエラーがないかチェック(コマンド:nginx -t)
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok           # syntax is OKが出ればよい。
nginx: configuration file /etc/nginx/nginx.conf test is successful

バーチャルホストの有効化

前回まとめたときに触れましたが、Ubuntu版では「sites-enable」ディレクトリにファイルが存在するものをnginxは起動時に読み込みます。
今回は、先程作ったバーチャルホスト設定ファイルを読み込んでみましょう。

# sites-enableディレクトリにいることを確認します。
$ pwd
/etc/nginx/sites-enabled
$ ll
total 8
drwxr-xr-x 2 root root 4096 Mar  6 07:41 ./
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ../
lrwxrwxrwx 1 root root   34 Mar  6 07:41 default -> /etc/nginx/sites-available/default   #まだ標準のものしかないです。
# シンボリックリンクを設定します。
$ sudo ln -s /etc/nginx/sites-available/tick tick
$ ll
total 8
drwxr-xr-x 2 root root 4096 Mar 13 04:21 ./
drwxr-xr-x 8 root root 4096 Mar  6 07:41 ../
lrwxrwxrwx 1 root root   34 Mar  6 07:41 default -> /etc/nginx/sites-available/default
lrwxrwxrwx 1 root root   31 Mar 13 04:21 tick -> /etc/nginx/sites-available/tick    # ファイルができました!

確認

それでは準備が整ったので、nginxを起動してみましょう。すでに起動済みなら再起動しましょう。

#nginxを再起動する
$ sudo systemctl stop nginx
$ sudo systemctl start nginx

今回名前付きバーチャルホストの設定なので、アクセスするURLはドメインでないとバーチャルホストのWebサイトは表示されません。
ブラウザで表示を確認するPCに作った「tick.com」をテスト用のサーバのIPアドレスと教えてあげる必要があるので、PCのホストファイル(WindowsならC:\windows\system32\drivers\etc\hosts)にtick.comとテスト用サーバのIPアドレスを設定してください。
私は自分のPCはLinuxなので/etc/hostsファイルに以下の設定を追加しました。ちなみに動作確認終わったら消しておかないと、本当にドメインをとってアクセスする際に今回の動作確認設定が残っていると罠にかかるので気をつけてください。

# /etc/hosts にテスト用設定を入れる
$ sudo vi /etc/hosts
$ cat  /etc/hosts
127.0.0.1	tick.com
# 設定が有効になったかpingで試してみる。tick.comにpingを実行して、127.0.0.1にpingを打っていればOK
$ ping tick.com
PING tick.com (127.0.0.1) 56(84) バイトのデータ
64 バイト応答 送信元 localhost (127.0.0.1): icmp_seq=1 ttl=64 時間=0.044ミリ秒

それではブラウザで、「http://tick.com」にアクセスしてみると。
良かった、しっかり動作確認用のHTMLファイルが表示されました。

ちなみに、テスト用サーバのIPアドレス「http://127.0.0.1」でアクセスすると。
インストール後の標準設定のHTMLが表示されました。

おわりに

今回はバーチャルホストの設定に関して見ていきました。
思ったより簡単にバーチャルホスト設定が出来ると思いませんか?
次回もnginxに関してまとめてみたいと思います。では、良い週末を!