画像を返すルーティングを持つアプリケーションで URL が画像に対して一意に決まるなら Nginx 側でキャッシュを取ってアプリケーションの負荷を下げたいと考えると思います
そしてそのような画像を返すなら expires
を付けてユーザーのブラウザにもキャッシュさせたいところ
ブラウザは HTTP のレスポンスヘッダーに Last-Modified
や Expires
や Cache-Control
などを付けるとブラウザは次回のリクエストでは If-Modified-Since
を付けてくれます
そこで Nginx は Last-Modified
が If-Modified-Since
と同じかそれより昔ならステータスコード 304 番を返すのでブラウザは手元のキャッシュを表示することでコンテンツ自体をダウンロードする必要がなくなります
しかしよく考えれば当然ですが,Nginx が Last-Modified
の時間を把握していなければ Nginx がステータスコード 304 を返せばよいのか 200 を返せばよいのか判断できません
Nginx が画像ファイル自体を配布する際はファイルのタイムスタンプから判断ができますが,動的に画像を生成するアプリケーションの場合は Last-Modified
をアプリケーション側で付けてあげないと Nginx が判断できず常に 200 を返すようになってしまいます
また Nginx 自体がキャッシュを持っていますのでアプリケーションを変更した際は必ずキャッシュを消しましょう
と,この件で何時間も悩んだのでメモ書きでした