Help us understand the problem. What is going on with this article?

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

DQNEO
PHP/Go/Perl/C/Docker/Linux/Git/AWS
http://dqn.sakusakutto.jp
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
https://tech.mercari.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした