2026年5月26日
2026年5月26日
Apacheでサブドメインを設定する方法|VirtualHostでWordPressを別サイトとして動かす手順
Apache でサブドメインを使うには、DNS にサブドメインのレコードを追加し、そのホスト名用の VirtualHost を作って有効化します。この記事では blog.example.com に WordPress を新しく設置する場面を例に、DNS の設定、ドキュメントルートと VirtualHost の作成、反映前の動作確認、HTTPS 化までを順に説明します。メインサイトとは別の WordPress として動かす前提で、最後にマルチサイトのサブドメイン型との違いにも触れます。
全体の流れと前提
サブドメインの設定は、次の三つがそろって初めて動きます。
- DNS:
blog.example.comがサーバーの IP アドレスを指している。 - Apache:
ServerName blog.example.comを持つ VirtualHost があり、有効になっている。 - 中身:ドキュメントルートにファイルがあり、Apache が読める権限になっている。
どれか一つが欠けると、「メインサイトが表示される」「別のサイトが出る」「403 になる」といった分かりにくい症状になります。作業は root 権限(sudo)を持つ VPS や専用サーバーを想定しています。レンタルサーバーでは管理画面からサブドメインを追加する方式が一般的で、Apache の設定ファイルは直接触れないことが多いので、その場合は事業者のマニュアルに従ってください。
設定ファイルを編集する前には、/etc/apache2/(RHEL 系は /etc/httpd/)を丸ごとバックアップしておくと、戻すのが楽になります。
手順1:DNS にサブドメインのレコードを追加する
DNS の管理画面で、サブドメイン用のレコードを追加します。
- サーバーの IP アドレスを直接指す場合は A レコード(IPv6 なら AAAA レコード)で、ホスト名に
blog、値にサーバーの IP を入れます。 - 別のホスト名の別名にする場合は CNAME レコードを使います。
追加後、反映されたかを手元で確認します。
dig +short blog.example.com A
サーバーの IP が返れば DNS 側は完了です。何も返らない、古い値が返るといった場合は、TTL の時間が過ぎるまで待つ必要があります。ネームサーバーを変更した直後などは、反映に時間がかかることがあります。
手順2:ドキュメントルートを作る
サブドメイン用のディレクトリを作り、Apache の実行ユーザーが読めるようにします。実行ユーザーは Debian / Ubuntu では www-data、RHEL 系では apache が標準です。
sudo mkdir -p /var/www/blog.example.com/public
sudo chown -R www-data:www-data /var/www/blog.example.com
WordPress は自動更新やプラグインのインストールでファイルを書き込むため、実行ユーザーに書き込み権限が要ります。ただし、すべてを 777 にするのは避け、ディレクトリ 755・ファイル 644 を基本にします。RHEL 系で SELinux が有効な場合は、/var/www/ 以外の場所に置くとコンテキストの違いで 403 になることがあるため、まずは標準の配下に置くのが無難です。
手順3:VirtualHost の設定ファイルを作る
Debian / Ubuntu では /etc/apache2/sites-available/ に、RHEL 系では /etc/httpd/conf.d/ に、サブドメイン専用のファイルを作ります。
# /etc/apache2/sites-available/blog.example.com.conf
<VirtualHost *:80>
ServerName blog.example.com
DocumentRoot /var/www/blog.example.com/public
<Directory /var/www/blog.example.com/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/blog.example.com_error.log
CustomLog ${APACHE_LOG_DIR}/blog.example.com_access.log combined
</VirtualHost>
AllowOverride All は、WordPress のパーマリンクが .htaccess の書き換えルールを使うために入れています。これが None のままだと、トップページは表示されても個別記事が 404 になります。mod_rewrite が無効なら sudo a2enmod rewrite で有効にします。ログをサブドメインごとに分けておくと、後でエラーを調べるときに他のサイトのログと混ざりません。
RHEL 系では ${APACHE_LOG_DIR} という変数が定義されていないため、logs/blog.example.com_error.log のように書き換えてください。
有効化して構文を確認し、リロードします。
sudo a2ensite blog.example.com.conf # Debian / Ubuntu のみ
sudo apache2ctl configtest # RHEL 系は apachectl configtest
sudo systemctl reload apache2 # RHEL 系は httpd
手順4:DNS の反映前に動作を確認する
DNS がまだ反映されていなくても、Host ヘッダーを指定すれば Apache の設定だけを先に確かめられます。
# どの VirtualHost がどのホスト名に割り当たっているか
sudo apache2ctl -S
# サーバーの IP に、Host ヘッダーを付けてリクエスト
curl -I -H "Host: blog.example.com" http://203.0.113.10/
apache2ctl -S の出力で、blog.example.com が意図した設定ファイルに結び付いているかを見ます。ここで注意したいのが「既定の VirtualHost」です。Apache は、どの ServerName にも一致しないリクエストを、同じポートで最初に読み込まれた VirtualHost に渡します。サブドメインにアクセスしてメインサイトが表示される場合は、ServerName の綴り違いか、設定ファイルが有効化されていない可能性が高いと考えられます。
手順5:HTTPS 化する
DNS が反映されたら、証明書を取得して HTTPS にします。Let's Encrypt の certbot を Apache プラグインで使うと、証明書の取得と 443 番ポート用 VirtualHost の追加をまとめて行えます。
sudo certbot --apache -d blog.example.com
証明書はサブドメインごとに取る方法と、*.example.com のワイルドカード証明書を使う方法があります。ワイルドカード証明書は DNS-01 チャレンジが必要で、DNS 事業者の API に対応したプラグインなどが要ります。サブドメインが少ないうちは個別に取得する方が手順はシンプルです。certbot のオプションやプラグインの扱いは変わることがあるため、実行前に公式ドキュメントで確認してください(2026年10月現在)。
HTTPS 化の後は、HTTP へのアクセスを HTTPS へリダイレクトする設定が入っているかを curl -I http://blog.example.com/ で確認します。
手順6:WordPress を設置する
ドキュメントルートに WordPress のファイルを置き、サブドメイン専用のデータベースとユーザーを作ってからインストールします。メインサイトとデータベースを共有する場合でも、テーブル接頭辞($table_prefix)を分けるより、データベースもユーザーも分ける方が、権限の範囲が明確になり、片方の侵害がもう片方へ広がりにくくなります。
インストール画面でサイトアドレスを https://blog.example.com にしておけば、後から URL を書き換える手間がかかりません。
マルチサイトのサブドメイン型との違い
WordPress のマルチサイトをサブドメイン型で運用する場合は、考え方が変わります。この場合は、サイトごとに VirtualHost を作るのではなく、一つの WordPress がすべてのサブドメインを受け持つため、DNS にワイルドカードレコード(*.example.com)を作り、VirtualHost に ServerAlias *.example.com を加えるのが一般的です。wp-config.php では SUBDOMAIN_INSTALL を true にします。
独立した WordPress を並べるのか、マルチサイトで一元管理するのかは、プラグインやユーザーを共有したいかどうかで決まります。テーマやプラグインを個別に選びたい、片方の不具合をもう片方に波及させたくない場合は、この記事の方法で別サイトとして動かす方が扱いやすいでしょう。
つまずきやすい点
- メインサイトが表示される:
ServerNameの綴り、a2ensiteの実行漏れ、DNS の反映待ちを順に確認します。 - 403 Forbidden:
Require all grantedの有無、ディレクトリの所有者と権限、SELinux のコンテキストを確認します。 - 個別記事だけ 404:
AllowOverride Allと mod_rewrite の有効化を確認します。 - 証明書エラー:サブドメインが証明書の対象に含まれているかを
openssl s_client -connect blog.example.com:443 -servername blog.example.comで確認します。
まとめ
- サブドメインは「DNS レコード」「VirtualHost」「ドキュメントルート」の三つがそろって動く。
- VirtualHost にはサブドメイン専用の
ServerNameとログを設定し、WordPress 用にAllowOverride Allを入れる。 - DNS 反映前は
apache2ctl -SとHostヘッダー付きの curl で設定を確認できる。 - HTTPS は certbot で個別に取るのが手軽。マルチサイトのサブドメイン型はワイルドカード DNS と
ServerAliasを使う別の構成になる。