Apacheで複数ドメインを1つのサーバーで運用する方法【仮想ホスト設定】

Apacheサーバーは、多くのWebサイトで利用されている強力なWebサーバーソフトウェアです。特に、複数のドメインを1台のサーバーで運用する際に役立つのが「仮想ホスト(Virtual Host)」機能です。仮想ホストを利用することで、コストを抑えつつ、複数のWebサイトを1つのApacheインスタンス上で動作させることができます。

たとえば、example.comsample.comという2つのドメインを1つのサーバーで管理する場合、Apacheの仮想ホスト設定を行えば、それぞれのドメインで異なるWebサイトを配信できます。これは、レンタルサーバーやクラウド環境でもよく使われる手法であり、個人のブログから企業のWebサイトまで、幅広く活用されています。

本記事では、Apacheの仮想ホストの仕組みとその設定方法について詳しく解説します。名前ベースとIPベースの仮想ホストの違いを理解し、実際に複数ドメインを設定する具体例を紹介します。さらに、SSL証明書を導入したセキュアな仮想ホストの構築方法や、設定後の動作確認・トラブルシューティングについても触れます。

目次

仮想ホストとは何か


仮想ホスト(Virtual Host)とは、1台のサーバーで複数のWebサイトやドメインを運用するためのApacheの機能です。物理的には1つのサーバーであっても、複数のドメインに対して異なるWebサイトを提供できるため、コスト削減やサーバーの効率的な運用が可能になります。

たとえば、example.comsample.comの2つの異なるドメインを、同一サーバーで管理する場合、それぞれのドメインに異なるコンテンツを割り当てることができます。これにより、複数のクライアントやプロジェクトを同時に運用できる環境が整います。

仮想ホストのメリット


仮想ホストの利用には以下のようなメリットがあります。

  • コストの削減:1台のサーバーで複数のサイトを運用できるため、ハードウェアコストや管理コストを抑えられます。
  • リソースの効率化:リソースを分散して複数のサイトを動作させることで、サーバーの無駄を減らせます。
  • 柔軟な管理:ドメインごとに独立した設定が可能で、個別のサイトとして管理できます。
  • スケーラビリティ:サーバーのリソースが許す限り、新しいサイトを追加できます。

仮想ホストが使われるケース

  • 共有ホスティング:1台のサーバーで複数のクライアントのWebサイトを管理する場合。
  • テスト環境:開発中の複数のサイトを同一サーバー上で動作させ、動作確認を行う場合。
  • サブドメイン運用blog.example.comshop.example.comのように、メインドメインのサブサイトを別々に運用する場合。

仮想ホストは、サーバーの可能性を最大限に引き出し、柔軟なWebサイト運用を実現するための重要な技術です。次に、仮想ホストの種類について詳しく見ていきます。

仮想ホストの種類【IPベースと名前ベース】


Apacheの仮想ホストには、大きく分けて「IPベース」と「名前ベース」の2種類があります。それぞれの特性を理解することで、運用環境に最適な仮想ホスト設定を選択できます。

IPベースの仮想ホスト


IPベースの仮想ホストは、異なるIPアドレスを持つ複数のWebサイトを1台のサーバーで運用する方法です。ドメインごとにサーバーの異なるIPアドレスを指定し、それぞれのIPアドレスで異なるWebサイトを提供します。

メリット

  • 各サイトが独立したIPを持つため、SSL証明書をサイトごとに設定しやすい
  • ネットワークレベルでのアクセス制御が容易

デメリット

  • IPアドレスの数に依存するため、コストが高くなる場合がある
  • IPv4アドレスの枯渇問題がある

設定例

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

<VirtualHost 192.168.1.2:80>
    ServerName sample.com
    DocumentRoot /var/www/sample
</VirtualHost>

名前ベースの仮想ホスト


名前ベースの仮想ホストは、同一のIPアドレスで複数のドメインを運用する方法です。リクエスト時のホスト名(Hostヘッダー)を元にApacheがどのWebサイトを提供するかを判断します。

メリット

  • 1つのIPアドレスで複数のドメインを運用でき、コストを抑えられる
  • IPアドレスの節約が可能

デメリット

  • 古いブラウザでは対応していない場合がある(現在はほとんど問題なし)
  • サイトごとに異なるSSL証明書を設定するには「SNI(Server Name Indication)」が必要

設定例

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

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

IPベースと名前ベースの使い分け

  • SSLを多用する場合はIPベースが適しているが、SNIが利用できる環境では名前ベースでも問題ありません。
  • コスト削減を重視する場合は、名前ベースの仮想ホストが最適です。

これらの違いを理解し、環境に応じた仮想ホストの種類を選びましょう。次は、Apacheで仮想ホストを有効化する手順について詳しく解説します。

Apacheで仮想ホストを有効化する手順


Apacheで仮想ホストを運用するためには、設定ファイルの編集といくつかのコマンド操作が必要です。ここでは、名前ベースの仮想ホストを例に、仮想ホストを有効化する手順を解説します。

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


まず、Apacheがインストールされていない場合は、以下のコマンドでインストールします。
Ubuntu/Debian系

sudo apt update
sudo apt install apache2


CentOS/RHEL系

sudo yum install httpd
sudo systemctl start httpd


インストール後、以下のコマンドでApacheが正しく動作しているか確認します。

sudo systemctl status apache2  # Ubuntu/Debian
sudo systemctl status httpd    # CentOS/RHEL

2. 仮想ホスト設定ファイルの作成


Apacheの仮想ホスト設定は、通常/etc/apache2/sites-available/(Ubuntu)または/etc/httpd/conf.d/(CentOS)に配置されます。
まず、仮想ホスト設定用のファイルを新規作成します。

sudo nano /etc/apache2/sites-available/example.com.conf


以下の内容を記述します。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

3. ドキュメントルートの作成


仮想ホストが指すWebサイトのデータを置くディレクトリを作成します。

sudo mkdir -p /var/www/example


簡単なHTMLファイルを作成して、動作確認を行います。

echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example/index.html

4. 設定ファイルの有効化


Ubuntu/Debian系では、作成した設定ファイルを有効化します。

sudo a2ensite example.com.conf


CentOS/RHEL系では、設定ファイルを直接読み込むので有効化作業は不要です。

5. Apacheの再起動


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

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

6. ファイアウォールの設定(必要な場合)


80番ポートを開放し、外部からのアクセスを許可します。

sudo ufw allow 80/tcp  # Ubuntu
sudo firewall-cmd --permanent --add-service=http  # CentOS
sudo firewall-cmd --reload

7. 動作確認


ブラウザでhttp://example.comにアクセスし、先ほど作成したページが表示されれば仮想ホストの有効化は完了です。

次は、複数のドメインを設定する具体例について詳しく解説します。

複数ドメインの設定例


Apacheの仮想ホストを利用して、1台のサーバーで複数のドメインを運用する方法を具体的に解説します。ここでは、example.comsample.comという2つのドメインを同時に運用するケースを想定します。

1. ドキュメントルートの作成


各ドメイン用にWebサイトのデータを配置するディレクトリを作成します。

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

次に、それぞれのドキュメントルートにテスト用のHTMLファイルを配置します。

echo "<h1>Welcome to example.com</h1>" | sudo tee /var/www/example.com/index.html
echo "<h1>Welcome to sample.com</h1>" | sudo tee /var/www/sample.com/index.html

2. 仮想ホスト設定ファイルの作成


example.comsample.comそれぞれの仮想ホスト設定ファイルを作成します。

sudo nano /etc/apache2/sites-available/example.com.conf


以下の内容を記述します。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/example_error.log
    CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>

次に、sample.comの設定ファイルも作成します。

sudo nano /etc/apache2/sites-available/sample.com.conf
<VirtualHost *:80>
    ServerAdmin admin@sample.com
    ServerName sample.com
    ServerAlias www.sample.com
    DocumentRoot /var/www/sample.com
    ErrorLog ${APACHE_LOG_DIR}/sample_error.log
    CustomLog ${APACHE_LOG_DIR}/sample_access.log combined
</VirtualHost>

3. 仮想ホストの有効化


作成した仮想ホストを有効化します。

sudo a2ensite example.com.conf
sudo a2ensite sample.com.conf

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

sudo systemctl restart apache2

4. 動作確認


ローカルホスト環境でテストする場合は、/etc/hostsに以下の行を追加します。

127.0.0.1 example.com
127.0.0.1 sample.com

その後、ブラウザでhttp://example.comhttp://sample.comにアクセスし、それぞれのサイトが正しく表示されることを確認します。

5. トラブルシューティング

  • サイトが表示されない場合は、Apacheのエラーログを確認します。
sudo tail /var/log/apache2/example_error.log
sudo tail /var/log/apache2/sample_error.log
  • 仮想ホストが無視される場合は、000-default.confを無効化します。
sudo a2dissite 000-default.conf
sudo systemctl restart apache2

これで、1台のサーバーで複数のドメインを運用する仮想ホスト設定が完了します。次は、SSLを使った仮想ホスト設定について詳しく解説します。

SSL対応の仮想ホスト設定


SSL証明書を利用して、仮想ホストでHTTPS接続を実現する方法を解説します。SSLを適用することで、通信の暗号化が行われ、セキュリティが大幅に向上します。ここでは、example.comにSSLを導入する具体例を紹介します。

1. SSLモジュールの有効化


ApacheでSSLを利用するために、SSLモジュールを有効化します。

sudo a2enmod ssl
sudo systemctl restart apache2

2. SSL証明書の取得


Let’s Encryptを利用して無料のSSL証明書を取得する方法が一般的です。Certbotをインストールし、証明書を取得します。

sudo apt update
sudo apt install certbot python3-certbot-apache


証明書の発行を行います。

sudo certbot --apache -d example.com -d www.example.com


対話形式で進み、自動的にApacheのSSL仮想ホスト設定が行われます。

3. 手動でSSL仮想ホストを設定する方法


証明書がある場合は手動でSSL設定を行います。仮想ホストのSSL設定ファイルを作成します。

sudo nano /etc/apache2/sites-available/example.com-ssl.conf


以下のように記述します。

<VirtualHost *:443>
    ServerAdmin admin@example.com
    ServerName example.com
    DocumentRoot /var/www/example.com

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

    ErrorLog ${APACHE_LOG_DIR}/example_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example_ssl_access.log combined
</VirtualHost>

4. SSL仮想ホストの有効化


SSL仮想ホストを有効化します。

sudo a2ensite example.com-ssl.conf

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

sudo systemctl restart apache2

5. HTTPからHTTPSへのリダイレクト設定


HTTPでアクセスされた場合、自動的にHTTPSへリダイレクトする設定を追加します。

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


これにより、http://example.comへのアクセスはすべてhttps://example.comに転送されます。

6. 動作確認


ブラウザでhttps://example.comにアクセスし、証明書が適用されていることを確認します。鍵マークが表示されていればSSL設定は成功です。

7. 証明書の自動更新設定


Let’s Encryptの証明書は90日で期限切れになるため、自動更新を設定します。

sudo certbot renew --dry-run


自動更新が問題なく動作することを確認します。

SSL仮想ホストを設定することで、セキュリティを強化し、信頼性の高いWebサイトを運用できます。次は、サブドメインの仮想ホスト設定について解説します。

サブドメインの設定方法


サブドメインを活用することで、blog.example.comshop.example.comのように、1つのドメイン内で複数のサービスやサイトを運用できます。Apache仮想ホストを利用して、サブドメインごとに異なるコンテンツを提供する設定方法を解説します。

1. サブドメイン用のドキュメントルート作成


サブドメインごとにWebサイトのデータを配置するディレクトリを作成します。

sudo mkdir -p /var/www/blog.example.com
sudo mkdir -p /var/www/shop.example.com


各ディレクトリにテスト用のHTMLファイルを作成します。

echo "<h1>Welcome to blog.example.com</h1>" | sudo tee /var/www/blog.example.com/index.html
echo "<h1>Welcome to shop.example.com</h1>" | sudo tee /var/www/shop.example.com/index.html

2. サブドメイン用の仮想ホスト設定ファイル作成


それぞれのサブドメインに対応する仮想ホスト設定ファイルを作成します。

blog.example.com用の設定ファイル

sudo nano /etc/apache2/sites-available/blog.example.com.conf
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName blog.example.com
    DocumentRoot /var/www/blog.example.com
    ErrorLog ${APACHE_LOG_DIR}/blog_error.log
    CustomLog ${APACHE_LOG_DIR}/blog_access.log combined
</VirtualHost>

shop.example.com用の設定ファイル

sudo nano /etc/apache2/sites-available/shop.example.com.conf
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName shop.example.com
    DocumentRoot /var/www/shop.example.com
    ErrorLog ${APACHE_LOG_DIR}/shop_error.log
    CustomLog ${APACHE_LOG_DIR}/shop_access.log combined
</VirtualHost>

3. サブドメイン仮想ホストの有効化


作成した仮想ホストを有効化します。

sudo a2ensite blog.example.com.conf
sudo a2ensite shop.example.com.conf


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

sudo systemctl restart apache2

4. DNS設定


ドメイン管理会社のDNS設定でサブドメインを追加します。以下のようにAレコードを設定します。

blog.example.com   A   123.45.67.89
shop.example.com   A   123.45.67.89


IPアドレス部分はサーバーのIPに置き換えてください。

5. 動作確認


ブラウザでhttp://blog.example.comhttp://shop.example.comにアクセスし、それぞれのサイトが表示されることを確認します。

6. サブドメインのSSL対応


サブドメインにもSSLを適用する場合、Let’s Encryptで証明書を発行します。

sudo certbot --apache -d blog.example.com -d shop.example.com


これにより、サブドメインごとにSSL証明書が適用され、HTTPS通信が可能になります。

サブドメインの運用は、大規模サイトや複数のサービスを提供する際に非常に有効です。次は、設定後の動作確認とトラブルシューティングについて解説します。

設定後の動作確認とトラブルシューティング


仮想ホストの設定が完了した後は、適切に動作しているかを確認し、問題があれば迅速に対処する必要があります。ここでは、動作確認の方法と、エラー発生時のトラブルシューティングについて解説します。

1. 仮想ホストの設定テスト


Apacheには、設定ファイルに文法エラーがないかを確認するためのコマンドがあります。仮想ホストを有効化した後は、以下のコマンドで設定の検証を行います。

sudo apachectl configtest


結果例

  • Syntax OK:設定に問題がありません。
  • Syntax error:エラーがある場合は、具体的な行やファイルが表示されます。

エラーが表示された場合は、該当ファイルを修正して再度コマンドを実行します。

2. アクセス確認


ブラウザで各ドメインにアクセスし、サイトが正しく表示されるか確認します。

http://example.com
http://sample.com
http://blog.example.com


表示されない場合は、curlコマンドでサーバーの応答を確認します。

curl -I http://example.com


応答がない場合は、Apacheの動作状態を確認します。

sudo systemctl status apache2

3. エラーログの確認


仮想ホストごとに設定したエラーログを確認し、原因を特定します。

sudo tail /var/log/apache2/example_error.log
sudo tail /var/log/apache2/sample_error.log


よくあるエラー例:

  • 403 Forbidden:ドキュメントルートのアクセス権が不足しています。
  • 404 Not Found:ドキュメントルートにファイルが存在しません。
  • 500 Internal Server Error:設定ファイルの記述ミスやPHPのエラーが原因です。

4. アクセス権の確認


ドキュメントルートに正しいアクセス権が付与されているか確認します。

sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com

5. ポートの確認


Apacheが正しいポートでリッスンしているかを確認します。

sudo netstat -tuln | grep :80


表示されない場合は、ポートが解放されていない可能性があります。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

6. DNS設定の確認


DNSの反映が完了していない場合は、pingでサーバーの応答を確認します。

ping example.com


正しいIPアドレスが返ってこない場合は、DNS設定を見直します。

7. hostsファイルを使ったテスト(ローカル環境)


DNSが未反映でも、/etc/hostsファイルにエントリを追加してローカルで動作確認が可能です。

127.0.0.1 example.com
127.0.0.1 sample.com

8. 設定の見直し


仮想ホスト設定ファイルのスペルミスやポート設定ミスが原因となることがあります。仮想ホストファイルを再度見直して正しいか確認しましょう。

sudo nano /etc/apache2/sites-available/example.com.conf

以上の手順で仮想ホストの設定不具合を特定し、迅速に修正できます。次は、Apache仮想ホストのパフォーマンス最適化について解説します。

Apache仮想ホストのパフォーマンス最適化


複数の仮想ホストを運用するApacheサーバーでは、アクセス集中やリソース不足がパフォーマンス低下の原因になります。ここでは、仮想ホスト環境でApacheのパフォーマンスを向上させるための最適化方法を解説します。

1. KeepAliveの有効化


KeepAliveは、同一クライアントからの複数のリクエストを1つのTCP接続で処理することで、オーバーヘッドを削減します。
設定ファイル/etc/apache2/apache2.confを編集します。

sudo nano /etc/apache2/apache2.conf


以下のように設定します。

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
  • KeepAlive On:KeepAliveを有効化
  • MaxKeepAliveRequests:1つの接続で処理できる最大リクエスト数
  • KeepAliveTimeout:クライアントからのリクエスト待機時間

2. MPM(マルチプロセッシングモジュール)の調整


ApacheではMPMを調整してプロセスやスレッドの数を管理できます。デフォルトではmpm_preforkが使われますが、パフォーマンス重視ならmpm_eventが推奨されます。

MPMの変更

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2


設定ファイル/etc/apache2/mods-available/mpm_event.confを編集して、プロセスとスレッドの数を調整します。

<IfModule mpm_event_module>
    StartServers              3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit              64
    ThreadsPerChild          25
    MaxRequestWorkers        150
    MaxConnectionsPerChild   3000
</IfModule>
  • ThreadsPerChild:1プロセスあたりのスレッド数
  • MaxRequestWorkers:同時接続数の上限

3. キャッシュの導入


キャッシュを導入することで、静的ファイルの配信を高速化します。mod_cacheモジュールを有効化します。

sudo a2enmod cache
sudo a2enmod cache_disk
sudo systemctl restart apache2


仮想ホスト設定ファイルにキャッシュ設定を追加します。

CacheQuickHandler off
CacheEnable disk /
CacheRoot /var/cache/apache2
CacheDefaultExpire 600
CacheMaxExpire 86400

4. 圧縮の有効化(mod_deflate)


mod_deflateを使ってHTML、CSS、JavaScriptなどのテキストファイルを圧縮し、転送速度を向上させます。

sudo a2enmod deflate
sudo systemctl restart apache2


仮想ホスト設定に以下を追加します。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml
    AddOutputFilterByType DEFLATE text/css application/javascript
</IfModule>

5. 静的ファイルの最適化


画像やCSS、JavaScriptなどの静的ファイルはExpiresヘッダーを設定して、ブラウザキャッシュを利用します。

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
</IfModule>

6. 不要なモジュールの無効化


使用していないモジュールは無効化して、メモリ消費を抑えます。

sudo a2dismod status
sudo a2dismod cgi
sudo systemctl restart apache2

7. ログのローテーション設定


ログファイルが肥大化するとディスク容量を圧迫します。logrotateを使ってログを自動でローテーションします。

sudo nano /etc/logrotate.d/apache2
/var/log/apache2/*.log {
    weekly
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        if [ -f /var/run/apache2.pid ]; then
            /etc/init.d/apache2 reload > /dev/null
        fi
    endscript
}

8. HTTP/2の有効化


HTTP/2は高速なデータ転送を可能にし、パフォーマンスを向上させます。

sudo a2enmod http2
sudo systemctl restart apache2


仮想ホスト設定ファイルにProtocols h2 http/1.1を追加します。

<VirtualHost *:443>
    Protocols h2 http/1.1
</VirtualHost>

これらの最適化手法を実施することで、Apache仮想ホスト環境のパフォーマンスを大幅に向上させることができます。次は、全体のまとめを解説します。

まとめ


本記事では、Apacheで複数ドメインを1台のサーバーで運用するための仮想ホスト設定について詳しく解説しました。仮想ホストの基本概念から、IPベース・名前ベースの違い、SSL対応、サブドメインの設定方法まで幅広く取り上げました。

仮想ホストを活用することで、サーバーリソースを効率的に使い、コストを削減しながら複数のWebサイトを簡単に管理できます。また、SSLの導入やパフォーマンス最適化を行うことで、セキュアで高速なWebサイトの運用が可能になります。

最後に、設定後の動作確認とトラブルシューティングを徹底し、安定したサーバー運用を心がけることが重要です。Apache仮想ホストの知識を活かして、多様なWebサービスの運用に役立ててください。

コメント

コメントする

目次