文档章节

使用nginx cache加速

刘少
 刘少
发布于 2018/01/29 17:23
字数 1121
阅读 188
收藏 1

做优化前,一定要确定指标,使用监控系统采集出来,形成对比性总结。

 

笔者在一家创业公司,主要做微信里的H5动画和广告,日PV 7千万-2亿之间, 缓存放在redis中,近期基于nginx proxy cache优化降低了后端使用带宽、CPU内存使用和故障率,在业务高峰时对后端起到了保护作用,并且节省下几台服务器成本,原有的业务架构如图:

 

接口的响应平均时间在180ms-480ms左右,不满足用户快速加载场景的需求,因此决定对接口进行优化。

nginx proxy cache适合那种url易于缓存,更新不频繁的,sessionless的场景。缓存key可以灵活定义,对于GET/POST都能灵活支持。如果和用户session绑定,可以在缓存key中加入session值(java cookie中JSESSIONID).我的这个场景使用作品修改时间(time)作为缓存key的一部分,每次修改时间都会变更。

经过调研分析,决定在waf-nginx层做缓存,为了降低waf-nginx层负载,将压缩(强制gzip) 层挪到业务nginx进行。架构图如下:

waf-nginx配置:

1.缓存磁盘目录使用ssd磁盘,xfs文件分区

mkfs.xfs -f -i size=512 -l size=128m,lazy-count=1 -d agcount=16 /dev/vdc1

mkdir /cache

vim /etc/fstab

  /dev/vdc1            /cache                xfs        defaults,noatime,nobarrier 0 0

mount -a

2.nginx配置:

#配置缓存路径

#添加upstream_cache_status,进行缓存命中率统计
log_format cache_log '$remote_addr - [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ' "$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time" "$upstream_cache_status"';


proxy_cache_path /cache/nginx levels=1:2 keys_zone=page_cache:512m inactive=3d max_size=80g use_temp_path=off;

#配置 缓存更新,后端故障,允许使用过期缓存

proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

server {

location /page {
                proxy_cache page_cache;
                proxy_cache_key $scheme$uri?code=$arg_code&time=$arg_time;
                proxy_cache_valid 200 5d;
                proxy_cache_min_uses 1;
                proxy_cache_lock on;
                proxy_cache_lock_timeout 5s;
                add_header Cache-Status $upstream_cache_status;
                #忽略Set-Cookie
                proxy_ignore_headers Set-Cookie;
                proxy_hide_header Set-Cookie;
                #强制gzip,避免恶意刷流量
                proxy_set_header Accept-Encoding 'gzip';
                proxy_http_version 1.1;
                proxy_set_header Connection "";

                expires 10d;
                proxy_pass http://biz-nginx-backend;
                access_log /var/log/nginx/cache.log cache_log;
}
}

proxy_cache_key $scheme$uri?code=$arg_code&time=$arg_time;
定义缓存key

proxy_cache_valid 200 5d;
只对200状态码进行缓存,缓存时间是5天.  

proxy_cache_min_uses 1

一个url,次数访问到达1次,就开始缓存

proxy_cache_bypass是绕开缓存,直接到后端upstream,其中可以通过cookie,和url的get参数进行控制。

 

业务nginx配置:

1.启用gzip

gzip on;
gzip_min_length 1k;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 64k;
gzip_http_version 1.0;
gzip_types text/plain text/css application/javascript application/json 
            application/x-javascript text/xml application/xml application/xml+rss 
              text/javascript image/svg+xml;

 

效果监控(zabbix)

看下图waf-nginx发现入流量和出流量发生了转变,因为往后端业务nginx流量逐渐变少,出流量超过入流量。

业务nginx流量监控

启动缓存后,流量高峰被很容易的实现消峰

redis流量监控

redis流量下降比较明显,内存使用也下降了

redis ops监控

ops直接下降,读流量下降明显

缓存命中率

upstream_cache_status包含以下几种状态:

·MISS 未命中,请求被传送到后端
·HIT 缓存命中
·EXPIRED 缓存已经过期请求被传送到后端
·UPDATING 正在更新缓存,将使用旧的应答
·STALE 后端将得到过期的应答

 

缓存命中率统计, 通过统计访问日志中的 upstream_cache_status变量的值,可以很容易统计到命中率,经过统计,命中率95%左右。可以使用zabbix很方便的监控起来。


缓存清理

这个业务使用作品修改时间作为缓存key的一部分,其实不存在清理问题,如果想要清理,可以使用写一个lua脚本,更轻量,可以参考

https://scene-si.org/2016/11/02/purging-cached-items-from-nginx-with-lua/

经过几天的监控,发现nginx proxy cache非常稳定,接着又把广告代码加上了缓存,广告加载速度直线提升。

 

 

参考文章:

https://www.nginx.com/blog/nginx-high-performance-caching/

 

更新

2018-03-01

启用proxy-cache后,如果缓存的内容是gzip的,而客户端浏览器又不支持gzip,会造成客户端乱码,除非启用nginx gunzip module 参加 https://serverfault.com/questions/253581/nginx-reverse-proxy-cache-with-gzip-content-and-non-gzip-content

https://my.oschina.net/osgit/blog/1615085

 

 

© 著作权归作者所有

共有 人打赏支持
刘少
粉丝 13
博文 31
码字总数 12465
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

jingshishengxu
jingshishengxu
Android学习——控制硬加速 hardwareAccelerated

Android学习——控制硬加速 hardwareAccelerated 在3.0才有的。 分类: android学习 2012-04-27 13:59 8742人阅读 评论(4) 收藏 举报 androidapplicationapinull测试 从Android3.0 (API lev...

Jonson
2014/05/15
0
0
Android图形---硬件加速(Hardware Acceleration)(一)

本文译自:http://developer.android.com/guide/topics/graphics/hardware-accel.html 从Android3.0(API Level 11)开始,Android 2D渲染管道能够更好的支持硬件加速。硬件加速执行的所有的...

长平狐
2012/10/16
2.2K
0
Android开发_控制硬加速hardwareAccelerated

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangty0223/article/details/10694783 控制硬加速 hardwareAccelerated 也是一种优化的手段 从Android3.0 (A...

张腾元_Ternence
2013/08/30
0
0
listView 加载图片过多,滑动时 较阻塞,如何解决?

问:listView 加载图片过多,滑动时 较阻塞,如何解决? 答:方法一:控制硬加速。你可以在以下级别上分别控制硬加速:Application、Activity、Window、View。 android:hardwareAccelerated=...

小打小闹小开小心
2015/12/12
26
0
OSS全球传输加速开启公测,助力企业业务全地域覆盖

全地域的业务覆盖的趋势,带来的新机会与新挑战 互联网基础实施的快速发展,为企业业务覆盖更多地域的客户,带来便利。越来越多的企业,会将业务覆盖到全国,甚至全球更多地域,这给业务的增...

简单爱0107
01/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
3
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
3
0
10 Git —— 标签管理

10 Git —— 标签管理 本节内容: 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;命令git......

lwenhao
今天
3
0
小程序设置垂直居中,水平居中

如果子容器中的view需要居中的话,那需要在父容器中设置居中 水平居中: display: flex; flex-direction: column; align-items: center; 垂直居中 display: flex;align-items: cen...

淘幻幻
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部