83
73

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-05-24

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

/etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

自分でサーバ管理する場合は、この<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つの設定ファイルをいろんな環境で使い回したい」ときに使うものである、と書いてあります。

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は消しておいた方がよいでしょう。

83
73
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
73

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?