Apache

Apache設定ファイルのIfModuleは消しておく方がよい。

More than 3 years have passed since last update.

Apacheの設定ファイルは、パッケージのデフォルトをそのまま使っていると、<IfModule>ディレクティブがたくさん記述してあると思います。


/etc/httpd/conf/httpd.conf

<IfModule dir_module>

DirectoryIndex index.html
</IfModule>

自分でサーバ管理する場合は、この<IfModule>は全部消したほうがいいと思います。

実際、マニュアルにも「普通の運用では使う必要がない」と書いてあります。

http://httpd.apache.org/docs/2.4/en/mod/core.html#ifmodule


In normal operation, directives need not be placed in <IfModule> sections.


以下、IfModuleがなぜダメかの理由をのべます。


理由1:IfModuleがあると可読性が下がる

<IfModule>で囲われていると、その設定が実際に有効になっているのかどうかがそこだけ見てもわかりません。

長大なhttpd.confの中にあるLoadModuleの森を探求したり、conf.modules.dディレクトリの中を探したりして、そのモジュールがロードされてるかどうかを確認しないといけなくなります。

つまり、


/etc/httpd/conf/httpd.conf

<IfModule dir_module>

DirectoryIndex index.html
</IfModule>

だと、「この設定は適用されてないかもしれない」という可能性が頭をよぎります。

しかしもしIfModuleを外して


/etc/httpd/conf/httpd.conf

DirectoryIndex index.html


とだけ書いてあれば、この設定は有効であると即座にわかります。

「考えることを減らす」のはシステム管理上とても重要です。


理由2:モジュール名の指定方法が一意でないのでわかりづらい

モジュール名の指定方法には何通りかあるので、ぱっと見て一致してるかわかりにくいケースがあります。

例えばCentOS7にRemiレポジトリのPHPをインストールした場合、

<IfModule  mod_php5.c>

というのが追加されますが、ロードする部分は

LoadModule php5_module modules/libphp5.so

となっています。

"mod_php5.c"と"libphp5.so"が同じモジュールを指しているとパッと見てわかるでしょうか?


理由3:そもそも条件分岐する必要がない

サーバ運用において、どのモジュールを使うか/使わないかは事前に決めておくべきことです。

「あるモジュールが入ってる場合はこうで、入ってない場合はこう」という場合分けの発想自体が間違いだと思います。


理由4:IfModuleがなければ、モジュールのロードし忘れを防げる

dir_moduleをロードしてない状態で、


/etc/httpd/conf/httpd.conf

DirectoryIndex index.html


と書いてあると、起動に失敗します。

これはモジュールのロード忘れを発見するのに効果絶大です。

<IfModule>でくくっていると、ロードし忘れてもApacheが起動するのので、「動くけどなんか挙動がおかしい」ということになります。

これは見つけにくいバグの原因になります。


IfModuleは何のためにあるのか?

「1つの設定ファイルをいろんな環境で使い回したい」ときに使うものである、と書いてあります。

http://httpd.apache.org/docs/2.4/en/mod/core.html#ifmodule


This section should only be used if you need to have one configuration file that works whether or not a specific module is available.


具体的にはOSのディストリビューションがデフォルト設定ファイルを提供するケースがそれに当たるでしょう。

PHPのアプリケーションが.htaccessを同梱する場合とかもそうですね。

「1つの設定ファイルをいろんな環境で使いまわす」というのは普通のサーバ運用ではあり得ないと思うので、やはり結論としてはIfModuleは消しておいた方がよいでしょう。