書籍「初めてのWebサーバ「Apache」CentOS 7編」のまとめ。
点数
89点
感想
説明がわかりやすく、とても勉強になった。
MPMの設定、Optionsディレクティブ, AllowOverrideディレクティブ、などApacheの設定を行う際に必要な情報は一通り記述されていた。
基本
モジュール
2種類あるが、CentOSを含めたほとんどのディストリビューションが動的モジュールとしてモジュールを用意している。
- 静的モジュール コンパイル時に本体のバイナリに組み込む。
- DSO(Dynamic Shared Object)モジュール 動的に組み込む。
CentOSではDSOモジュールは/use/lib64/httpd/modulesに置かれている。
(/etc/httpd/modulesには/use/lib64/httpd/modulesへのシンボリックリンクがある)
有効なモジュールの確認
httpd -M
またはapachectl -M
静的モジュールは(static)、動的モジュールは(shared)として表示される。
起動コマンド
Apache本体は/usr/sbin/httpdである。
制御用にapachectlコマンドが用意されている。
CentOS 7ではサービス管理のためのsystemctlコマンドが用意されているので、どちらでもApacheの起動や停止が可能である。
- apachectl
apachectl configtest/stat/stop/restart/status/graceful
- systemctl
systemctl start/stop/restart/status httpd
※ Apacheをサービスとして有効化/無効化する:systemctl enable/disable httpd
設定
設定ファイルの場所
CentOSでは、設定ファイルが/etc/httpdディレクトリにまとめて保存されている。メインの設定ファイルは/etc/httpd/conf/httpd.confである。
すべての設定をhttpd.conf内に記述すると煩雑になるので、機能やモジュール毎の設定ファイル(拡張子は.conf)が/etc/httpd/conf.d/, /etc/httpd/conf.modules.d/に用意されていて、httpd.confでそれらのファイルを読み込んでいる。IncludeOptional conf.d/*.conf
Include conf.modules.d/*.conf
※ IncludeOptionalディレクティブはワイルドカードに一致するファイルが見つからなかった場合にエラーにならないのに対して、Includeディレクティブはエラーになる。
たとえば、/etc/httpd/conf.modules.d/00-base.confでは、複数のLoadModuleディレクティブにより基本的なモジュールをまとめて読み込んでいる。LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
…以下、60個くらいのモジュール読み込みが続く。
httpd.confの主なディレクティブ
- ServerAdmin
管理者のメアド。404画面などに表示される。 - ServerName
FQDN+ポート番号。
なくても自動認識されるが、設定することが推奨されている。 - AddDefaultCharset
レスポンスヘッダに付加されるcharset。
デフォルトはUTF-8がセットされている。
これが設定されているとmetaタグで文字コードを指定しても無視される。
複数の文字コードのHTMLファイルが混在する場合はコメントアウトする。
ディレクティブの後ろ(行末)にコメントを記述することはできないので注意。AddDefaultCharset: UTF-8 #hoge
は起動時にエラーとなる。
MPMの設定
Apache2.xからはサーバプロセスの動作モードもMPM(Multi Processing Module)としてモジュール化された。
3種類のMPMから選択可能となっている。
(httpd -M|grep mpm
で現在の設定を確認可能)
- prefork MPM
マルチプロセス型。
あらかじめ複数のプロセスを立ち上げておく。 - worker MPM
マルチスレッド型。
プロセスは1つで、リクエスト毎にスレッドを割り当てる。
設定したスレッド数を超えると新たなプロセスを立ち上げる。 - event MPM
Apache2.4から追加された。
worker MPMの一種で、KeepAlive時の処理を別のスレッドに割り振る。
event MPMが最も効率が良いが、デフォルトではprefork MPMになっている。
MPMの設定は/etc/httpd/conf.modules.d/00-mpm.confにある。
event MPMを有効にする場合は、LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
をコメントアウトしてLoadModule mpm_event_module modules/mod_mpm_event.so
のコメントアウトを外す。
event MPMでPHPを使う場合、PHPがスレッドセーフである必要があり、通常はphp-fpmを使う。
ディレクティブ
セクションディレクティブ
- ディレクトリを指定
<Directory "var/www/html">
ここにディレクティブを記述
</Directory>
- ファイルを指定
<Files "sercret.html">
ここにディレクティブを記述
</Files>
- URLのパスを指定
LocationとAliasを組み合わせて使用する。<Location URLのパス>
ここにディレクティブを記述
</Location>
Alias URLのパス 実際のパス
例)<Location /dav /var/www/dav>
Dav on
</Location>
Alias /dav /var/www/dav
<Directory<, <Files>, <Location>はワイルドカードを使うことができる。<Files ".ht*">
ここにディレクティブを記述
</Files>
正規表現による指定
- <Directory>
- <File>
- <Location>
- <Alias>
の代わりに以下のセクションディレクティブを使うことで、正規表現を使った指定が可能となる。
- <DirectoryMatch>
- <FileMatch>
- <LocationMatch>
- <AliasMatch>
記述例
<FilesMatch "\.(gif|jpg|png)$">
ここにディレクティブを記述
</FilesMatch>
<FilesMatch "^\.ht">
ここにディレクティブを記述
</Files>
モジュールがロードされていた場合の指定
動的モジュールのロードはLoadModuleディレクティブで行われる。LoadModule 識別子 パス
例) LoadModule dav_module modules/mod_dav.so
IfModuleセクションディレクティブで、モジュールがロードされていた場合に実行するディレクティブを指定することができる。
モジュール名はコンパイル前のファイル名で指定するため、拡張子は.soではなく.cである。
記述例
<IfModule mod_user_dir.c>
ここにディレクティブを記述
</IfModule>
Optionsディレクティブ
CGI、シンボリックリンク、SSI、ディレクトリインデックス、の有効無効を設定する。
Optionsディレクティブを記述しないとALLが指定されているとみなされる。
通常はOptions FollowSymLinks
だけで問題ないと思う。
- All
全て有効 - None
全て無効 - ExcecCGI
mod_cgiモジュールによるCGI実行を許可。 - FollowSymLinks
シンボリックリンクをたどることを許可。 - Includes
mod_includeモジュールによるSSIを許可。 - Indexes
ディレクトリインデックスの表示を許可(mod_autoindexモジュールが必要)
※複数指定はスペース区切り
デフォルトのhttpd.confではIndexes FollowSymLinksが指定されているのでOptions FollowSymLinksに変更するべき。
<Directory"/var/www/html">
〜省略〜
Options Indexes FollowSymLinks
〜省略〜
</Directory>
サブディレクトリで親ディレクトリのOptionsを上書きする
全てのオプションを記述する、または「+」「-」を使って追加・削除したいオプションを記述する。
例) Options +Indexes -FollowSymLinks
「+」「-」付きの指定と、そうでない指定を混在させることはできないので注意。Options Indexes -FollowSymLinks
はエラー
AllowOverrideディレクティブ
.htaccessを許可する。
デフォルトのhttpd.confでは許可されていない。<Directory"/var/www/html">
〜省略〜
AllowOverride None
〜省略〜
</Directory>
- All
全て許可 - None
全て無効 - AuthConfig
ユーザー認証に関するディレクティブを許可。 - Limit
アクセス制御に関するディレクティブを許可。 - Options
Optionsディレクティブを許可。