Gentooの~amd64にApache 2.4.1が来たので試してみた


 2月にリリースされた GA 宣言済みの Apache 2.4.1 だが、ちょこちょこベンチマークも上がってきている(ftp-adminの憂鬱: Apache httpd 2.4.1を試してみた)。Gentoo Linux でも ~amd64 に降りてきたので、我が家ではここまでパフォーマンスを気する必要も無いこともあり、まずは LAN 内で動いているもののみ試してみた。2.2 からのアップグレードだとはまりポイントが何箇所かあるので、まずは何よりも Upgrading to 2.4 from 2.2 – Apache HTTP Server を熟読したほうがよい。(追記: 和訳してみた。Apache HTTPサーバ – Upgrading to 2.4 from 2.2 超意訳版)

 Linux 上でとりあえず静的ファイルをホストしているだけの Apache なら、ハマるポイントは 2 箇所ある。

  • Invalid command ‘User’, perhaps misspelled or defined by a module not included in the server configuration
  • Invalid command ‘Order’, perhaps misspelled or defined by a module not included in the server configuration

基本的な設定

 両方とも Upgrading to 2.4 from 2.2 – Apache HTTP Server に書いてあるが、User ディレクティブは mod_unixd.so に切り離されたので、これを明示的に読み込む必要がある。

LoadModule unixd_module modules/mod_unixd.so

 次に、アクセス制御の Allow, Deny, Order といったディレクティブは非推奨になった。mod_authz_host 的な書き方に書き換えるべきなのだがろうが、とはいえアップグレードを優先するならこれらのディレクティブを修正せずに使いたいわけで、その場合は mod_access_compat.so を読みこめばいい。

LoadModule access_compat_module modules/mod_access_compat.so

 最後に、問題なく起動はするが、警告で「AH00117: Ignoring deprecated use of DefaultType」が表示されることがある。これもアップグレードガイドにある通り 2.4 で無効になっているので、コメントアウトしてしまってよい。

バーチャルホスト

 バーチャルホストの設定をしていると、configtest や起動時に「AH00548: NameVirtualHost has no effect and will be removed in the next release」と表示される。ついつい日本語版のドキュメントを読んでしまうと NameVirtualHost についてこってり書いてあるのでそのとおりに設定してしまうが、英語版を見ると普通に「Prior to 2.3.11, NameVirtualHost was required to instruct the server that a particular IP address and port combination was usable as a name-based virtual host. In 2.3.11 and later, any time an IP address and port combination is used in multiple virtual hosts, name-based virtual hosting is automatically enabled for that address. This directive currently has no effect.」とあるので、コメントアウトする。

認証周り

 認証周りだと BASIC 認証はお手軽なので何かと使われているかと思うが、そのままだと AH00025: configuration error: couldn’t check user が出る。これは認証用のコアモジュール mod_authn_core.so を LoadModule していない場合に出るので LoadModule する。

LoadModule authn_core_module modules/mod_authn_core.so

 上を追記したら「AH00027: Buggy authn provider failed to set user for /path」が出る場合は、認証周りの設定に抜けがある。よくあるプレインテキストベースのパスワードファイルで BASIC 認証をしている場合、AuthTypeAuthBasicProvider のどちらか、おそらくは両方が抜けている。なので、以下を追記する。

AuthType basic
AuthBasicProvider file

動的コンテンツ

 次に、次に動的コンテンツについて書いていく。今時は動的コンテンツがない場合のほうが少ないと思うが、こちらも共通して追加すべき項目がある。

CGI

 CGI の動作で「AH00025: configuration error: couldn’t check user: /cgi-bin/hoge.cgi」といったエラーが出ることがある。「今時 CGI が許されるのは小学生までだよねー」という話もあるが、我が家では C で書いた計測系の CGI がいくつか動いていて、別にパフォーマンスに問題があるわけでもないのでまずは CGI を動かしたい。
 この問題だが、mod_cgi の設定に問題があるわけではなく、mod_authz_core.so が読み込まれていない場合に発生する。なので、mod_authz_core.so を LoadModule すればよい。

LoadModule authz_core_module modules/mod_authz_core.so

PHP

 PHP は、php_fpm で動かしている分には独立しているので問題ないが、mod_php の場合はまず Apache 2.4 向けに再コンパイルして Apache ごと再起動する。これで「AH00025: configuration error: couldn’t check user: /path」が出る場合は CGI と同じように mod_authz_core.so が読み込まれていないので LoadModule して Apache を再起動する。

LoadModule authz_core_module modules/mod_authz_core.so

SSL

 SSL 周りで修正しないといけない箇所は、セッションキャッシュ周りと Mutex の設定。セッションキャッシュ周りがモジュールとして切り離されたので「SSLSessionCache: ‘shmcb’ session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?)」などといったエラーを吐く場合がある。この場合は、

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

などで LoadModule する。

 次に Mutex だが、SSLMutex ディレクティブが廃止されて Mutex ディレクティブになったので、それに合わせて書き換える必要がある。

Mutex default ssl-cache

おしまい

 以上、LAN 内のサーバを 2.4 にアップグレードした際に遭遇したエラーを列挙してみた。現状、Apache 2.4.1 + Passenger 3.0.11 の組み合わせでコンパイルエラーが発生し、パッチを当てないとコンパイルできないなどの問題もあって全てのサーバをアップグレードはしていない。