【Apache】運用に効く!バーチャルホスト複数サイト設定例(SSL・URL正規化にも対応)

シェアする

IT・Web業界での転職への転職を考えていれば⇨IT・Web業界での転職なら【レバテックキャリア】

この記事では、Apacheでバーチャルホストを使用し複数サイトを運用するため、メンテナンス性や拡張性に重点をおいた実践的な設定ファイル構成を提案します。
また、SSLやURLの正規化にも対応しています。

バーチャルホストの基本的な説明と最低限の設定方法は以下の記事で解説していますので、ぜひごあわせてお読みください。

バーチャルホストの設定を行うことにより、1台のApache WEBサーバでマルチドメインによる複数のWEBサイトを運用できます。リソースの節約、運用・管理コストの削減にお役立てください。

運用しやすいように設計しておこう

実際に複数ドメインでのサイト運用を行っていると、様々な要求や課題が発生します。

  • ドメインを新たに追加したり既存ドメインを削除したりする
  • 特定のドメインにだけ設定の変更を行いたい
  • 全てのドメインに共通の設定変更を行いたい

このようなケースにおいて、できる限り既存の設定への影響を小さくし、手軽に変更を行えるようにあらかじめ設定ファイルの構成を設計しておきましょう。

ファイル構成の基本方針

個別ドメインごとに仮想ホスト設定ファイルを作成する

これは基本ですね。
ドメインごとにVirtualHostディレクティブを記述する必要がありますので、ドメイン別の仮想ホスト設定ファイルを作成して記述するようにします。

これによって、ドメインごとに設定の修正や削除を行う際、他ドメインのサイトへの影響を考慮せずに済みます。

全ドメインに記述する設定は共通化して別ファイルに記述する

こちらも重要です。

各ドメインのVirtualHostディレクティブ内に記述すべき設定には、同一の内容も少なくありません。
それらの設定を運用中に変更したくなった場合、ドメインの数が多いと修正箇所が多くなり、手間が増えるだけでなく管理も煩雑になります。

そのような設定はあらかじめ仮想ホスト用の共通設定ファイルにまとめて記述し、ドメイン別の仮想ホスト設定ファイルからincludeするようにすると良いでしょう。

それでは、実際に設定を行っていきましょう。

[STEP1]仮想ホスト設定ファイルを格納するディレクトリの作成

ドメイン別の仮想ホスト設定ファイルを格納するディレクトリ

ドメイン別の仮想ホスト設定ファイルは、httpd.confからincludeします。
ワイルドカードでまとめてincludeできるよう、専用のディレクトリを作成して格納するのが良いでしょう。
ここでは、conf.vh.commonという名前のディレクトリを作成することにします。

/etc/httpd/conf.vh.hosts
 |- hogehoge.com.conf # ドメインhogehoge.comの設定ファイル
 |- fugafuga.com.conf # ドメインfugafuga.comの設定ファイル
    ・
    ・
    ・

バーチャルホストの共通設定ファイルを格納するディレクトリ

バーチャルホストの共通設定ファイルは、ドメイン別の仮想ホスト設定ファイルからincludeしますので、ディレクトリを分けて格納しておきましょう。
ここでは、conf.vh.commonという名前のディレクトリを作成することにします。

/etc/httpd/conf.vh.common
 |- vhost.conf # VirtualHostディレクティブ内でincludeする共通設定ファイル
 |- vhost.doc-root.conf # VirtualHostディレクティブ内のDocumentRootディレクトリ内でincludeする共通設定ファイル
    ・
    ・
    ・

[STEP2]httpd.confの記述例

いよいよ設定ファイルの作成・編集に入ります。
うまく動かなくなってしまった場合に元に戻せるよう、既存の設定ファイルは必ずバックアップしておきましょう。
まずはhttpd.confを編集します。

ServerRoot "/etc/httpd"
Listen 80
User apache
Group apache

#
# [confファイルのInclude]
#
Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf

#
# [グローバル環境設定]
#
~ 記述省略 ~


#
# [デフォルト仮想ホスト(ダミー)]
#
<VirtualHost *:80>
  ServerName dummy  # 実際には使用しないダミーのサーバ名を指定する
  DocumentRoot /var/www/dummy
  Redirect 404 /
</VirtualHost>

#
# [ドメイン別仮想ホスト設定ファイルの読み込み]
#
Include conf.vh.hosts/*.conf

ポイントは、デフォルトのダミーホスト設定をhttpd.confに記述し、その後に各ドメインの仮想ホスト設定ファイルを読み込んでいることです。
このようにすることで、ダミーホストの設定が必ず先頭に記述されることになります。

次に、仮想ホストの設定の前に、SSL設定とURLの正規化の説明です。

[STEP3]SSLの設定

ApacheのSSL設定は、デフォルトでssl.confファイルに記述され、httpd.confからincludeされています。

しかし、証明書ファイルのパス指定などはドメインごとに異なります。
また、各ドメインで同一の内容であっても、VirtualHostディレクティブ内へ記述しなければならない設定もあります。
このような情報は、httpd.confのグローバルでincludeされるssl.confに記述しておくことはできません。

そこで、ssl.confに記述されている情報を3つの区分に分類し、ssl.confに残しておくもの、バーチャルホスト設定ファイルに転記するものに仕分けていきます。

(1) 各ドメイン共通の設定のうち、グローバルに記述するもの

ssl.confにそのまま残しておき、httpd.confからincludeします。

Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog

SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300

SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin

#
# [SSLプロトコル指定]
#
# SSLv2、SSLv3は深刻な脆弱性を抱えているので私用しない
SSLProtocol all -SSLv2 -SSLv3

#
# [暗号の選択をサーバ側で決定(SSLダウングレード攻撃防止)]
#
SSLHonorCipherOrder on

#
# [暗号スイート]
#
# 脆弱性のある暗号化スイートは明示的に禁止
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES:!RC4:!DH

#
# [Strict-Transport-Securityヘッダ設定]
#
# 常時HTTPS通信サポートの為ヘッダ付与
Header set Strict-Transport-Security "max-age=315360000;"

(2) 各ドメイン共通の設定のうち、VirtualHostディレクティブ内に記述するもの

仮想ホスト用のSSL設定ファイルを作成してまとめて記述しておき、ドメイン別の仮想ホスト設定ファイルからincludeします。
ここでは仮想ホスト用の共通SSL設定ファイルをvhost.ssl.confと命名し、conf.vh.commonディレクトリに配置して、以下のように記述してみましょう。

#
# [SSLエンジンスイッチ]
#
SSLEngine on

#
# [SSLエンジンオプション]
#
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

#
# [プロトコル調整]
#
BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

各ドメインごとに異なる設定内容

主に証明書ファイルや証明書ファイル、秘密鍵ファイルのパス指定が該当します。
これらの情報は、各ドメインの仮想ホスト設定ファイル内に直接記述します。(記述方法は後で説明します)

[STEP4]URLの正規化

wwwの有り/無しの統一、HTTPリクエストからHTTPSへのリダイレクトなど、URLの正規化はWEBサイト運用において必須対策ですね。
リクエストURLのリライト設定は、VirtualHostディレクティブ内へ記述する必要があります。

パターンマッチを使えば、リライト設定の記述は共通化することができます。
リライト用の設定ファイルを作成してconf.vh.commonディレクトリに配置し、ドメイン別の仮想ホスト設定ファイルからからincludeしましょう。

この際、リライト内容ごとにファイルを分けておいた方が後で運用ルールの変更などに対応しやすいです。

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
  RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^www\.
  RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>	
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

[STEP5]バーチャルホストの共通設定ファイル

次に、VirtualHostディレクティブ内に記述する設定のうち、すべてのドメインで同一の設定内容をまとめて記述しておく共通設定ファイルを作成します。
これらのファイルもconf.vh.commonディレクトリに配置します。
また、ドメイン別の仮想ホスト設定ファイル内でincludeを行う場所ごとに設定ファイルを分けておきましょう。

VirtualHostディレクティブ内でincludeする共通設定ファイル

#
# [デフォルトCharセット]
#
AddDefaultCharset UTF-8

#
# [ログ出力レベル]
#
LogLevel warn

VirtualHostディレクティブ内のDocumentRootディレクトリ内でincludeする共通設定ファイル

#
# [Options設定]
#
# DocumentRoot以下でシンボリックリンクの参照とCGI実行を許可する
Options ExecCGI FollowSymLinks

#
# [.htaccess設定]
#
# mod_rewrite、基本認証、IP制限を想定して許可
AllowOverride FileInfo AuthConfig Limit

#
# [アクセス許可]
#
Require all granted

#
# [URL正規化]
#
<IfModule mod_rewrite.c>
  RewriteEngine On
  # -- indexファイルを省略 --
  RewriteCond %{THE_REQUEST} ^.*/?index.(html|php)
  RewriteRule ^/?(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

[STEP6]ドメイン別の仮想ホスト設定ファイル

最後にドメイン別の仮想ホスト設定ファイルを作成します。
新たにドメインを追加する場合は、この設定ファイルだけを複製・編集すればOKです。

#
# [HTTP]
#
<VirtualHost *:80>
    # ドメイン名を書き換えること
    ServerName hogehoge.com:80
    ServerAlias www.hogehoge.com:80
    # HTTPSリダイレクト
    Include conf.vh.common/rewrite.https.conf
</VirtualHost>

#
# [HTTPS]
#
<VirtualHost *:443>
    #
    # [正規ホスト名とドキュメントルート]
    #
    ServerName hogehoge.com:443
    ServerAlias www.hogehoge.com:443
    # www有無の統一
    # ドメインごとにwww有り/無しのどちらに統一するかを定め、どちらかのリライト設定のみを有効にしましょう
    #Include conf.vh.common/rewrite.add-www.conf
    Include conf.vh.common/rewrite.del-www.conf

    ServerAdmin admin@hogehoge.com
    DocumentRoot "/var/www/html"

    #
    # [バーチャルホスト共通設定ファイルのInclude]
    #
    Include conf.vh.common/vhost.ssl.conf
    Include conf.vh.common/vhost.conf

    #
    # [SSL証明書の設定]
    #
    SSLCertificateKeyFile /etc/pki/tls/certs/hogehoge.com.key
    SSLCertificateFile /etc/pki/tls/certs/hogehoge.com.crt
    SSLCACertificateFile /etc/pki/tls/certs/hogehoge.com.ca-bundle

    #
    # [ログファイル設定]
    # ログファイルはドメインごとに分けておくことをお勧めします。
    # 
    ErrorLog logs/ssl-error.hogehoge,com.log
    TransferLog logs/ssl-access.hogehoge,com.log
    CustomLog logs/ssl-request.hogehoge,com.log \
              "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

    #
    # [DocumentRootディレクトリ設定]
    #
    <Directory "/var/www/html">
        # [バーチャルホスト共通設定ファイルのInclude]
        Include conf.vh.common/vhost.doc-root.conf
    </Directory>
</VirtualHost>

終わりに

以上で、各ドメインごとに異なる設定内容だけをドメイン別の設定ファイルに記述し、その他の設定は共通化して外出しすることができました。
かなり長い解説になってしまいましたが、実運用において管理しやすいファイル構成になっていると思いますので、最初は面倒でも頑張って設定してみていただけると幸いです。

もちろん必要な設定内容は、サイトや環境、運用等の要件によって異なります。
この記事を参考に、運用しやすいバーチャルホスト環境を構築してください。

シェアする

フォローする