网站首页 文章专栏 nginx反向代理数据缓存
1、场景描述:
用nginx代理前端,转发到后端。前端请求某个接口时,返回数据量小,不报错;数据量大,报错:net::ERR_INCOMPLETE_CHUNKED_ENCODING 200
2、问题分析:
监测后端返回,发现有response,结果正确;然后再查找nginx日志(error.log),发现写缓存文件权限不足。
当nginx代理后端的数据量小时,直接返回给前端;当数据量大时,需要写入到缓存目录,然后转发给前端。(这就是问题所在)
3、解决方案
找到nginx代理缓存目录,将用户、组、权限配好:
chown -R nobody:nobody ./proxy_temp
可以看见,当我们配置好后,就能写入了,请求也就恢复正常了。
4、配置示例
proxy_cache_path /opt/www/cache levels=1:2 keys_zone=test_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.test.com;
#rewrite ^/(.*)$ https://${server_name}$1 permanent; #跳转到Https
if ($request_uri ~ ^/(test.html|login|register|password|\/reset)) {
set $cookie_nocache 1;
}
location / {
proxy_cache test_cache; #要和proxy_cache_path 的 keys_zone值相等
proxy_pass http://127.0.0.1:8081;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;
}
}
说明:
proxy_cache_path 缓存文件路径
levels 设置缓存文件目录层次;levels=1:2 表示两级目录
keys_zone 设置缓存名字、开辟空间的大小,10m表示10 MB的大小
max_size 此目录最大空间大小,10g表示10 GB的大小。假如超过了10G,nginx会根据自己的淘汰删除规则删除一部分缓存数据,默认覆盖掉缓存时间最长的缓存数据。
inactive 在指定时间内没人访问则被删除,60m表示60分钟
use_temp_path 用来存放临时文件,建议设置为off