Nginx Web 缓存服务
Nginx只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令手动清除缓存;虽然可以通过Nginx的模块ngx_cache_purge,来自动清除指定URL的缓存。但ngx_cache_purge是nginx的一个三方模块,主要是对nginx生产的缓存内容进行清理,是需要自行编译后,才能支持。linux apt或都是Win版本,都是默认没有编译进去的,另外,wordpress有配套Nginx Helper 插件,所以本文不涉及ngx_cache_purge内容。
- proxy_cache:缓存后端服务器的内容,可能是任何内容,包括静态的和动态,减少了nginx与后端通信的次数,节省了传输时间和后端宽带
- fastcgi_cache:缓存fastcgi生成的内容,很多情况是php生成的动态的内容,少了nginx与php的通信的次数,更减轻了php和数据库(mysql)的压力,这比用memcached之类的缓存要轻松得多。
fastcgi_cache:在WordPress中应用
配置之后,页面首次访问0.5s左右,关闭再次访问只需要15ms以内了。注意:不会在后台管理页面里应用缓存。
缓存路径准备
# Linux
sudo mkdir -p /data/www/nginxCache/blog.t725.cn
sudo chown -R www-data:adm /data/www/nginxCache/blog.t725.cn
sudo chmod -R u=rwx,g=rx,o=rx /data/www/nginxCache/blog.t725.cn
Windows:创建C:/tmp/nginxCache/blog.t725.cn目录,此目录需要nginx进程,有读写的NTFS权限。
Nginx配置
在http、server、location中,加入fastcgi_cahe配置。
http
# Context:http,fastcgi_cache start.
# 如果有多个站点,复制fastcgi_cache_path行,改path与keys_zone中的y.z;官方文档:https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
fastcgi_cache_path C:/tmp/nginxCache/blog.t725.cn levels=1:2 keys_zone=blog.t725.cn:16m inactive=3d max_size=5G; # keys_zone最大占用内存16M,而1MB zone可以存储大约 8000 个key;inactive是过期时间3天,缓存最大占用空间5G
# Context:http,fastcgi_cache end.
server
##
# Context:server,fastcgi_cache start.
##
set $skip_cache 0; # 缓存获取策略:0为启用,1为禁用;
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~ "/wp-admin/|/xmlrpc.php|/phpInfo.php|wp-.*.php|/feed/|sitemap(_index)?.xml") { # wordpress 后台
set $skip_cache 1;
}
if ($http_cookie ~ "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") { # wordpress 登录用户或发表评论者
set $skip_cache 1;
}
fastcgi_cache_key "$scheme$request_method$host$request_uri"; # 这三行,支持配置在 http/server/location 区域
fastcgi_cache_use_stale error timeout invalid_header http_500; # FastCGI服务器在哪些情况下,nginx可以使用过时的缓存响应
fastcgi_ignore_headers Cache-Control Expires Set-Cookie; # 不改变FastCGI服务器响应的标头字段
# Context:server,fastcgi_cache end.
location
##
# Context:location,一般是【~ \.php$】,fastcgi_cache start.
##
fastcgi_cache blog.t725.cn; # 使用的keyzone,这里使用http中定义的y.z
fastcgi_cache_bypass $skip_cache; # 值为1,不从缓存中获取
fastcgi_no_cache $skip_cache; # 值为1,不保存响应(即不缓存内容)
fastcgi_cache_valid 200 3d; # 后端返回200(成功),缓存3天
add_header X-Cache $upstream_cache_status; # 调试使用:添加header字段,指示缓存命中状态;MISS:缓存未命中,HIT:缓存命中,BYPASS:规则排除的不缓存
# Context:location,fastcgi_cache end.
WordPress配置:通过插件负责清理nginx缓存
- 在wp-config.php中添加:(需要重启wordpress生效)
define( 'RT_WP_NGINX_HELPER_CACHE_PATH','C:/tmp/nginxCache/blog.t725.cn');
- 安装 Nginx Helper 插件,在没有自行编译ngx_cache_purge环境里(与OS无关),只能使用Delete local server cache files 方式。
- 如果没有出现Purge Method配置,在Caching Method中切换点击一下就可以了。
![clip_image002[4] clip_image002[4]](https://blog.t725.cn/wp-content/uploads/2024/12/clip_image0024_thumb.jpg)
proxy_cache:在反向代理中应用
一般在跨主机的反向代理,或负载均衡的场景上,但这些场景也可以做动静分离配置,将静态内容也发布到Nginx上,也可以加快速度。
如果是单机nginx,也不是反向代理时,就不用考虑动静分离+静态缓存了,因为 Nginx + 现代浏览器+现代开发规范 的结合支持下,静态资源变化直接改文件名(fileName-Hash.xxx)+浏览器直接从本地缓存读取(Chrome 54的新版刷新机制)。
<待续>
动静分离应用
<待续>
发表回复