現在Apache 2.4が出ているので古い部類に属するCentOS 6のWebサーバソフト・Apache 2.2ですが、CentOS 5のメンテナンススケジュールの運用状況などから考えますと、しばらくは現役のウェブサーバ用OSとして使われていくものと思われます。
そのApacheの設定は、おおむね「/etc/httpd/conf/httpd.conf」からスタートするようになっていますが、「httpd.conf」の設定は多岐にわたり、また途中で別のディレクトリ内にあるファイルをincludeするようになっていたりするなど、なかなか難解になっています。
「httpd.conf」の設定を変更するとき、よく行われるのが、「既存の httpd.conf のコメントアウトされている設定値の付近で新たに設定値を追加する」ことですが、これは設定値が分散して記述されていることになり、他の人が見たときには非常に分かりにくいものになってしまいます。
そこで、(設定値によっては)後から書いた設定値で上書きされる性質を利用して、特定の箇所でまとめて設定値を書く方法を検討してみます。
目次
Apacheの設定ファイルの構造について
CentOS 6の httpdパッケージ(Apache)では、コメント部を省いて大まかに見ると、以下のような構成になっています。
ServerTokens OS
ServerRoot "/etc/httpd"
PidFile run/httpd.pid
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
...
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
...
Listen 80
...
LoadModule auth_basic_module modules/mod_auth_basic.so
...
LoadModule cgi_module modules/mod_cgi.so
...
Include conf.d/*.conf
...
User apache
Group apache
ServerAdmin root@localhost
UseCanonicalName Off
DocumentRoot "/var/www/html"
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
...
BrowserMatch "Mozilla/2" nokeepalive
...
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
「httpd.conf」の途中で「Include conf.d/*.conf」があるため、先頭の方で設定していた「ServerRoot "/etc/httpd"」に従い、「/etc/httpd」をサーバルートディレクトリとして相対パス「conf.d/*.conf(絶対パスに直すと /etc/httpd/conf.d/*.conf )」をIncludeします。
よって、設定の読み込まれる順番は、
- /etc/httpd/conf/httpd.conf の前半
- /etc/httpd/conf.d ディレクトリの.conf拡張子のファイルの中身
- /etc/httpd/conf/httpd.conf の後半
となります。
上記画像のように、Apacheの「confファイル」は、Includeディレクティブにより「conf.d/*.conf」を読み込みます
「/etc/httpd/conf.d」ディレクトリは、Apacheを利用する他のアプリケーションやサービスで、Apacheの設定を追加するのによく使われますが、上記の理由から、「3. /etc/httpd/conf/httpd.conf の後半部」に書かれた設定値で上書きされてしまう可能性があることに注意が必要です。
Apacheの設定をまとめて記述する場所について
Apacheの設定を変更する場合、上書きされる設定値については、最後に読み込まれる方が有効になりますので、「httpd.conf」の後半の最後にまとめて書いたほうが有効です。
一方、「httpd.conf」はあまり頻繁に書き換えたくないので、2か所に分けて、以下のような方針になります。
- 「httpd.conf」の前半で書いてある設定値を上書きしたい場合は、「/etc/httpd/conf.d/00server.conf」に設定値を書く(ファイル名はGo-Next社における命名です)
- 「conf.d/*.conf」「httpd.conf」の後半の設定値を上書きしたい場合は、「/etc/httpd/conf/httpd.conf」の末尾に設定値を書く
上記画像のように、「httpd.conf」を「なるべく」いじらずに設定を追加する場合は2か所に注目
このように役割を分散させることで、「httpd.conf」に関してはめったに書き換えず、サーバチューニングの必要がある場合だけ「00server.conf」を書き換え対応することができます。
上書きできない設定値について
Apacheの設定値は、たいていは後に書いた値で上書きされますが、一部の設定値は、追加設定になったり、設定値を後から取り消せなかったりするものがありますので、そのような設定値の場合は、出現箇所で書き換えたり、コメントアウトすることが必要です。
設定値を複数書くと、追加設定になる設定
- Listen
- CustomLog
- ScriptAliasなど
「Listen」に関しては、複数書くとApacheで複数ポートの受け入れをする設定になります。
「CustomLog」に関しては、複数書くと、それぞれの「CustomLog」の設定に従い同時に複数のログ記録処理を行います(CustomLogディレクティブが5行あればログファイルが5個書き出されるということ)。ログ書き込み処理はApacheの中でも大きな負荷になりますので、複数設定できることを忘れると思わぬトラブルにつながります。
設定値を後から取り消しできない設定
たいていの設定値は一度設定した設定値を取り消すことはできないのですが、通常はその必要がありません。
しかし、次にあげる設定値は、後から設定値を無効にできたほうが都合がいいのですが、そのような仕組みが用意されていません。
- LoadModule
「LoadModule」は、Apacheが本来持っていない機能を追加をするモジュールファイルの読み込み設定です。
このモジュール組み込みに関しては、Apacheの使用メモリを少なくする目的であったり、Apacheに不要な応答をさせない目的であったりなど、デフォルト組み込みモジュールを利用しないよう設定したい場合がありますが、設定ファイル内でモジュール読み込みを阻害させる設定値が用意されていないため、「httpd.conf」内で出現した箇所でのコメントアウトが必要となります。
実例
それでは、今までの説明を受けて、実際にどこにどのような設定をすればいいかを説明します。
/etc/httpd/conf/httpd.confの前半でやむを得ず変更する設定値
「httpd.conf」の前半に書かれているディレクティブで重要なのは、
- Listen 80
- LoadModule
です。
「Listen」ディレクティブについては、後の方で記述すると Listenポートを増やすことになってしまいますので、TCPポート80番をListenさせたくない場合は、この場所でコメントアウトする必要があります。
「LoadModule」ディレクティブに関しては、メモリ使用量を少なくしたいときに読み込ませなくしたいのですが、これも後から読み込み停止を指定できないため、この場でコメントアウトします。
/etc/httpd/conf.d/00server.conf に書く設定値
「/etc/httpd/conf.d」は「httpd.conf」の前半が読み込まれたあとに差し込みで読み込まれます。
その中で「00server.conf」という名前にしておくと、ファイル名のソート順で読み込まれるルールにより、他のパッケージがインストールするものよりも先に読み込まれるため、設定値の見通しがよくなります。
この場所では、サーバごとに異なるであろう、Apacheのキャパシティに関するパラメータ、「MaxClients/ServerLimit」などを記述するのがおすすめです。
また、Apacheのステータスを取得できる「ExtendedStatus On/<Location /server-status>/<Location /server-info>」などもここで設定しておくと「httpd.conf」側でコメントアウトを解除したりする手間が省けます。
ServerTokens Os
Timeout 60
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
ExtendedStatus On
AddHandler cgi-script .cgi
StartServers 50
MinSpareServers 50
MaxSpareServers 50
ServerLimit 50
MaxClients 50
MaxRequestsPerChild 1000
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
SetHandler server-info
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
Order allow,deny
Deny from all
Satisfy all
NameVirtualHost *:80
##### dummy
なお、レンタルサーバなどで「httpd.conf」の「ServerLimit」を書き換えても変更されないような設定のサーバがありますが、その場合、「/etc/httpd/conf.d/swtune.conf」に制限値が書かれているため、「httpd.conf」内の記述位置によっては「swtune.conf」の設定に上書きされてしまうようになっていたというものがありました。
httpd.conf の後半の末尾に書く設定値
「httpd.conf」の後半の末尾に書く設定値は、上書きできる設定値であれば、ここで書いた設定値で上書きできてしまう強力なものになります。
一方、「httpd.conf」を頻繁に書き換えたくないという目的で言えば、試行錯誤をして書き換える「ServerLimit」などをここに書くのはあまりよくありません。
セットアップ時に1回だけ設定して当分変更しないものを書きます。
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#
User web
Group web
ServerAdmin root@localhost
ServerSignature On
DocumentRoot "/home/www/htdoc"
DirectoryIndex index.php index.html index.htm
SetEnvIf Request_URI "/favicon\.ico$" no_log
CustomLog logs/access_log combined env=!no_log
AddDefaultCharset Off
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
Options -Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
ディレクティブの「User/Group/ServerAdmin/DocumentRoot/AddDefaultCharset」はいずれも一つしか設定できない設定値になっているため、後から書いたものが有効になります。
「CustomLog」をこの場所で設定する場合は、「httpd.conf」の後半内に出てくる「CustomLog」ディレクティブをコメントアウトしておかないと、ログの多重書き出しになってパフォーマンスが低下したり、同じログファイルに書き込もうとすると正常なログが得られないなどの問題が発生します。
まとめ
「Linux」のディストリビューション(今回はCentOS 6)標準のApacheパッケージをインストールした時、なるべく設定を書く場所をまとめておくことで、他の人が見たときにサーバの設定状態がわかるようになりました。
Linuxサーバの設定は、どこをいじったのかわからなくなったりするなど管理が大変ですが、ちょっとの工夫でずいぶん見通しがよくなりますよ!