一つのApache設定ファイルを複数のPCで使う

 自宅とAWS上でほぼ同じ内容のWebサーバーを稼働させている。

  • OS: Windows Server 2016
  • Server version: Apache/2.4.43 (Win64)

 コンテンツはほぼ同じなのだが、ドメイン名とか違っているのでhttpd.confなどがそれぞれ別の内容になっている。

 似たような内容が2か所にコピーされているのは間違いの元なので、一つのconfファイルが使えないかといろいろ試していてやっと実現できた。

 confファイルの中で分岐させるのは<If>とか<SetEnvIf>とか<IfDefine>とかあるけど、<If>とかは実行時にページを要求されるごとに評価されるためか、うまく動かなかった。

 <IfDefine>は起動時に評価されるため、なんとか実現できた模様。

 以下はPC1という名前とPC2という名前の二つのPCが、それぞれdomain1.com,domaein2.comとうドメインを運用している前提で説明する。

httpd.confでApacheの環境変数を定義する。

Define COMPUTER_${COMPUTERNAME}
<IfDefine COMPUTER_PC1>
    Define DOMAIN "domain1.com"
</ifDefine>
<IfDefine COMPUTER_PC2>
    Define DOMAIN "domain2.com"
</ifDefine>

 PCのシステム環境変数COMPUTERNAMEを使ってそれぞれ別のApache環境変数を定義している。

 httpd-vhosts.confなどでは<IfDefine>を使ってそれぞれ固有の設定を記述する。

<IfDefine COMPUTER_PC1>
<Directory "C:/xampp/htdocs">
    Options FollowSymLinks
    AllowOverride All
    Require all denied
    Require ip ${IPADDR_LOCAL}
</Directory>
</IfDefine>

<IfDefine COMPUTER_PC2>
<Directory "C:/xampp/htdocs">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
</IfDefine>

<VirtualHost *:80>
    ServerAdmin postmaster@${DOMAIN}
    DocumentRoot "C:/xampp/htdocs"
    ServerName www.${DOMAIN}
    ServerAlias ${DOMAIN}
    ErrorLog  "| bin/rotatelogs.exe logs/${DOMAIN}-error_%Y-%m.log  86400"
    CustomLog "| bin/rotatelogs.exe logs/${DOMAIN}-access_%Y-%m.log 86400"
</VirtualHost>

 上記はPC1だけIPアドレスによるアクセス制限をかけている。

 VirtualHostは、それぞれのドメインを同じ記述で別の定義を行っている。

 それぞれのPC上で、以下のコマンドを使って実行時に設定されている内容を確認する。

httpd.exe -S                  VirtualHostの確認
httpd.exe -t -DDUMP_CONFIG    設定の確認