ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

mod_cacheとVaryヘッダ

mod_cahceで画像をキャッシュしてる場合は画像に"Vary: User-Agent"つけないようにしましょうという話

はい

外部ストレージで画像を管理してて、表示時に毎回その外部ストレージに取りにいかなくて済むようにフロント側でキャッシュしとくというのはよくある話(?)だと思います。

例えばapacheの設定で

RewriteEngine on
RewriteRule ^/images/(.+)$  http://external.storage.dameninngenn.com/images/$1 [P,L]

<IfModule mod_cache.c>
    CacheRoot /dev/shm/mod_cache
    CacheEnable disk /images
    # ...
</IfModule>

みたいにしておくと /images/hoge.jpg にリクエストきた場合キャッシュされてなければ外部ストレージにとりにいって表示して、キャッシュされていればそれを返すという風になります。

このままだと特に問題はないのですが、ここに"Vary: User-Agent"が入っているとUser-Agent毎にキャッシュが保存されてしまいキャッシュサイズが膨れ上がります。
今回のケースだとdiskキャッシュだけど/dev/shmを使ってるのでモリモリメモリ使ってあげくswapしまくって人間が死ぬ。

画像にはVaryヘッダつかないようにしとくでしょーって思うかもしれませんが、結構コピペとかでうっかりがあったりするもんです。

例えばdeflateの設定部分で全部にVaryつけても問題ない場合だと

Header append Vary User-Agent

としてたり。

SetEnvIfNoCase Request_URI \
    \.(?:gif|jpe?g|png)$ no-gzip dont-vary

Header append Vary User-Agent env=!dont-vary

こうするとか。
http://httpd.apache.org/docs/2.2/mod/mod_deflate.html

余談

なんかのプロセスがswap領域使ってる場合とかだと割りと簡単にどのプロセスが使ってるかっていうのはわかるけど、プロセス以外の何かがswap使ってる時にどいつがswap使ってるのかをどう調べたらいいか全然わかんなかった。

swap使ってるのはコイツですよーってすぐ分かる方法があれば知りたい。。

プロセス以外だとだいたい目処がついたりするもんなんかな?あそこかあそこかなーぐらいの。
いかんせんそこらへんの知識が貧弱なので色々身に付けたいけど、実際に問題が起きて自分でトラブルシュートして始めて身についたりするもんだとも思ってるので難しい。