今回、少し古めの環境を再現する必要があったため構築作業を行っていたのですが、少しハマったので備忘録。
Apache2.2系とCentOS6を使ったテスト環境を作成していたのですが、設定完了し、configtestを行ったところ…
# apachectl configtest httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [Tue Jul 17 14:41:13 2018] [warn] _default_ VirtualHost overlap on port 80, the first has precedence Syntax OK
とのエラーが。
“_default_” の指定はVirtualHostで指定されたどのドメインにもマッチしなかった場合や、IPアドレスでアクセスされた場合に使われる”デフォルトの”VirtualHostを指定するときに使います。
超簡単に書くと
<VirtualHost _default_:80> ServerName example.com DocumentRoot /path/to/directory </VirtualHost>
のように指定すると、すべてのVirtualHostで記述のないホスト名で接続された場合や、VirtualHostディレクティブで指定されていないIPでアクセスされた場合は、この”_default_”が指定されたVirtualHostの設定が適用されます。
デフォルトの動作を定めるオプションなので、全設定ファイル中1箇所でしか指定できません。
この_default_の指定を複数個所で指定してしまった際に出てくるエラー(Warning)が
_default_ VirtualHost overlap on port 80, the first has precedence
です。
ただ、今回の場合”_default_”は一か所でしか指定していなかったにもかかわらず、上記のエラーが出てしまっているのでちょっと首をひねっていました。
Warningなので無視をしてもApacheを動かすことはできますが、予期しない動作をしてしまうことがあるので直しておきたいところ。
いろいろ調べたところ原因が判明しました。
Apache2.2系でVirtualHostする場合は”NameVirtualHost *:80″の指定が必要
Apache2.2系の場合、VirtualHostを設定する場合はNameVirtualHostを指定する必要があります。
指定するときは
NameVirtualHost 対象のIPアドレス:対象のポート
とします。
IPアドレスが定まっていない、あるいはサーバに割り当てられているIPすべてに適用したい場合は
NameVirtualHost *:80
と指定することも可能です
“_default_ VirtualHost overlap”エラーはこのNameVirtualHostが指定されていないときも出力されるようで、今回はこれが原因でした。
ただし、Apache2.4からはNameVirtualHostは指定しなくてもエラーは出ません。(NameVirtualHostの指定なしでVirtualHostを指定できます。)
これから新しい環境を作る際にApacheを用いる際、大抵の場合はApache2.4を使われるかと思いますので気にする機会は少ないかとは思いますが、Apache2.2系の環境を作られる機会があった場合は注意が必要です。