2月 222011
 

さてさて。前々回のエントリで 「DAViCal サーバを FreeBSD で。」って言うのを書いたのですが、色々やっていたら、FreeBSD では動作しない。と言うことが判明しました。

どういう状況の時に動作しないのか。と言えば、ports から www/apache22 をインストールして、 httpd-2.2.17 をインストールしたときです。この時、WebDAV を利用するので WITH_DAV=true と WITH_DAV_FS=true を指定するわけです。

後は、httpd-vhosts.conf や httpd-dav.conf に設定を施してさてどうだっ!! ってやるんですが、これがまた動作しない。アカウント作成などは無事にできるので php5 と postgresql の連携はうまく行っているみたい。クライアントからのアクセスが全くダメな状態なのでありました・・。orz。

今回はまったのは全部で二つ。順番に見ていくことにしましょう。あ。ここまでの到達では、postgresql-server-8.4.7 が無事に動作し、 php5 が無事に動作し、 davical でアカウントが作成されていることが必須です。

つまりは Lightning で接続したけど、全くつながらない。って状態の時のトラブルシューティングです。

最初のはまり道。405 が返る。
telnet localhost 80 とかして HTTP で davical の caldav.php を手で指定して実行するんだけど、エラー 405 のエラーが返ってくる状態。httpd が出力するアクセスログには以下のように残っている場合ではね。

"PROPFIND /caldav.php/takachan/home/ HTTP/1.1" 405 400
"PUT /caldav.php/takachan/home/c848-7bf5-4627-8b9d-d35b.ics HTTP/1.1" 405 43

 
この場合、davical をインストールしたディレクトリの DAV On が有効になっていません。その場合は httpd-dav.conf など WebDAV の設定を見直してみましょう。

ちなみに telnet コマンドでも WebDAV がオンになっているか確認できます。

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
OPTIONS /index.html HTTP/1.1
Host: localhost
HTTP/1.1 200 OK Date: Tue, 22 Feb 2011 12:44:39 GMT Server: Apache/1.3.42 (Unix) PHP/5.3.5 with Suhosin-Patch DAV/1.0.3 Content-Length: 0 Allow: GET, HEAD, OPTIONS, TRACE
Connection closed by foreign host.

 
“Allow: GET, HEAD, OPTIONS, TRACE” で WebDAV が利用できるメソッドが表示されます。これが表示されない場合は DAV On が効いていません。 httpd.conf の設定を見直しましょう。

ちなみに上記の環境では FreeBSD の ports から www/apache13 、 www/mod_dav 、 lang/php5 をインストールしています。

この環境において DAViCal がサクっと動作した状態です。ここまで来るのが大変だった。

更に続くはまり道。400 が返る。
HTTP のエラーコード 400 は Bad Request。全くもってどうしようも無い状態。最初は www/apache22 でやっていたんだけど、エラーログに以下のように出力される。

Could not fetch resource information.  [400, #0]
(2)No such file or directory: The URL contains extraneous path components.
The resource could not be identified.  [400, #0]

 
二行目は長いので折り返しています。DAViCal の設定で $c->dbg[‘ALL’] = true; ってのがあるのですが、こいつを有効にすると debug メッセージを apache のログに出力してくれるのですが、上記のメッセージが出力する場合、デバッグログさえ出力してくれない。なので明らかに mod_dav のほうで出力しているメッセージ・・。

後、telnet localhost 80 で確認したところ、

PROPFIND /caldav.php HTTP/1.1

 
こっちは動作する(つまり 200 が返る)んだけど、

PROPFIND /caldav.php/takachan/home/ HTTP/1.1

 
こっちは動作しない(つまり 400 が返る)。なんか、明らかに mod_dav の問題ぽいのであります。

ついつい www/apache22 のソースを見たら、 modules/dav/main/mod_dav.c の 729 行目辺りでこのメッセージが出ているのだけど、なんか、httpd.conf の設定ファイルの読み込みがおかしいんでないかい?って感じになったのでありました。

もう、apache22 に添付されている mod_dav のコードがおかしいと思えてきたのでここで、apache22 は捨てて apache13+mod_dav にしてみたのでありました。

そしたらあーたっ!! サクっと動作してしまったではあーりませんかっ!! あいや・・。もっと早くから apache13 でトライするんだったよ・・。

 
と、言うことで http アクセスのエラーコード 405->400 をなんとか乗り越えて無事に DAViCal は動作したのでありました。

原因はどこにあるんかなぁ。davical-0.9.9.4 かなぁ? とわ言いつつ、apache から DAViCal の php にまで渡ってないんだよねぇ・・。

するとただ単に httpd-dav.conf の設定が悪いだけか? けど、 DAV On にするだけだし、そもそも PROPFIND /caldav.php の時は無事に動作して PROPFIND /caldav.php/ だと 400 になるんだから、やっぱり apache22 付属の mod_dav を疑ったほうが良いのかなぁ・・。

ま。そんな感じの二つのはまり道だったのでありました。

今はなんとか無事に動作しているのであります;-)。 Thunderbird+Lightning と iPhone4 から動作確認は取れています;-)。