ttt

getttyent

(FreeBSD) apache-2.2.2へ移行してみました

2006-07-03 22:18:36 | デジタル・インターネット

某所のWebサーバでapacheをアップデートしたときの感想みたいな話。

これまで、/usr/ports/www/apache20からインストールしたapache-2.0.58を使っていたのですが、とある理由があって、apache-2.2.2へアップグレードしてみました。

apacheのWebサイト

http://httpd.apache.org/

を見ると、2.2.2は、the best available version of Apache HTTP Serverなどと、誇らしげにうたいあげているので、まあ、それを信じてみますか・・・というわけで。

しかし、やっぱりバージョン番号の大きいほうの桁が変わるのと、これまで使えてたものが使えなくなったりとか、やっぱりトラブルの恐れもあるわけでして、いきなりアップグレードをするのは怖いです。というわけで、まずは、先週、予備サーバのほうを2.2.2にしてみて、一通り動くことを確認して、今日、本番サーバを2.2.2へ移行させました。

FreeBSDのportsを使っていれば、ソフトウェアのアップデート作業自体は、いつもと同じかんじで、なんの問題もなく、簡単にすんでしましました。

● コンパイル

apache-2.2.2は、portsの、www/apache22にあります。

portupgradeで、ports/www/apache20から、ports/www/apache22にするのもできますが、WITH_LDAPとか、コンパイル時に指定したいオプションがあったので、手でmake ほにゃららと実行しました。もちろん、/usr/local/etc/pkgtools.confに書くという方法もありますが、まあ、最初は、様子見ということで、なるべく手作業で、ということ。

たとえば、こんな感じです。

# make WITH_LDAP=yes WITH_LDAP_MODULES=yes WITH_DAV=yes WITH_SSL=yes WITH_SUEXEC=yes SUEXEC_USERDIR=Web WITH_BERKELEYDB=db41

● インストール

portsでインストールする場合、apache-2.0.58と、apache-2.2.2の両方をインストールできないようになっているので、とりあえず、apache-2.0.58をpkg_deleteでアンインストールしました。ただし、そのままやると、当然、

# pkg_delete /var/db/pkg/apache-2.0.58_1
pkg_delete: package 'apache-2.0.58_1' is required by these other packages
and may not be deinstalled:
kde-3.5.3
kdesdk-3.5.3
kdevelop-3.3.3_1
php4-4.4.2_2
subversion-1.3.2

とかなります。apacheに依存しているソフトがあるのは承知の上ですから、一応、何が依存しているのか、確認したうえで、強引ですが

# pkg_delete -f /var/db/pkg/apache-2.0.58_1

しちゃいます。そして、make installを実行。

# make WITH_LDAP=yes WITH_LDAP_MODULES=yes WITH_DAV=yes WITH_SSL=yes WITH_SUEXEC=yes SUEXEC_USERDIR=Web WITH_BERKELEYDB=db41 install

● 依存するソフトの再コンパイル&インストール

kdeはインストールしてあるものの使っていないので、とりあえずkdeは無視するとして、そのほかのapacheに依存しているソフト、今回の場合は、phpとsubversionを、コンパイルしなおして、インストールしなおします。

これは、portupgradeのほうが楽ですね。

# portupgrade -f php4-4.4.2_2 subversion-1.3.2

なお、本番サーバのほうには、mod_ruby (ports/www/modby)とかmod_perl2 (ports/www/mod_perl2)とかも入ってたのですが(たぶん、使ってない・・・)、mod_perl2は、いったん、pkg_deleteしてからでないとインストールできませんでした。

● httpd.confの設定

httpd.confは、/usr/local/etc/apache22/以下にインストールされるようになっていました。

これまでhttpd.confに書かれていたいろんな記述が、extraディレクトリ内の別ファイルに分離されていて、DocumentRootが"/usr/local/www/apache22/data"になっていたりと、けっこう変更されていました。

とりあえず、ここは、根性で、今までのhttpd.confと同じようになるように、ひたすら書き換えました。

● /etc/rc.confの設定

apache22_enable="YES"

と書くようになったようです。apache2ssl_enable="YES"に相当するものは、不要らしくて、httpsで受けられるように、適切にhttpd.confほかのファイルを設定しておくだけでよいようです。

● 動作テスト

PukiWiki、XOOPS、ともに動いていますし、自作のPHP+PostgreSQLのスクリプトとか、perlのCGIスクリプトなど、ぜんぜん問題なく使えてます。そうあって欲しいことですが、とくにトラブルもなく、案外あっさり動いてしまったので、ラッキー!ってかんじです。

● apache-2.2.2にした理由

最初に書いた「とある理由」なんですが、ユーザー名とパスワードで認証してアクセス制限をするところで、これまでLDAP認証を使っていたのですが、今度、

最初、LDAP認証を行い、失敗したら、apacheのパスワードファイルの方でもう一度認証するようにしたい

という要望がでてきたのです。LDAPには、もともと、組織に属する人全員が登録されているのですが、今回、組織に属していない人にも、アクセス許可を出す必要が出てきて、しかし、その人をLDAPのデータベースに登録するわけにもいかないので、その外部の人だけは、apache用のパスワードファイルで救済しよう、という作戦です。

これまでのapache 2.0系では、認証方法(Authentication)は、どれか1つだけしか使えなかったのですが、apache 2.1以降からは、複数の認証方法が使えるようになった、という記述をマニュアルで見つけたのです。

具体的には、AuthBasicProviderというキーワードで行うのですが、apacheのマニュアルに載っている情報が、ちょっと少なすぎで、けっこうてこずりました。

とくに、LDAP関係の設定方法が、2.0系とは微妙に変わっているのに、今現在公開されているapache 2.2のマニュアルの例題にのっているのは、2.0のときのままなんですよね。ドキュメントの整備が、まだ2.2系ではできていない、ってかんじですか?!

結局、こんな感じで、目的のことができるようになりました。

<Location /ldap-test>
AuthName "LDAP test"
AuthType Basic
AuthBasicProvider ldap file
AuthLDAPUrl "ldap://なんとかかんとか"
AuthzLDAPAuthoritative off
#require ldap-filter LDAPの検索条件
        require ldap-user tarou hanako

AuthUserFile /usr/local/etc/apache22/passwd-test
Require user yukichan kurachan
</Location>

■ 2006年8月1日追記

apache 2.2.2に付属のmod_rewriteというモジュールには、セキュリティホールがあって、apache 2.2.3がリリースされています。FreeBSDのportsは、確認した時点では、まだapache 2.2.2のままだったのですが、portsには、セキュリティホールをふさぐパッチがすばやく追加されていて、portsのバージョンは、2.2.2_1になっています。そのパッチというのが、ソースコード中のたった1文字書き換えるだけなんですけどね(笑)。