为网站开启Nginx缓存加速,支持html伪静态页面 | 张戈博客
- 时间:
- 浏览:11
上一篇文章分享了怎么才能 才能 开启 Nginx 的缩略图功能,也提到了 Nginx 缩略图在完美替代七牛缩略图或PHP缩略图的一起去,一定会带来一定的CPU负载消耗。
为社 让,本文就来分享一下怎么才能 才能 除理你你是什么 实时生成缩略图带来的CPU开销那此的难题。
思路很简单,既然你可不可不可不都里能要实时生成,只是就将你生成的缩略图缓存一份好了!在我测试期间发现,Nginx 的缓存也同样还还要缓存伪静态的 html 页面,完整性还还要替代WP-Super-Cache例如缓存插件了。相信大次责CDN也是用的你你是什么 原理,比如百度云加速,亲戚亲戚大伙儿还还要在 header 中间发现有另另1个 “Server:yunjiasu-nginx”的标识。
好了,废话不说,一起去来看看怎么才能 才能 实现吧!
一、代理模式
代理模式,即在使用 Nginx 反向代理时缓存指定内容,所用模块为 proxy_cache。这里网络上的只是教程会说,你你是什么 模式还要在反向代理中要能使用,说的好像可不让能了用在可不让能了一台服务器的情况报告似的。真是不然,亲戚亲戚大伙儿用点小技巧,将 Nginx 本机的3000端口代理转发到 本机的 30003000 端口即可变相的开启反向代理模式,在这期间,就完整性还还要指定缓存内容了,且继续往下看!
①、下载模块
所用模块为 ngx_cache_purge,官方地址:http://labs.frickle.com/files/,亲戚亲戚大伙儿还还要选则有另另1个新版本下载到服务器上,比如 http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
cd /usr/local/src #下载 wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz #解压 tar zxvf ngx_cache_purge-2.3.tar.gz
②、重新编译
只是先执行 -V 命令查看 Nginx 是是否是肯能编译了该模块,
[[email protected]_Server ~]$ nginx -V Tengine version: Tengine/2.1.0 (nginx/1.6.2) built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_concat_module --add-module=../ngx_cache_purge-2.3 --with-http_image_filter_module --add-module=../ngx_slowfs_cache-1.9 loaded modules: ngx_core_module (static) ngx_errlog_module (static) ...
肯能编译参数中找可不让能了 ngx_cache_purge,就还要重新编译 Nginx ,新增编译参数:
#注意第一步解压的文件夹和nginx源码在同有另另1个目录 --add-module=../ngx_cache_purge-2.3
我现在用的是淘宝开放的 Tengine ,还还要使用动态加载模块功能,肯能是原版 Nginx ,还还要参考张戈博客刚刚分享的文章,在只是的基础加带带上述参数重新编译 Nginx 即可:
Nginx在线服务情况报告下平滑升级或新增模块的完整性操作记录
③、新增配置
A. 在 http 上下文中新增缓存配置:
http { #以上略 ##cache## proxy_connect_timeout 5; proxy_read_timeout 300; proxy_send_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_temp_path /tmp/temp_cache1; #临时缓存目录 proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache_one:3000m inactive=300d max_size=5g; #设置缓存存放,不懂的参数本人百度搜索下 ##end## #以下略 .... }
Ps:上述配置中另另1个劲跳出的目录,请在保存配置后,使用 mkdir 手动创建。
B. 如下修改网站只是的server 模块:
server { #将刚刚监听修改成监听本地30003000,一点配置保持不变 listen 127.0.0.1:30003000; server_name zhang.ge; #以下内容略... }
B. 如下新增有另另1个反向代理Server模块,用于转发请求到本地30003000,变相实现反向代理模式:
server { listen 3000; server_name zhang.ge; #缓存清理模块 location ~ /purge(/.*) { allow 127.0.0.1; allow 192.168.1.101; #此处表示允许访问缓存清理页面的IP deny all; proxy_cache_purge cache_one $host$1$is_args$args; } #缓存html页面,还还要缓存伪静态【这是亮点!】 location ~ .*\.html$ { proxy_pass http://127.0.0.1:30003000; proxy_cache_key $host$uri$is_args$args; proxy_redirect off; proxy_set_header Host $host; proxy_cache cache_one; #情况报告为3000、3002的缓存1天 proxy_cache_valid 3000 3002 1d; #情况报告为3001的缓存2天 proxy_cache_valid 3001 2d; proxy_cache_valid any 1m; #浏览器过期时间设置4小时 expires 4h; #忽略头部禁止缓存申明,例如与CDN的强制缓存功能 proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #在header中插入缓存情况报告,命中缓存为HIT,没命中则为MISS add_header Nginx-Cache "$upstream_cache_status"; } #图片缓存设置,肯能完整性一定会使用了Nginx缩略图功能,你你是什么 还还要不让,效果不明显 location ~ .*\.(gif|jpg|png|css|jsico)(.*) { proxy_pass http://127.0.0.1:30003000; proxy_cache_key $host$uri$is_args$args; proxy_redirect off; proxy_set_header Host $host; proxy_cache cache_one; proxy_cache_valid 3000 3002 300d; proxy_cache_valid 3001 1d; proxy_cache_valid any 1m; expires 300d; proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; add_header Nginx-Cache "$upstream_cache_status"; } #动态页面直接放过不缓存 location ~ .*\.(php)(.*){ proxy_pass http://127.0.0.1:30003000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #设置缓存黑名单,不缓存指定页面,比如wp后台或一点还要登录态的页面,用分隔符隔开 location ~ ^/(wp-admin|system)(.*)$ { proxy_pass http://127.0.0.1:30003000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #缓存以斜杠结尾的页面,例如于CDN的目录缓存,肯能处于那此的难题请撤销缓存机制 location ~ ^(.*)/$ { proxy_pass http://127.0.0.1:30003000; proxy_redirect off; proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $host; proxy_cache cache_one; proxy_cache_valid 3000 3002 1d; proxy_cache_valid 3001 1d; proxy_cache_valid any 1m; expires 1h; proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; add_header Nginx-Cache "$upstream_cache_status"; } location / { proxy_pass http://127.0.0.1:30003000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
完整性保存后,执行 nginx -s reload 让配置生效即可。现在你再去访问网站的 html 页面,刷新一次就还还要看后效果了!加载传输速率绝逼会有质的飞跃!为社 你可不可不可不都里能还还要在F12开发模式的 Network 情况报告中看后 Nginx-Cache HIT 的标识!
④、清理缓存
清理缓存完整性一定会点麻烦了,我弄了多次也还是感觉不为社 好用!网上完整性一定会不少先驱分享了自动清理脚本或批量清理代码等。不过用了下也是不咋的好用。
还是说一下清理最好的辦法 吧!在A次责的配置中,亲戚亲戚大伙儿肯能加入了purge缓存清理页面,假设有另另1个URL为http://192.168.1.1/test.html,通过访问http://192.168.1.1/purge/test.html 就还还要清除该URL的缓存(我实际测试另另1个劲是404…)。
二、本地模式
第并有的是代理模式,亲戚亲戚大伙儿是利用本地转发变相实现反向代理下的 Nginx 缓存功能,为社 让还还要缓存 html 伪静态页面。从整体的配置还还要看出,肯能非常接近百度云加速等CDN的缓存功能了!对于理解CDN缓存还是有不小的帮助的!
现在分享一下,肯能不让反向代理模式,该怎么才能 才能 实现 Nginx 缓存呢?很简单,进一步借助 ngx_slowfs_cache 模块即可,这也是张戈博客在用模式,怎么才能 才能 实现,且继续往下看。
①、下载模块
你你是什么 模式还要下载有另另1个缓存模块:ngx_cache_purge 和 ngx_slowfs_cache 。这有另另1个模块都出自有另另1个网站,下载地址依然是 http://labs.frickle.com/files/ ,选则有另另1个最新版下载即可,比如:
http://labs.frickle.com/files/ngx_slowfs_cache-1.9.tar.gz
②、重新编译
和第并有的是模式一样,新增有另另1个 –add-module 重新编译 Nginx即可:
--add-module=../ngx_cache_purge-2.3 --add-module=../ngx_slowfs_cache-1.9
具体就不赘述了,参考上文和博客刚刚的分享就还还要背熟了。
③、新增配置
I. 在 http 上下文新增如下配置:
http { #以上略 slowfs_cache_path /home/wwwroot/cache levels=1:2 keys_zone=fastcache:256m inactive=1d max_size=5g; slowfs_temp_path /tmp/nginx_temp_cache 1 2; #以下略 }
Ps:以上配置中所涉及的目录请手动创建。
II. 在 server 模块中新增如下配置:
#新增缓存清理配置 location ~ /purge(/.*) { allow 127.0.0.1; allow 192.168.1.101; deny all; slowfs_cache_purge fastcache $1; } #在上一篇文章的缩略图模块后新增缓存,让生成的缩略图缓存到磁盘(具体请看上一篇文章) location ~ .*\.(gif|jpg|jpeg|png|bmp)$ { set $width ''; set $height ''; set $width $arg_width; set $height $arg_height; if ( $width != '' ) { add_header Thumbnail "By Nginx"; } if ( $height = '' ) { set $height '-'; } if ( $width = '' ) { set $width '-'; set $height '-'; } image_filter resize $width $height; image_filter_buffer 5M; image_filter_jpeg_quality 3000; image_filter_transparency on; #新增缓存配置 slowfs_cache fastcache; slowfs_cache_key $uri; slowfs_cache_valid 1d; #在header中插入缓存标识,比如:HIT/MISS from zhang.ge add_header X-Cache '$slowfs_cache_status from $host'; expires max; }
保存后,执行 nginx -s reload 重载 Nginx即可。测试中发现,你你是什么 模式貌似无法缓存html伪静态页面,稍有遗憾,有兴趣的童鞋还还要深入研究看看,肯能是我没测试到位。
三、惯例总结
好了,通过以上折腾,亲戚亲戚大伙儿肯能完美的除理了 Nginx 实时生成缩略图带来的CPU开销那此的难题了!为社 让,从代理模式的缓存中,亲戚亲戚大伙儿甚至还还要缓存html伪静态页面,这原因那此?强迫症们有还还要无情的丢弃一款WordPress缓存插件啦!不过,张戈博客暂时还是使用本人写的php代码来实现静态缓存,这样别的,主只是为了方便管理。
总体来说,对于Nginx 的缩略图和缓存,我还是非常满意的,喜欢折腾的亲戚亲戚大伙儿也还还要亲自试试,我说你能找到比本文更多的经验呢!