ZopeにあるPDFファイルをApacheでプロバイドする。

この一ヶ月ほど、朝の時間帯にウェブの一部コンテンツが表示できない障害が頻発している。30日の朝にも発生、バックエンドで起きている現象を把握。
どうもでかいPDFファイルに多数のHTTPリクエストがきて、Zopeがそれに答えきれない模様。ということで以下の対処を実施。
・夜間にPDFファイルをバッチで静的ファイルへ落とす。
Apachemod_rewriteをつかって、PDFファイルへのリクエストはApacheでインタセプト。
・ごく最近アップされたような新しいPDFファイルはZopeへリクエストをProxyする。

リライトルールはこんな感じ。

        RewriteCond     %{REQUEST_URI}          "\.(pdf|PDF)$"
        RewriteCond     %{HTTP_USER_AGENT}      "!hogefuga"
        RewriteCond      /usr/local/apache2/htdocs/contents/%{REQUEST_URI} -f
        RewriteRule     ^(.*)$    http://static.example.com$1 [P]

一行目、REQUEST_URIを定義。拡張子がpdfまたはPDFのリクエストがきた場合にURIを書き換える。
二行目、PDFファイルを静的ファイルとして取得する際、wgetを使うが --user-agentオプションで適当なエージェント名を名乗り、その名前の場合だと書き換え処理をしない。そうしないと、すでにある静的ファイルを取得してしまう。
三行目、wgetで取得したファイルはここ(/usr/local/apache2/htdocs/contents/以下)に保存されている。ここにファイルがある場合に書き換え処理を実施する。ファイルがないのに書き換えると404になってしまう。

四行目が書き換えルール。static.example.comは/usr/local/apache2/htdocs/contents/をDocumentRootとする仮想ホスト。

あとはwgetで静的ファイルを取得するタイミング、頻度を運用しながら調整する。これで症状がおさまればいいのだが。