POST 响应缓存在 nginx 中不起作用
POST response caching does not work in nginx
我的任务是使用 nginx 实现微缓存策略,即缓存一些 POST 端点的响应几秒钟。
在 nginx.conf
的 http
部分,我有以下内容:
proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;
然后我在server
中有location
:
location /my-url/ {
root dir;
client_max_body_size 50k;
proxy_cache cache;
proxy_cache_valid 10s;
proxy_cache_methods POST;
proxy_cache_key "$request_uri|$request_body";
proxy_ignore_headers Vary;
add_header X-Cached $upstream_cache_status;
proxy_pass http://my-upstream;
}
位于 my-upstream
的应用程序输出 Cache-Control: max-age=10
,如果我理解正确,应该使响应可缓存。
但是当我在短时间内(少于 10 秒)使用 curl 发出重复请求时
curl -v --data "a=b&c=d" https://my-host/my-url/1573
所有这些都到达后端(根据后端日志)。此外,X-Cached
始终是 MISS
.
请求和响应如下:
> POST /my-url/1573 HTTP/1.1
> Host: my-host
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 113
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 113 out of 113 bytes
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 08 May 2018 07:16:10 GMT
< Content-Type: text/html;charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=60
< Vary: Accept-Encoding
< X-XSS-Protection: 1
< X-Content-Type-Options: nosniff
< Strict-Transport-Security: max-age=31536000
< Cache-Control: max-age=10
< Content-Language: en-US
< X-Cached: MISS
所以缓存不起作用。
- 我做错了什么?
- nginx 中是否有任何日志记录工具可以查看它为什么选择不缓存响应?
原来是以下指令(全局定义的)阻止了缓存工作:
proxy_buffering off;
当我在 location
配置下用 proxy_buffering on;
覆盖它时,缓存开始工作。
因此,要使缓存与 POST 请求一起工作,我们必须执行以下操作:
- 在服务器上输出
Cache-Control: public, max-age=10
header
- 在nginx中添加
proxy_cache_path
配置和location
配置(问题文中给出了示例)
- 确保
proxy_buffering
是我们要启用缓存的位置的 on
。
详细说明上面@Roman Puchkovskiy 的回答 - 我的原始服务器 returning 以下 headers:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
我将我的服务器配置为 return 这个:
Cache-Control: max-age=3600, public
现在 Nginx 的行为符合预期 ✅
我首先尝试将此指令添加到我的 nginx.conf
:
...
location /blah {
...
proxy_ignore_headers Cache-Control;
}
但看起来那个指令并没有像我想象的那样工作。
请注意,我不需要将 proxy_buffering on
添加到我的 nginx.conf
,所以我似乎没有受到该问题的影响。
我的任务是使用 nginx 实现微缓存策略,即缓存一些 POST 端点的响应几秒钟。
在 nginx.conf
的 http
部分,我有以下内容:
proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;
然后我在server
中有location
:
location /my-url/ {
root dir;
client_max_body_size 50k;
proxy_cache cache;
proxy_cache_valid 10s;
proxy_cache_methods POST;
proxy_cache_key "$request_uri|$request_body";
proxy_ignore_headers Vary;
add_header X-Cached $upstream_cache_status;
proxy_pass http://my-upstream;
}
位于 my-upstream
的应用程序输出 Cache-Control: max-age=10
,如果我理解正确,应该使响应可缓存。
但是当我在短时间内(少于 10 秒)使用 curl 发出重复请求时
curl -v --data "a=b&c=d" https://my-host/my-url/1573
所有这些都到达后端(根据后端日志)。此外,X-Cached
始终是 MISS
.
请求和响应如下:
> POST /my-url/1573 HTTP/1.1
> Host: my-host
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 113
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 113 out of 113 bytes
< HTTP/1.1 200 OK
< Server: nginx
< Date: Tue, 08 May 2018 07:16:10 GMT
< Content-Type: text/html;charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=60
< Vary: Accept-Encoding
< X-XSS-Protection: 1
< X-Content-Type-Options: nosniff
< Strict-Transport-Security: max-age=31536000
< Cache-Control: max-age=10
< Content-Language: en-US
< X-Cached: MISS
所以缓存不起作用。
- 我做错了什么?
- nginx 中是否有任何日志记录工具可以查看它为什么选择不缓存响应?
原来是以下指令(全局定义的)阻止了缓存工作:
proxy_buffering off;
当我在 location
配置下用 proxy_buffering on;
覆盖它时,缓存开始工作。
因此,要使缓存与 POST 请求一起工作,我们必须执行以下操作:
- 在服务器上输出
Cache-Control: public, max-age=10
header - 在nginx中添加
proxy_cache_path
配置和location
配置(问题文中给出了示例) - 确保
proxy_buffering
是我们要启用缓存的位置的on
。
详细说明上面@Roman Puchkovskiy 的回答 - 我的原始服务器 returning 以下 headers:
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
我将我的服务器配置为 return 这个:
Cache-Control: max-age=3600, public
现在 Nginx 的行为符合预期 ✅
我首先尝试将此指令添加到我的 nginx.conf
:
...
location /blah {
...
proxy_ignore_headers Cache-Control;
}
但看起来那个指令并没有像我想象的那样工作。
请注意,我不需要将 proxy_buffering on
添加到我的 nginx.conf
,所以我似乎没有受到该问题的影响。