前回の続きです。プロキシサーバ経由で検索ができなくなったり、各種クエリーが失敗するという奇怪なトラブルを調べていくと、mod_encoding の問題に行き当たりました。

IE8: ローカル エリア ネットワーク (LAN) の設定 (proxy の設定)IE7: Gigazine: 部分的に「Web ページが見つかりません」

Proxy サーバの環境

  • CentOS 5.2
  • httpd-2.2.3-22.el5.centos (apache)

apache による forward proxy 2台の 1台だけが問題

この LAN 環境には外向けアクセス用の forward proxy が、apache によるものだけで 2台あります。この両方ともが NG というわけではなく、うち 1台 (仮に proxy-a とします) でだけ問題が発生し、2台目 (proxy-b) はなんの問題もありません。両方とも同じ OS、同じ apache のバージョンだったため、謎が深まります。

とりあえず、バックアップから proxy-a のちょっと前の仮想マシン (proxy-a-2) を出してきて起動してみるも、やはり NG でした。proxy-a(-2) と proxy-b の違いはじゃあ何ってわけで、proxy-a サーバがらみで行った /etc/httpd/conf, /etc/httpd/conf.d がらみの設定をいろいろ外して過去にもどしていくと…

WebDAV で日本語ファイル名対策用の mod_encoding に問題が

見つかりました。mod_encoding がらみの設定が問題のようです。


EncodingEngine On
SetServerEncoding UTF-8
...

といった一連の mod_encoding 用設定を外すと、症状はおさまります。途中に “?” を含む動的 URL (Query string) のときだけ問い合わせに失敗する、という事象と一致します。

そもそも、なんで mod_encoding なんか使っているのかというと、forward proxy と同一 apache 上で、ATOK Sync をテストしてみるため WebDAV を導入しています。一般に、WebDAV の使用時に mod_encoding を使用しないと、日本語ファイル名が文字化けするというたたり問題があるからです。

純粋に WebDAV 用なので、mod_encoding を WebDAV フォルダへのアクセス時だけ使用するよう限定すればいいのでは? ということで、該当部分を <Location> ~ </Location> でくくってみますが、過去にも Location 対象の限定を考えた先達がいるらしくそれは不可で、最新の mod_encoding.c に適用するパッチが公開されています。

真面目にパッチを当てるか、それとも mod_encoding 自体の設定をしないか

WebDAV のフォルダ一覧

WebDAV のフォルダ一覧

このパッチ、以前に一度適用ずみの mod_encoding.c (.so) をインストールしてあるのですが、どうやら apache が定期的に yum でアップグレードした際に、上書きされてパッチがはがれた、というのが真相のようです。

だからといって /etc/yum.conf に exclude= を使って apache をアップデートの対象から外すのは、緊急時のセキュリティフィックスの可能性を考えるとしたくはないところ。

ATOK Sync で作成されるのは、ATOK2009 の場合 udic22, ATOK2008 の場合 udic21 というファイル名で、中身はともかくフォルダ名やファイル名は日本語でなくても良いので、諸々の事情でこの forward proxy を使わなかった間、問題が顕在しなかったと。

よりアバウトな解決方法としては、mod_encoding に関する上記の Encoding Engine On … で始まる一連の宣言を消してしまうことです。ちなみにパッチを適用した mod_encoding.c を再インストールする前に試してみましたが、この方法でも、もともとの Query string が文字化けする問題の解決にはなります。

現在は、問題なく Google ほかのサイトにもアクセスできていて、WebDAV サーバ上に日本語ファイル名を作成することも問題なくできています。

IE7: Google: 正常に検索できた

サーバを分けると、ポータビリティは上がるがコストも上がる

企業に同様なサーバ環境を構築する場合はここまで 1台数役みたいな作り方はせず、理想論として、外向けに公開する WebDAV サーバと、社内から外部に使う forward proxy サーバは分けようよ、そしたら相性問題は解消じゃないか、という話になるかもしれません。しかし、仮想サーバにせよ物理サーバにせよ、サーバ OS の数を増やすと電気代と発熱と運用コストの問題に帰結するので、1つのサーバで何と何を兼用させるか、バランス取りが難しいところです。