Apacheと比べて、軽い速いという定評のlighttpd(ライト・ティーピーディーとか、ライティーと呼ばれてます)。
自分の会社でも、PHPやらRoRやらCGI系を動かす関係上、FastCGIとの相性も良さげなlighttpdをメインWWWサーバーとして使っている。
で、やっぱり業務でSVNとかWebDAVとか使いたいのですが、WebDAVはともかく、SVNはApacheでいうところのmod_dav_svn相当の機能がなかったりするんだな。
そこで、lighttpdをプロキシにして、バックエンドにApacheを置いてSVNとかWebDAVをしようという試み。
CentOS 5.5にlighttpdを導入する方法はここをみてね。
■構成はだいたいこんな感じ
バックエンドとしてApacheを立てる。今回はlighttpdと同一サーバ上に立てるため、ポートを8080とかに変更。
mod_davとmod_dav_svnで、普通にSVNやWebDAVを動かしておく。
フロントは、lighttpdで、SSLサイトを作る。
で、Basic認証を行いつつ、プロキシ機能で、バックエンドのApacheに転送する。
SSLはlighttpdで終端。(フロント->バックエンドはhttp)
■まず、Apacheの設定
ポート番号変更ね。
[root@kvm1 ~]# vi /etc/httpd/conf/httpd.conf
・・・
Listen 8080
・・・
あとSVN&WebDAV設定だけど、CentOSのRPM版では、/etc/httpd/conf.d配下の*.confが全てhttpd.confにインクルードされるようになってるので、ここに個別に設定ファイルをつくります。
まずSVN。当然だけどサーバ上でまずSVNリポジトリを作っておく必要あり。ここでは/var/db/svnにリポジトリを置いて、それをhttp://(ホスト名)/svn/でアクセスさせる予定。
[root@kvm1 ~]# vi /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
DAV svn
SVNParentPath /var/db/svn
</Location>
次にWebDAV。mod_davはhttpd.conf側でロードされるだよ。
RequestHeaderうんたらの部分は何をしているかというと、WebDAVのCOPYとかMOVEはhttpリクエストヘッダにコピー/移動先となるURLを乗っけてくるため、プロキシが見逃して変換してくれない。よって、WebDAV側で外向けURL(FQDN。SSLつき)からWebDAVサーバ上で通用するURL(自分自身。SSLなし)に変換しないといけないんだな。
[root@kvm1 ~]# vi /etc/httpd/conf.d/dav.conf
RequestHeader edit Destination ^https://(ホスト名)/ http://localhost:8080/ early
<Location "/dav">
Options -Indexes
Dav on
</Location>
■lighttpdの設定
[root@kvm1 ~]# vi /etc/lighttpd/lighttpd.conf
・・・
(SSLサイトですよの設定)
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/ssl/server.pem"
server.document-root = "/var/www/lighttpd-ssl"
(認証。LDAP連携してます)
auth.backend = "ldap"
auth.backend.ldap.hostname = "localhost"
auth.backend.ldap.base-dn = "ou=People,dc=foo,dc=bar"
auth.backend.ldap.filter = "(uid=$)"
auth.require = (
"/svn" => (
"method" => "basic",
"realm" => "Subversion Auth Realm",
"require" => "valid-user"
),
"/dav" => (
"method" => "basic",
"realm" => "WebDAV Auth Realm",
"require" => "valid-user"
)
)
(プロキシ。自分の8080へ転送する感じで)
proxy.server = (
"/svn" => (
( "host" => "127.0.0.1", "port" => 8080 )
),
"/dav" => (
( "host" => "127.0.0.1", "port" => 8080 )
)
)
}
“host”値はIPアドレスな感じで。8080はダブルクォートで囲まない感じで。
あと公開パスとバックエンド側のパス(例えばここでは”/dav”とか)が相互に異なると、これまたDestinationヘッダ変換問題がややこしいことになるんで、合わせるがよい。頑張りたい人だけ頑張ってくれ。
■Expectヘッダ問題。
WebDAVクライアントによっては、たとえばPUT時なんかに「Expect: 100-continue」っていうヘッダをつけてリクエストしてくるんだけど、このヘッダの意味をlighttpdが理解できず、「417 Expectation failed」エラーが出たりします。
クライアント側でこのヘッダを送出しない設定などを行って回避してくれ。
なんかこのごろ、nginxとかに押され気味だよなあlighttpd。
■etc
Windows標準の「ネットワークプレース」はオレオレ証明書だとNGだったりする。(XPは大丈夫?だったかも。Vistaは駄目)
まあWindows標準のWebDAVクライアント機能はクズなんで、良い子のみんなはCarotDAVとかTeamfileとか使ってください。フリーウェア万歳。