有一個類似的問題但那裡的解決方案對我來說不起作用。
我們有 nginx 和 uWSGI 廣告後端。我們需要nginx根據回應頭中的內容來快取後端回應。
例如,我運行curl -I https://example.com/api/project_data/
.使用tcpdump
我看到後端回應:
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept, Accept-Language, Origin
Allow: GET, HEAD, OPTIONS
Cache-Control: public, max-age=3600
X-Request-ID: 6aa...0d99
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Set-Cookie: longterm_session=45c6...67; Domain=example.com;
然而,回應不會被緩存,每次收到請求時 nginx 都會向後端發出請求。
nginx 設定:
http {
uwsgi_cache_path /var/local/nginx_cache levels=2:2 use_temp_path=off inactive=1h keys_zone=mycache:20m ;
....
server {
....
uwsgi_cache mycache;
uwsgi_cache_key "$request_method$request_uri";
location /api/project_data/ {
add_header X-Cache $upstream_cache_status;
add_header Pragma "public";
uwsgi_pass 127.0.0.1:49002;
include uwsgi_params;
uwsgi_cache mycache;
uwsgi_cache_key "$request_method$request_uri";
}
我複製uwsgi_cache
只是為了安全起見,因為據我所知,某些指令不會繼承到location
.此外,還有x-cache: MISS
nginx 發送給客戶端的回應。
我究竟做錯了什麼?
答案1
Nginx 文檔明確說明那
如果標頭包含「Set-Cookie」字段,則不會快取此類回應。
您必須讓您的應用程式不發送 cookie 才能快取相應的回應,原因很明顯 - cookie 對於客戶端和伺服器來說都是額外的數據,與回應正文相同。