ときどきHTMLソースが表示される

時折リクエストしたURIに対して、HTMLのソースが表示される現象が発生。再現性はなく、本当にたまに現象が発生します。現象が発生してもリロードすればちゃんとしたウェブページが表示される。発生した現象をよくみると、全然関係ないURIのソースと、リクエストされたURIのソースが連結されたものです。
現象が起きたときのヘッダは以下のようなもの。

Date: Fri, 09 Jul 2010 06:40:11 GMT
Keep-Alive: timeout=8
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain

表示されているHTMLソースはリクエストされたURIのものではありません。HTMLソースをよくみると、途中からリクエストしたURIに対するレスポンスに該当するソースがヘッダつきで表示されています。

(リクエストされたURIじゃないHTML)

<script type="text/javascript" src="/js/hoge.js"></script>
</body></html> ←HTMLの終わり

HTTP/1.1 200 OK
Server: Zope/(Zope 2.10.6-final, python 2.4.5, sunos5) ZServer/1.1 Plone/3.1.7
Date: Wed, 07 Jul 2010 01:44:01 GMT
Content-Length: 24884
Content-Type: text/html; charset=utf-8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
(リクエストされたURIのHTML)

URIに対応するページソース、リクエストされたURIレスポンスヘッダ、HTMLと続きます。
Content-Typeがtext/plainなのでソースそのまま表示されています。時々text/htmlで帰ってくることもあって、そのときはページが上下に二つ連結されたような画面になります。


Apacheのキャッシュを使っていたときには、そこが怪しいのかなと推測してSquidのキャッシュに変更してみたんですが、それでも現象が発生します。
構成変更の前後で共通しているところを探すと、Apacheのmod_proxyをつかって複数のZopeバックエンドにリクエストを分配しているところがどうも怪しいとおもい至りました。

おそらくなんですが、

  • ApacheからZopeへリクエストする。
  • ZopeからTransfer-Encoding:chunkedでレスポンス。
  • Apacheはchunkedされたレスポンスに続くレスポンスを待つ。
  • 待っていると、全然関係ないレスポンスが帰ってくる。
  • Apacheはわけが分からなくなって、二つのソースをくっつけてブラウザへレスポンスを返す。

ってことなんだろうか??ZopeのHTTPサーバがHTTP1.1のchunkedにちゃんと対応していないのかもしれません。
しかし、そんなことあるんだろうか。

悩んでいてもしかたがないので、ApacheからZopeへリクエストをproxyするときに、HTTP1.0で投げることにしました。

        SetEnv  force-proxy-request-1.0 1
        SetEnv  proxy-nokeepalive       1

これで半日ほど運用していますが、現象はでていません。あたりだといいんですが。