自宅と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 設定の確認