Apache2
この記事は、最終更新日よりおよそ 9 年 6 ヶ月経過しています。 公式サイトなどで最新情報を確認してください。(最終更新:2015年1月) |
Apache2 は更新の度に細かい仕様変更で conf の書き換えを余儀なくされ、その度に混乱する経験を踏まえ、出合った不具合とその対策を書き留めておくことにした。
(とりあえず覚えている範囲で。他にも気づいたら随時追記したい。)
Apacheを更新したら Syntax error が出て動作しなくなった
以前のバージョンで動いていた httpd.conf が、Apache をアップデートしたら Syntax error になることがよくある。 この場合、従来標準で入っていたモジュールが、更新の際にオプション化されて標準では入らなくなったときに多いようなので、インストールの前後に下記の要領でモジュールを記録しておき、比較して足りないモジュールがあれば追加する。
# /usr/local/apache2/bin/apachectl -V Server version: Apache/2.4.10 (Unix) Server built: Jan 3 2015 16:04:36 Server's Module Magic Number: 20120211:36 Server loaded: APR 1.5.1, APR-UTIL 1.5.4 Compiled using: APR 1.5.1, APR-UTIL 1.5.4 Architecture: 32-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses disabled) -D APR_USE_FLOCK_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/usr/local/apache2" -D SUEXEC_BIN="/usr/local/apache2/bin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf" # /usr/local/apache2/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_event_module (static) authn_file_module (shared) authn_core_module (shared) authz_host_module (shared) authz_groupfile_module (shared) authz_user_module (shared) authz_core_module (shared) access_compat_module (shared) auth_basic_module (shared) reqtimeout_module (shared) filter_module (shared) mime_module (shared) log_config_module (shared) env_module (shared) headers_module (shared) setenvif_module (shared) version_module (shared) unixd_module (shared) status_module (shared) autoindex_module (shared) dir_module (shared) alias_module (shared)
また、httpd.conf に LoadModule の指定が足りない場合にも Syntax error になるので、あわせて確認する。
FreeBSDのAcceptFilter
AcceptFilter に対応しているOS(FreeBSD)にインストールすると、標準で AcceptFilter が有効に設定されるが、FreeBSD の該当機能 (accf_http) はオプションなので、これを有効にせず Apache を起動すると警告が出る。
# /usr/local/apache2/bin/apachectl start [日時] [core:warn] [pid *:tid *] (2)No such file or directory: AH00075: Failed to enable the 'httpready' Accept Filter [日時] [core:warn] [pid *:tid *] (2)No such file or directory: AH00075: Failed to enable the 'httpready' Accept Filter
FreeBSD の accept_filter を有効にする場合は、下記のように操作。
# cat >> /boot/loader.conf accf_http_load="YES" ^D # kldload accf_http.ko
または、AcceptFilter を無効にする場合は httpd.conf に下記指定。
AcceptFilter http none AcceptFilter https none
Apache 2.4.xに更新したら従来のホームページがForbiddenになってしまう
ディレクトリのアクセス許可の書き方が変わったため。 Apache 2.3 までは
<Directory "/path/to/www"> Order allow,deny Allow from all </Directory>
Apache 2.4 では
<Directory "/path/to/www"> Require all granted </Directory>
この他、httpd.conf 中の NameVirtualHost ディレクティブが 2.4.x では削除されている(2.4 では警告が出るに留まっているが、今後エラーになると予告されている)ので、2.4 に更新したら NameVirtualHost の行を削除ておくと良い。
SSIの#if文が動作しない
Apache 2.3.13 以降および 2.4 では SSI の #if 構文が変更されたようで、Apache を更新すると従来のホームページの該当箇所がエラー表示になってしまう。
httpd.conf を書き換え、SSILegacyExprParser on とすることで、従来の構文を有効にすることができる(これもいつまで使えるのか分からないが)。
※ちなみに日本語マニュアルや英語マニュアルにはエラーが出る構文が掲載されている状態で、どのように変わったのか判らないが、As of version 2.3.13, mod_include has switched to the new ap_expr syntax for conditional expressions in #if flow control elements. を見ると正規表現が標準になったんだろうか?