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使ってるのはコイツですよーってすぐ分かる方法があれば知りたい。。
プロセス以外だとだいたい目処がついたりするもんなんかな?あそこかあそこかなーぐらいの。
いかんせんそこらへんの知識が貧弱なので色々身に付けたいけど、実際に問題が起きて自分でトラブルシュートして始めて身についたりするもんだとも思ってるので難しい。