apacheのVirtualHostを使うと1つのサーバで複数のドメインを扱うことができるという話

apacheのVirtualHostを使うと1つのサーバで複数のドメインを扱うことができます。

ここでは実際にVirtualHostの設定をしつつ見ていきたいと思います。

概要

VirtualHostについて

apacheの設定でVirtualHostというものがあります。
これを使うと1つのサーバで複数のドメインを使うことができます。

例えば以下のような設定をすることで1つのサーバで2つのドメインを扱うことができます。

<VirtualHost *:80>
    DocumentRoot /var/www/web1.masaki-blog.net/
    ServerName web1.masaki-blog.net
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/web2.masaki-blog.net/
    ServerName web2.masaki-blog.net
</VirtualHost>

設定内容について少し説明

前述の様に設定すると
 ・web1.masaki-blog.net
というドメインでアクセスすると
 ・/var/www/web1.masaki-blog.net/
のファイルを
 ・web2.masaki-blog.net
というドメインでアクセスすると
 ・/var/www/web2.masaki-blog.net/
のファイルを参照するようになります。

ちなみにここで言うドメインとは正確にはリクエストヘッダ(ホストヘッダ)の情報のことになります。

例えばgoogleにアクセスした際は以下のヘッダ情報が付与されています。

Host: www.google.com

この「www.google.com」をVirtualHostでは見ています。

(なお、現在は「HTTP/2」になったためか「Host: 」ではなく「:authority:」になっていました。)

実際に構築してみる

理解しやすいように実際に環境を構築してみます。

設定ファイル(httpd.conf)

設定ファイルには以下の内容を記載しました。

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/htdocs/
</VirtualHost>

<Directory "/var/www/">
    Require all granted
</Directory>

<VirtualHost *:80>
    DocumentRoot /var/www/web1.masaki-blog.net/
    ServerName web1.masaki-blog.net
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/web2.masaki-blog.net/
    ServerName web2.masaki-blog.net
</VirtualHost>

HTMLページ1(/var/www/web1.masaki-blog.net/index.html)

「/var/www/web1.masaki-blog.net」に「index.html」という名前で以下のファイルを配置しました。

<!DOCTYPE html>
<html>
<body>
<p>Wellcome to web1.masaki-blog.net.</p>
</body>
</html>

HTMLページ2(/var/www/web2.masaki-blog.net/index.html)

「/var/www/web2.masaki-blog.net」に「index.html」という名前でファイルを配置しました。番号を少し変えているだけで基本的には先ほどと同じ内容になっています。。

<!DOCTYPE html>
<html>
<body>
<p>Wellcome to web2.masaki-blog.net.</p>
</body>
</html>

HTMLページ3(/usr/local/apache2/htdocs/index.html)

「/usr/local/apache2/htdocs/index.html」に「index.html」という名前で以下のファイルを配置しました。

<!DOCTYPE html>
<html>
<body>
<p>Wellcome to masaki-blog.net.</p>
</body>
</html>

動きを確認してみる

ヘッダの書き換えが楽なので、curlで動きを確認してみます。

そのまま

まずはそのままアクセスしてみます。

$ curl http://localhost/
<!DOCTYPE html>
<html>
<body>
<p>Wellcome to masaki-blog.net.</p>
</body>
</html>
$

「/usr/local/apache2/htdocs/index.html」の内容が表示されました。

ヘッダ付きで

次にヘッダ付きでアクセスしてみます。curlの「-H」オプションでヘッダを付与します。

まずは「web1.masaki-blog.net」のドメインを指定します。

$ curl -H 'host: web1.masaki-blog.net' http://localhost/
<!DOCTYPE html>
<html>
<body>
<p>Wellcome to web1.masaki-blog.net.</p>
</body>
</html>
$

「/var/www/web1.masaki-blog.net/index.html」の内容が表示されました。

次に「web2.masaki-blog.net」のドメインを指定します。

$ curl -H 'host: web2.masaki-blog.net' http://localhost/
<!DOCTYPE html>
<html>
<body>
<p>Wellcome to web2.masaki-blog.net.</p>
</body>
</html>
$

今度は「/var/www/web2.masaki-blog.net/index.html」の内容が表示されました。

このようにドメインの設定でアクセスされるディレクトリ(ファイル)を切り替えることができます。

自分でも試したい人は

今回の作成物を以下に置いています。

https://github.com/masaki-code/docker/tree/master/apache/multidomain

今回の環境を構築できるDockerfileも用意しているので、自分でも試したい人は構築してみてください。Docker環境自体の構築はここでは省きますが、このブログでも記事にしているので参考にしてもらえればと思います。

解説

メリットとかざっくりと

VirtualHostのメリットは複数ドメインを1サーバで扱うことができることにあります。

「1サーバで」と表現するとアクセスが集中し負荷が怖いと感じるかもしれませんが、
実際には冗長化して構成すれば問題ないです。

これだと何の意味があるの?と思う人もいるかもしれないですが、

例えば
 ・1ドメインの機能を持ったサーバを3ドメイン分(3サーバ)
の構成と
 ・3ドメインの機能を持ったサーバを3台
の構成を比較するとメリットが分かります。

前者の構成だとあるドメインで急にアクセスが増えた場合に1サーバに負荷が集中します。
後者の構成だと同様の場合でも、3台分に負荷が分散されます。

平常時のアクセスについては合計して考えるとあまり変わりませんが
急なアクセス集中に対する耐性がつくということです。

また、スケールアウトしやすいというメリットもあります。

コメント

タイトルとURLをコピーしました