本ガイドでは、現在稼働しているWebサーバーに新しいドメインを追加し、それぞれ異なるウェブサイトとして同時に公開するための「バーチャルホスト」の設定手順を解説します。
目次
0. バーチャルホストとは?(仕組みの理解)
バーチャルホストとは、「1台の物理サーバー(1つのIPアドレス)」の中に、複数の異なるウェブサイト(ドメイン)を同居させる技術です。アクセスしてきたユーザーが「どのドメイン名(URL)を入力したか」をApache(Webサーバーソフト)が判別し、表示するフォルダ(ディレクトリ)を自動で切り替えます。
システムイメージ(概念図)
このように、入り口は同じサーバーですが、ドメイン名によって案内する部屋(フォルダ)を変える仕組みを構築します。
1. 設定ファイルの作成
Apacheに「どのドメインが来たら、どのフォルダを見せるか」というルールを指示するための設定ファイルを作成します。既存のサイト設定を維持したまま、新しいサイトの設定を追加します。
以下のコマンドを実行し、テキストエディタ(vi)で設定ファイルを開きます。
sudo vi /etc/httpd/conf.d/vhost.conf
以下の内容をすべてコピーして貼り付けてください。
※ www.virtual.host や /var/www/virtual.host の部分は、実際に使用したいドメイン名やフォルダ名に書き換えても動作します。
# 既存ドメイン(www.your-domain.mydns.jp)の設定を維持します
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName www.your-domain.mydns.jp
</VirtualHost>
# 新規追加するバーチャルホストの設定
<VirtualHost *:80>
DocumentRoot /var/www/virtual.host
ServerName www.virtual.host
ServerAdmin webmaster@virtual.host
# エラーログとアクセスログを分けて記録します
ErrorLog logs/virtual.host-error_log
CustomLog logs/virtual.host-access_log combined
</VirtualHost>
# 新規ドメイン用ディレクトリの権限設定
<Directory "/var/www/virtual.host">
Options FollowSymLinks
AllowOverride All
</Directory>
設定項目の解説
| 項目 | 意味 |
|---|---|
<VirtualHost *:80> | ポート番号80(通常のHTTP接続)で届いたアクセスに対する設定の塊(ブロック)を示します。 |
DocumentRoot | ホームページの実体(HTMLファイルなど)を保存するフォルダの場所を指定します。 |
ServerName | 対象となるドメイン名を指定します。この名前と合致したアクセスがこのブロックで処理されます。 |
ErrorLog / CustomLog | このサイト専用のログファイルを作成します。不具合が起きたときの原因究明が容易になります。 |
<Directory ...> | 指定したフォルダに対するアクセス権限(セキュリティ設定)を定義します。 |
入力後、Escキーを押して :wq と入力し、Enterキーを押して保存して閉じます。
2. ディレクトリの作成と権限設定
次に、ウェブサイトのデータを保存するフォルダ(ディレクトリ)を実際に作成し、インターネット経由で閲覧できるように権限を設定します。
ディレクトリの作成
新しく公開するウェブサイトのファイルを置くためのフォルダを作成します。
sudo mkdir /var/www/virtual.host
権限(パーミッション)の設定
作成したフォルダを、Webサーバー(Apache)や一般ユーザーが読み取れるように権限を設定します。
sudo chmod 755 /var/www/virtual.host
755とは:所有者(管理者)は書き込み・読み込みが可能で、それ以外のユーザー(Webサーバーなど)は読み込みと実行ができる権限です。
SELinuxのセキュリティラベル付与(重要)
Red Hat Enterprise Linux、AlmaLinux、Rocky Linuxなどでは、SELinuxという強力なセキュリティ機能が動作しています。単にフォルダを作成しただけでは、セキュリティ制限によってプログラムがフォルダにアクセスできず、サイトが表示されない(403 Forbiddenエラー)原因になります。
そのため、新しく作ったフォルダに「これはWebサイト公開用のフォルダである」というラベル(属性)を付与する必要があります。
(ツールが不足している場合は、先に以下のコマンドでインストールを実行してください)
sudo dnf install policycoreutils-python-utils -y
作成したフォルダとその配下のすべてのファイルにWeb用ラベル(httpd_sys_content_t)を割り当てる設定を登録します。
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/virtual.host(/.*)?"
登録したルールをシステムに適用します。
sudo restorecon -Rv /var/www/virtual.host
3. テスト用のWebページ作成
設定が正しく完了しているかをブラウザで確認するために、簡易的なテスト用ホームページ(HTMLファイル)を作成します。
sudo vi /var/www/virtual.host/index.html
以下の内容をコピーして貼り付けてください。
<html>
<body>
<h1 style="width: 100%; font-size: 48px; text-align: center;">
Virtual Host Test Page
</h1>
</body>
</html>
入力後、Escキーを押して :wq と入力し、Enterキーを押して保存して閉じます。
4. 設定の反映とチェック
これまでに実施した設定ファイルをApacheに読み込ませます。ただし、設定ファイルに書き間違いがあると、現在動いている既存のウェブサイトまで停止してしまうリスクがあります。そのため、必ず「チェック」を行ってから「反映」させます。
構文チェック(事前確認)
設定ファイルの記述に文法ミスがないかを確認します。
sudo apachectl configtest
画面に Syntax OK と表示されれば、記述に間違いはありません。エラーが表示された場合は、手順1の設定ファイル(vhost.conf)に打ち間違いがないか確認してください。
Apacheの設定再読み込み
チェックが通ったら、設定を反映させます。
sudo systemctl reload httpd
※ restart(再起動)ではなく reload(再読み込み)を使用することで、既存のアクセスを切断することなく安全に新しい設定を適用できます。
5. 動作確認
お使いのパソコンのブラウザを起動し、新しく設定したドメインにアクセスします。
アクセス先:http://www.virtual.host(またはご自身で設定したドメイン)
画面中央に大きく 「Virtual Host Test Page」 と表示されれば、バーチャルホストの追加構築は完了です。
【重要:運用のヒント】
構築した環境をインターネット上で実際に運用する際、必要となる追加の作業です。
1. DNS設定の追加
新しく追加したドメイン(例:www.virtual.host)をブラウザに入力した際に、構築したサーバーのIPアドレスに辿り着けるようにする必要があります。現在お使いのDNSサービス(MyDNS等、またはドメインを取得したレジストラ)の管理画面にて、Aレコードとして対象ドメインにサーバーのグローバルIPアドレスを紐付けてください。
DNS設定が反映される前のテスト方法(hostsファイルの利用)
まだドメインの準備ができていない段階で動作確認をしたい場合、お使いのパソコンの hosts ファイルに以下のように記述することで、自分のパソコン内だけでテストアクセスが可能です。
[サーバーのIPアドレス] www.virtual.host
2. HTTPS化(SSL/TLS暗号化)について
現在のWeb標準では、すべてのウェブサイトにHTTPS(暗号化通信)が求められます。無料のSSL証明書発行機関である「Let's Encrypt」のツール(Certbot)を利用すると、作成したバーチャルホストに対して簡単なコマンド操作のみで自動的にSSL設定が追加されます。
sudo certbot --apache
コマンドを実行すると、対話式のガイダンスが開始されます。画面の指示に従い、HTTPS化したい新ドメイン(例:www.virtual.host)を選択して進めてください。必要なApache設定の書き換えも含めて自動で処理されます。
⚠️ よくある落とし穴:デフォルトVirtualHost
複数のVirtualHostを設定する際に見落としがちな、Apacheの名前ベースバーチャルホストの重要な仕様があります。
Hostヘッダーが一致しないアクセスは「最初に読み込まれたVirtualHost」が処理する
ブラウザやツールが送信するHostヘッダーが、どのServerName/ServerAliasにも一致しない場合、Apacheは設定ファイルの中で最初に定義されたVirtualHostブロックを「デフォルト」として処理します。ファイル名のアルファベット順に読み込まれるため、vhost.conf より先に読み込まれる設定ファイル(例:sで始まるファイル名など)が存在すると、意図せずそちらがデフォルトになることがあります。
本サイトの構築でも実際に、curl http://サーバーIP/...のようにHostヘッダーを指定せずアクセスした際、想定していたサイトではなく別のVirtualHost(ファイル名の並び順で先に読み込まれていた設定)が応答し、404になるという現象が発生しました。原因の切り分けには Host ヘッダーを明示したテスト(curl -H "Host: 対象ドメイン" http://サーバーIP/...)が有効です。
コマンド早見表
| 操作 | コマンド |
|---|---|
| 設定ファイル作成 | sudo vi /etc/httpd/conf.d/vhost.conf |
| ディレクトリ作成 | sudo mkdir /var/www/virtual.host |
| 権限設定 | sudo chmod 755 /var/www/virtual.host |
| SELinuxラベル登録 | sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/virtual.host(/.*)?" |
| SELinuxラベル反映 | sudo restorecon -Rv /var/www/virtual.host |
| 構文チェック | sudo apachectl configtest |
| 設定の安全な再読み込み | sudo systemctl reload httpd |
| 現在有効なVirtualHostの確認 | sudo httpd -S |
| HTTPS化 | sudo certbot --apache |