Nginx -> appみたいな構成でproxy_cacheを入れているとappまでリクエストが到達せずにNginxがリクエストを返すことができる。これはこれでとても便利なのでがブラウザのスーパリロード時はappまで貫通させたいみたいなケースがあったので調べたメモ。
結論
proxy_cache_bypassを使えば実現可能。
任意のヘッダーに$http_${ヘッダー名}と言う形で参照できるのでその値を使ってキャッシュを使うかを処理させます。今回の場合は"$http_cache_control"
upstream app { server flask:5000; } proxy_cache_path /var/cache/nginx keys_zone=zone1:1m max_size=1g inactive=24h; proxy_temp_path /var/cache/nginx_tmp; server { listen 80; location / { set $cc_ma 0; if ($http_cache_control = "no-cache") { set $cc_ma 1; } proxy_pass http://app; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_cache zone1; proxy_cache_valid 200 302 10s; proxy_cache_bypass $cc_ma; add_header X-Nginx-Cache $upstream_cache_status; } }
こうすることでcurlにCache-Control: no-cacheを渡すことでX-Nginx-CacheがBYPASSとなってappまでリクエストが到達していることを確認することができた。http, server, locationで書けてので結構使い所がありそうと感じた。
< HTTP/1.1 200 OK < Server: nginx/1.21.1 < Date: Sun, 22 Aug 2021 07:52:56 GMT < Content-Type: text/html; charset=utf-8 < Content-Length: 8 < Connection: keep-alive < X-Nginx-Cache: BYPASS