Apache VirtualHostの設定方法とhttpd.confサンプル完全解説

Apacheで複数のWebサイトを1台のサーバー上で運用するためには「VirtualHost」の設定が不可欠です。VirtualHostを利用することで、同じサーバーに複数のドメインやサブドメインを割り当て、それぞれ異なるWebサイトとして動作させることができます。

この記事では、Apacheの設定ファイル「httpd.conf」を編集し、VirtualHostを構築する基本的な手順をわかりやすく解説します。初めてVirtualHostを設定する方でも、シンプルな例から学び、複数ドメインやSSL対応など応用的な設定まで理解できるように構成しています。

また、設定時に発生しやすいエラーの対処法や、動作確認の方法についても触れ、スムーズにVirtualHostを構築できる知識を提供します。この記事を読むことで、Apacheサーバーの管理スキルが向上し、効率的なWebサイト運用が可能になります。

目次

VirtualHostとは何か


VirtualHost(バーチャルホスト)とは、1台のApacheサーバーで複数のWebサイトやドメインを同時に運用するための仕組みです。これにより、異なるドメインやサブドメインを個別のWebサイトとして扱うことが可能になります。

VirtualHostの仕組み


Apacheでは、クライアントがリクエストを送信した際に、リクエストのホスト名やIPアドレスに応じて、指定されたディレクトリや設定に基づいたWebサイトを表示します。この処理を実現するのがVirtualHostの役割です。

VirtualHostの利点

  1. コスト削減
     1台のサーバーで複数のサイトを運用できるため、ハードウェアコストを削減できます。
  2. 効率的なリソース管理
     リソースを効率的に配分し、サーバーのパフォーマンスを最適化します。
  3. 簡単な管理
     個々のWebサイトごとに独自の設定を行うことで、運用の柔軟性が高まります。
  4. ドメインごとの運用
     異なるドメインやサブドメインごとに異なるWebコンテンツを提供できます。

使用例

  • 複数のドメイン(example.com、example.net)を1台のサーバーで運用
  • 本番環境と開発環境を同じサーバーで動作させる
  • 1つのドメイン内で複数のサブドメイン(blog.example.com、shop.example.com)を使用

VirtualHostの設定は、Apacheの設定ファイルである「httpd.conf」や「extra/httpd-vhosts.conf」に記述します。次の章では、VirtualHostを設定するための事前準備について解説します。

必要な事前準備


VirtualHostを設定する前に、Apacheのインストール状況や設定ファイルの場所を確認することが重要です。事前準備を適切に行うことで、設定ミスを防ぎ、スムーズにVirtualHostを構築できます。

1. Apacheのインストール確認


まず、Apacheがサーバーにインストールされているか確認します。以下のコマンドでApacheの状態をチェックします。

Linux環境(CentOS/RHEL系)

sudo systemctl status httpd

Ubuntu/Debian系

sudo systemctl status apache2


「active (running)」と表示されていればApacheは起動しています。もし「not found」などと表示された場合は、以下のコマンドでApacheをインストールします。

CentOS/RHEL系

sudo yum install httpd

Ubuntu/Debian系

sudo apt install apache2

2. 設定ファイルの確認


VirtualHostの設定はApacheの設定ファイル「httpd.conf」に記述します。設定ファイルの場所は環境によって異なります。

CentOS/RHEL系

/etc/httpd/conf/httpd.conf

Ubuntu/Debian系

/etc/apache2/apache2.conf

VirtualHost専用の設定ファイルが用意されている場合もあります。たとえば、Ubuntuでは以下のファイルを使用します。

/etc/apache2/sites-available/000-default.conf

3. 必要なモジュールの確認


VirtualHostの設定には「mod_vhost_alias」などのモジュールが必要です。以下のコマンドでモジュールが有効か確認します。

sudo apachectl -M


リストに「vhost_alias_module」が表示されていれば、モジュールは有効です。表示されない場合は、以下のコマンドで有効化します。

sudo a2enmod vhost_alias
sudo systemctl restart apache2

4. 動作確認用のドメインやIPの用意


VirtualHostは特定のドメインやIPに基づいて設定されます。事前にDNS設定を行い、仮のドメインやIPアドレスを用意しておくと、設定がスムーズに進みます。DNS設定が難しい場合は、ローカルホスト(127.0.0.1)でテストすることも可能です。

次の章では、httpd.confの構造とVirtualHost設定の基本ルールについて詳しく説明します。

httpd.confの構造とVirtualHost設定の基本ルール


Apacheの設定ファイル「httpd.conf」は、サーバー全体の動作を定義する重要なファイルです。VirtualHostの設定もこのファイルに記述しますが、基本的な構造や記述ルールを理解することが不可欠です。

1. httpd.confの役割


httpd.confはApacheの中核的な設定ファイルで、サーバーの基本的な挙動を決定します。ポート番号の指定、ドキュメントルートの設定、ログの記録場所などが記述されています。
VirtualHostを設定する際は、このファイルの末尾に設定を追加するか、専用の設定ファイル(vhosts.conf)を読み込む形になります。

2. 基本的なディレクティブ構成


httpd.confの中でよく使用されるディレクティブ(設定項目)には以下のようなものがあります。

  • Listen:Apacheがリッスンするポート番号を指定(例:80や443)
  • ServerName:サーバーのホスト名を指定
  • DocumentRoot:Webサイトのファイルが存在するディレクトリを指定
  • Directory:特定のディレクトリに対するアクセス権限を定義

以下は基本的なhttpd.confの構成例です。

Listen 80
ServerName www.example.com
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
    AllowOverride All
    Require all granted
</Directory>

3. VirtualHostの記述ルール


VirtualHostを設定する際は、<VirtualHost>タグで囲みます。ドメインごとに異なる設定を記述し、必要に応じて複数のVirtualHostセクションを作成します。

基本的なVirtualHostの記述例

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/example"
    ErrorLog "/var/log/httpd/example-error.log"
    CustomLog "/var/log/httpd/example-access.log" common
</VirtualHost>

記述ルールのポイント

  • <VirtualHost *:80> :ポート80で全てのIPアドレスからのアクセスを受け付けます。特定のIPに限定する場合は「192.168.1.1:80」のように指定します。
  • ServerName :VirtualHostに紐づくドメインを指定します。
  • DocumentRoot :そのVirtualHostのコンテンツが配置されるディレクトリを指定します。
  • ErrorLog / CustomLog :エラーログやアクセスログの出力先を個別に設定できます。

4. 設定ファイルの読み込み


httpd.confの末尾には、VirtualHost設定が記述された別ファイルを読み込むディレクティブが記載されている場合があります。

Include conf/extra/httpd-vhosts.conf


この行がコメントアウト(#)されている場合は、先頭の#を削除して有効化してください。

次の章では、具体的なVirtualHostの設定例について詳しく解説します。

シンプルなVirtualHost設定例


VirtualHostの基本を理解するために、最もシンプルな設定例を紹介します。これにより、1つのドメインでWebサイトを公開するための最小限の構成を学べます。

1. 基本のVirtualHost設定


以下は「example.com」というドメインを運用するためのシンプルなVirtualHost設定です。サーバーがリクエストを受け付けると、「/var/www/example.com」に配置されたWebサイトを表示します。

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/example.com"
</VirtualHost>

設定の解説

  • <VirtualHost *:80>:全てのIPアドレスからポート80(HTTP)のリクエストを受け付けます。
  • ServerName:リクエストのホスト名が「example.com」の場合にこの設定が適用されます。
  • DocumentRoot:Webサイトのルートディレクトリを指定します。このディレクトリに「index.html」などを配置すると、ブラウザからアクセスできます。

2. ディレクトリとファイルの作成


VirtualHostの設定を適用するために、必要なディレクトリとファイルを作成します。

sudo mkdir -p /var/www/example.com
sudo nano /var/www/example.com/index.html

index.htmlに以下のような簡単なHTMLを記述します。

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to example.com!</title>
</head>
<body>
    <h1>Hello, this is example.com!</h1>
</body>
</html>

3. Apacheの設定ファイルにVirtualHostを追加


httpd.confまたは「extra/httpd-vhosts.conf」に上記のVirtualHost設定を追記します。

sudo nano /etc/httpd/conf/httpd.conf

または

sudo nano /etc/httpd/conf/extra/httpd-vhosts.conf

VirtualHostの設定が完了したら、Apacheを再起動して変更を反映させます。

sudo systemctl restart httpd

4. 動作確認


ブラウザで「http://example.com」にアクセスし、「Hello, this is example.com!」が表示されれば、VirtualHostの設定は成功です。

5. /etc/hostsでのローカル動作確認


DNSが設定されていない場合は、ローカル環境で動作確認できます。

sudo nano /etc/hosts

以下の行を追加します。

127.0.0.1 example.com

これにより、ローカルマシンで「example.com」にアクセスすると、設定したVirtualHostが反映されます。

次の章では、複数のドメインを1つのサーバーで運用する方法について解説します。

複数ドメインの設定方法


1台のApacheサーバーで複数のドメインを運用するには、VirtualHostを複数記述します。これにより、異なるドメインごとに個別のWebサイトを提供できます。ここでは、2つのドメイン「example.com」と「test.com」を設定する例を紹介します。

1. 基本的な複数ドメインのVirtualHost設定


httpd.confまたはvhosts.confに以下のように記述します。

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/example.com"
    ErrorLog "/var/log/httpd/example-error.log"
    CustomLog "/var/log/httpd/example-access.log" common
</VirtualHost>

<VirtualHost *:80>
    ServerName test.com
    DocumentRoot "/var/www/test.com"
    ErrorLog "/var/log/httpd/test-error.log"
    CustomLog "/var/log/httpd/test-access.log" common
</VirtualHost>

設定の解説

  • 複数のVirtualHostを記述:サーバーはホスト名(ServerName)に基づいて、適切なVirtualHostを選択します。
  • ドキュメントルート:各ドメインごとに異なるルートディレクトリを指定し、独立したWebサイトを運用できます。
  • ログ管理:エラーログやアクセスログをドメインごとに分けることで、トラブルシューティングが容易になります。

2. 必要なディレクトリとファイルの作成


各ドメイン用のディレクトリを作成し、それぞれのindex.htmlを用意します。

sudo mkdir -p /var/www/example.com
sudo mkdir -p /var/www/test.com

sudo nano /var/www/example.com/index.html
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to example.com</title>
</head>
<body>
    <h1>example.comへようこそ!</h1>
</body>
</html>
sudo nano /var/www/test.com/index.html
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to test.com</title>
</head>
<body>
    <h1>test.comへようこそ!</h1>
</body>
</html>

3. /etc/hostsを使ったローカル環境でのテスト


DNS設定がない場合は、「/etc/hosts」ファイルを編集して、ローカルで動作確認します。

sudo nano /etc/hosts

以下の行を追加します。

127.0.0.1 example.com
127.0.0.1 test.com

これにより、ブラウザで「http://example.com」や「http://test.com」にアクセスできるようになります。

4. Apacheの再起動と動作確認


VirtualHostの設定後、Apacheを再起動して変更を反映します。

sudo systemctl restart httpd

ブラウザで「example.com」と「test.com」にアクセスし、それぞれのindex.htmlが表示されれば、複数ドメインの設定は成功です。

次の章では、ポートごとのVirtualHost設定について解説します。

ポートごとのVirtualHost設定


Apacheでは、特定のポートごとに異なるWebサイトを運用することが可能です。これにより、同じIPアドレスで複数のWebサイトを異なるポートで公開できます。例えば、ポート80で通常のHTTPサイトを提供し、ポート8080で別のテストサイトを動作させることができます。

1. ポートごとのVirtualHost設定例


以下は、ポート80とポート8080で異なるWebサイトを運用する設定例です。

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot "/var/www/example.com"
    ErrorLog "/var/log/httpd/example-error.log"
    CustomLog "/var/log/httpd/example-access.log" common
</VirtualHost>

<VirtualHost *:8080>
    ServerName testsite.com
    DocumentRoot "/var/www/testsite"
    ErrorLog "/var/log/httpd/testsite-error.log"
    CustomLog "/var/log/httpd/testsite-access.log" common
</VirtualHost>

設定の解説

  • <VirtualHost *:80> :ポート80で「example.com」を公開します。
  • <VirtualHost *:8080> :ポート8080で「testsite.com」を運用します。ポートが異なるため、同一IPで異なるサイトを公開できます。
  • ServerName :ポートごとに別のドメインを指定可能ですが、同じドメインでも異なるポートで異なるサイトを提供できます。

2. 必要なポートの開放


Apacheが特定のポートでリクエストを受け付けるように「Listen」ディレクティブを設定します。

Listen 80
Listen 8080

「httpd.conf」または「ports.conf」に上記を追記してください。これにより、Apacheはポート8080でもリクエストを待ち受けるようになります。

3. 必要なディレクトリとファイルの作成


それぞれのポートに対応するWebサイトのディレクトリを作成し、HTMLファイルを配置します。

sudo mkdir -p /var/www/example.com
sudo mkdir -p /var/www/testsite

index.htmlを作成します。

sudo nano /var/www/example.com/index.html
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to example.com</title>
</head>
<body>
    <h1>This is example.com on port 80</h1>
</body>
</html>
sudo nano /var/www/testsite/index.html
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to testsite.com</title>
</head>
<body>
    <h1>This is testsite.com on port 8080</h1>
</body>
</html>

4. ファイアウォールの設定


ポート8080がブロックされている場合は、ファイアウォールでポートを開放します。

CentOS/RHEL

sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

Ubuntu/Debian

sudo ufw allow 8080
sudo ufw reload

5. Apacheの再起動と動作確認


設定を反映させるため、Apacheを再起動します。

sudo systemctl restart httpd

ブラウザで以下のURLにアクセスして、異なるポートでWebサイトが動作していることを確認します。

  • http://example.com(ポート80)
  • http://example.com:8080(ポート8080)

次の章では、SSLを使用したVirtualHostの設定方法について解説します。

SSLを使用したVirtualHost設定


SSL(Secure Sockets Layer)を利用して、HTTPSで安全な通信を行うVirtualHostの設定方法を解説します。SSLを導入することで、データの暗号化やサイトの信頼性向上が可能になります。ここでは自己署名証明書を使用した基本的なSSL設定を紹介します。

1. 必要なモジュールの有効化


ApacheでSSLを使用するには、「mod_ssl」モジュールを有効化する必要があります。

CentOS/RHEL系

sudo yum install mod_ssl

Ubuntu/Debian系

sudo a2enmod ssl


モジュール有効化後、Apacheを再起動します。

sudo systemctl restart apache2

2. 自己署名SSL証明書の作成


次に、自己署名証明書を作成します。以下のコマンドでSSL証明書と秘密鍵を生成します。

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

オプションの説明

  • -x509:X.509証明書を作成
  • -nodes:秘密鍵の暗号化を行わない
  • -days 365:証明書の有効期間(365日)
  • -newkey rsa:2048:2048ビットのRSA鍵を新規生成

コマンド実行中に、国名や組織名などの情報を入力するプロンプトが表示されます。適宜入力してください。

3. SSL用VirtualHostの設定


SSLで保護されたVirtualHostをhttpd.confまたはssl.confに記述します。

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot "/var/www/example.com"

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

    <Directory "/var/www/example.com">
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog "/var/log/httpd/example-ssl-error.log"
    CustomLog "/var/log/httpd/example-ssl-access.log" combined
</VirtualHost>

設定のポイント

  • SSLEngine on:SSLを有効化
  • SSLCertificateFile:SSL証明書のパス
  • SSLCertificateKeyFile:秘密鍵のパス
  • 443番ポートでリクエストを受け付ける設定です。

4. ファイアウォールの設定


ポート443が開放されていることを確認します。

CentOS/RHEL

sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

Ubuntu/Debian

sudo ufw allow 443
sudo ufw reload

5. Apacheの再起動と動作確認


Apacheを再起動して設定を反映します。

sudo systemctl restart httpd

ブラウザで以下のURLにアクセスし、HTTPS接続が確立されていることを確認します。

https://example.com  


自己署名証明書のため警告が表示されますが、「続行」または「例外を追加」でアクセスできます。

6. HTTPからHTTPSへのリダイレクト


すべてのHTTPトラフィックを自動的にHTTPSにリダイレクトするには、ポート80のVirtualHostに以下を追加します。

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

これにより、HTTPでアクセスしてもHTTPSに自動転送されます。

次の章では、トラブルシューティングとエラーログの確認方法について解説します。

トラブルシューティングとエラーログの確認方法


VirtualHost設定時にエラーが発生することがあります。設定ミスやパーミッションの問題が原因でApacheが正しく起動しない場合があります。この章では、トラブルシューティングの方法とエラーログの確認方法を解説します。

1. Apacheの設定ファイルを検証する


Apacheの設定ファイルに構文エラーがないか確認するには、以下のコマンドを実行します。

sudo apachectl configtest


結果の例

  • Syntax OK:設定ファイルに問題なし
  • Syntax error:エラーが存在し、エラーの場所と原因が表示されます。

2. エラーログの確認


Apacheはエラーや問題をログに記録します。ログファイルを確認することで、エラーの詳細を把握できます。

CentOS/RHEL

sudo tail -f /var/log/httpd/error_log

Ubuntu/Debian

sudo tail -f /var/log/apache2/error.log

VirtualHostごとに個別のエラーログを設定している場合は、対象のログファイルを確認してください。

sudo tail -f /var/log/httpd/example-error.log

3. 権限とファイルパスの確認


VirtualHost設定で多いエラーの例

  • DocumentRootのパーミッションエラー
  [crit] (13)Permission denied: /var/www/example.com/


対処方法

  sudo chown -R apache:apache /var/www/example.com
  sudo chmod -R 755 /var/www/example.com
  • ログファイルの書き込み権限不足
  (13)Permission denied: could not open error log file


対処方法

  sudo chown apache:apache /var/log/httpd/example-error.log
  sudo chmod 644 /var/log/httpd/example-error.log

4. ポートの競合を確認する


Apacheが起動しない原因として、他のプロセスが80番や443番ポートを使用している場合があります。

sudo netstat -tuln | grep :80


もし他のプロセスがポートを使用している場合は、そのプロセスを停止するか、VirtualHostで使用するポートを変更します。

5. DNS設定と/etc/hostsの確認


サーバーが正しいホスト名を認識しているか確認します。DNS設定が反映されていない場合は、ローカルで/etc/hostsを利用します。

sudo nano /etc/hosts


以下を追加

127.0.0.1 example.com

6. Apacheの再起動


設定変更後は必ずApacheを再起動して反映させます。

sudo systemctl restart httpd

7. ブラウザキャッシュのクリア


設定が正しいにもかかわらず変更が反映されない場合は、ブラウザのキャッシュが原因の可能性があります。キャッシュをクリアしてから再度アクセスしてください。

8. デバッグモードの利用


Apacheをデバッグモードで起動し、詳細なログを確認することも有効です。

sudo apachectl -X

これにより、問題の原因が特定しやすくなります。

次の章では、この記事のまとめを行います。

まとめ


本記事では、ApacheでVirtualHostを設定するための基本から応用までを解説しました。VirtualHostは、1台のサーバーで複数のWebサイトやドメインを効率的に運用するための重要な機能です。

具体的には、VirtualHostの基本概念から、複数ドメインやポート別の設定方法、SSLを使用したセキュアな環境の構築までを網羅しました。また、トラブルシューティングの方法やエラーログの確認手順についても説明し、エラー発生時の対処方法を紹介しました。

要点の振り返り

  • VirtualHostの基本設定:1つのドメインを簡単に設定する方法を学びました。
  • 複数ドメインの運用:異なるドメインを1台のサーバーで管理する手法を紹介しました。
  • ポートごとの運用:ポート80や8080など、ポートを使い分ける設定を説明しました。
  • SSLの導入:HTTPSで通信を保護する方法を解説しました。
  • トラブルシューティング:エラーログを活用した問題解決の手順を紹介しました。

ApacheのVirtualHostを適切に設定することで、Webサイトの運用が柔軟かつ効率的になります。ぜひ、実際に設定を試して、サーバー管理スキルを向上させてください。

コメント

コメントする

目次