2006年7月4日火曜日

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

某所の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文字書き換えるだけなんですけどね(笑)。





0 件のコメント:

コメントを投稿