技术干货:使用静态缓存提升网站性能的五种方法!

news/2024/5/15 5:35:07/文章来源:https://blog.csdn.net/weixin_33756418/article/details/90625438

6d000037ed7b90463d0

本文作者: 乔锐杰 现担任上海驻云信息科技有限公司运维总监/架构师。曾任职过黑客讲师、java软件工程师/网站架构师、高级运维、阿里云架构师等职位。维护过上千台服务器,主导过众安保险、新华社等千万级上云架构。在云端运维、分布式集群架构等方面有着丰富的经验。

以下正文

上次写了一篇数据库缓存,由于快餐式的风格,遭到了广大读友的吐槽。上篇风格有点 “ 虚 ”,我本身是一个技术控,偏向经验/干货的分享,本文主要描述静态缓存方面的一些心得及分享。作为系列二,有所不足之处,依旧希望大家踊跃“ 亮砖 ”。

说起静态缓存技术,CDN是经典代表之作。静态缓存技术面非常广,涉及的开源技术包含apache、Lighttpd、nginx、varnish、squid等。

静态缓存,一般指 web 类应用中,将图片、js、css、视频、html等静态文件/资源通过磁盘/内存等缓存方式,提高资源响应方式,减少服务器压力/资源开销的一门缓存技术。

本文主要通过:浏览器缓存、磁盘缓存、内存缓存、nginx的内存缓存、CDN五个方面围绕静态缓存而展开。

一、浏览器缓存

浏览器缓存,也称为客户端缓存,是静态缓存中最常见最直接的表现形式,很多时候都往往被人忽略掉。

案例1:

我们经常在nginx的配置文件中看到以下缓存配置:

6d000037ed9f276fc6c

案例2:

在经常写 jsp 的时候,html 标签中关于 http 头信息也可以注意到“ expires ”的字样:

6d100037e15c8ded90d

对于案例1和案例2中(nginx设置的expires优先级大于代码中设置的expires优先级),expires是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。如果文件变动较频繁,就不要使用 expires 来缓存。

比如对于常见类web网站来说,css 样式和 js 脚本基本已经定型,所以最适合的方法是 expires 来缓存一些内容到访问者浏览器。

案例3:

通过 chrome 访问服务器端的一张图片,用F12键打开开发者前端调试工具:

6d000037eda08b47417

第一次访问,响应200状态,当第二次及后续访问的时候,变成304状态,客户端已经开始获取浏览器缓存内容,而不需要去服务器端获取对应的请求内容,即 nginx 中 expires 参数设置已经生效。等待客户端缓存时间过期后,会再次请求服务器端内容来更新本地缓存。

6d000037edbc442d9b9

介绍到这里,突然想起一个有意思的需求。比如,访问一张静态文件,不想客户端缓存,需要每次都去服务器端取数据。我们可以用“ last-modified ”参数来实现,即“ last-modified ”是根据文件更新时间来确定是否再次发送加载。

Nginx核心配置如下:

6d000037ed8acbc1f97

我们更改掉服务器传回客户端的“ last-modified ”文件修改时间参数的值,这样导致客户端本地保存的文件时间每次跟服务器端传回来的时间不一致,所以每次客户端“ 误认为 ”服务器端有静态文件更新,每次都会去服务器端取“ 所谓的最新数据 ”。这样我们可以看到,不管在浏览器访问多少次,返回的 http 状态都是200,再也找不到304状态了。

误区:在 nginx 中设置 expires,并不是指把静态内容缓存在 nginx 中,而是设置客户端浏览器缓存的时间,这是很多人的误区所在。

二、磁盘缓存

除了存储在客户端的静态缓存(浏览器静态)技术外,在服务器端的静态缓存技术主要分为磁盘缓存和内存缓存两大类。单纯围绕 nginx 的 squid、varnish 等一类中间件,处理静态数据的性能十分优秀。核心是 nginx 基于 epoll 网络模型,而相比 apache 基于 select 网络模型。所以 apache 的优势在于密计算型,稳定性好。而 nginx 偏向静态处理,反向代理,高并发。比如 apache+php 的稳定性比 nginx+php 要好,而性能是明显 nginx 要优秀许多。

以上仅单纯是对磁盘中静态数据处理的能力,所谓磁盘缓存,指另外的一种缓存静态文件的技术。以 nginx 配置为例:

6d100037e19d4127df6

可以看出 nginx 主要通过 proxy_cache 来实现 web cache,熟悉 nginx 的同学,不难看出,以上配置在 location 这里,不仅可以实现静态文件的缓存,还可以实现动态文件的缓存(这里放在下章节详细介绍)。我们编写个 test.html测试文件,然后并访问。test.html 源码如下:

6d000037edc9ba52346

我们发现服务器的 cache 目录里面,多了两个缓存文件:

6d100037e1746809432

有意思的,这两个文件里面的内容分别为(通过 less 命令查看):

6d100037e1ae69f0753

(b0ad5d3e7f099bfff9e4fc6a159d868c)

6d100037e1e193e6dbb

(53edc39ed253e14415a29412cfc01faf)

所以不难看出,nginx 把 html 内容和图片二进制全部缓存到本地磁盘上了。下次用户再次来访问 test.html 的时候,nginx 直接将缓存在本地磁盘的文件返回给用户。特别是后端如若是部署的 tomcat、iis 等,nginx 强大的静态缓存能力,有效减少了服务器压力。

三、内存缓存

紧接上面描述的磁盘缓存,内存缓存顾名思义,就是把静态文件缓存在服务器端的内存中。所以这种缓存,如若命中缓存的话,取内存中的缓存数据返回比取磁盘中的缓存数据返回,性能要高很多。以 varnish 为例,varnish 核心配置如下:

启动命令:

6d100037e18e22f534b

参数简介:

6d000037ee413494231

default.vcl核心配置如下:

6d000037ee6dd062ae8

Varnish对.gif、.jpg、.jpeg、.png等结尾的 URL 缓存时间设置1小时。varnish设置完毕后,我们用命令行方式,通过查看网页头来查看命中情况:

6d000037ee881153360

6d100037e203342923b

最后,我们可以通过 varnishadm 命令来清理缓存,也可以通过 varnishstat 命令来查看 varnish 系统缓存状态。

四、Nginx 的内存缓存

以上主要以 Varnish 为例,介绍了内存缓存静态资源的方法。其实 nginx 也有内存缓存,相比 squid、varnish 而言,nginx 的内存缓存需要通过编码实现。如下配置:

6d000037ee7f70a3812

memcached_pass 指定服务器地址,使用变量 $memcache_key 为 key 查询值,去 memcache 查询对应 value 值。

如我们访问:http://***.***.***.***/image/test.jpg ,则 nginx 去 memcache 中查询key 为“ test.jpg ”的 value 值并返回。如果没有相应的值,则返回 error_page 404。介绍到这里,关键在于存储在 memcache 中的静态文件,需要通过代码写入 memcache 中。怎么样通过 php/java 等代码把静态资源的数据写入 memcache 中,关于这块的示例就不再过多介绍了。

Nginx的内存缓存因为需要通过编码实现,所以灵活性特别高。这块可以结合自身业务系统的特点,让静态缓存的灵活性和效率都能得到保障。可能唯一的缺陷就是,通过编码实现的方式,给我们维护管理带来了负担。在之前我曾参与的一个电商系统,就是把客户的订单照片通过 php 代码写入 memcache,客户访问取图的时候,从 memcache 中获取,速度效率特别高。Nginx 作为一款在七层无所不能且轻量级高性能的中间件,能够直接去 memcache 中取数据,来实现静态缓存的效果,这块相应的功能是其他软件无法相媲美的。

五、CDN

说起 CDN,大家都不陌生,它是静态缓存加速最典型的代表。CDN技术并不是一门新的技术,它是基于传统 nginx、squid、varnish 等 web 缓存技术,结合 DNS 智能解析的静态缓存加速技术。值得注意的是,他对动态链接访问并没有加速效果。架构原理图如下:

6d100037e2349afb0db

所以CDN的静态缓存技术核心主要在于两点:

节点缓存:对需要加速的网站应用,相应的静态资源通过内存缓存+磁盘缓存的方式缓存在服务器端。

精准调度:对访问的用户 ip 进行智能解析调度,实现就近缓存节点访问。比如以上图例中,北京用户访问 www.a.com。通过 dns 解析的时候,分析用户 ip,发现是北京用户。则 dns 返回对应北京缓存节点的 ip 地址给到用户,则用户 www.a.com 默认访问北京服务器上面的缓存数据,实现就近访问的策略,大大提升了访问速度。

杜绝抄袭,支持开源,我为自己呐喊,百分百原创作者:乔锐杰


好啦~本文到这里就结束了,同时,如果喜欢我们的话就赶紧订阅我们吧~~~每天定时推送新鲜干货~~~也可以关注我们的微信公众号:架构云专家频道 每天同步更新哟~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_824197.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS7 发布网站 出现 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误...

windows7下发布web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”原因:vs2010默认的是4.0框架,4.0的框架是独立的CLR&#xf…

下载网站原代码步骤

打开你想复制的网站; 在网站的空白区,鼠标右键选择—页面另存为。会弹出一个窗口,选择需要保存的网页文件类型为“网页,全部”,网页文件的名称根据自己来写,比如是网站的首页就写index.htm ; …

小网站架构优化-提升抗并发能力:子应用程序分离方案

前言:标题为啥要加个“小”,只因为上一篇文章“小网站架构优化:从100并发抗到4000并发”,带了个“小”字,所以这篇也顺流加个“小”了。大意“小”是特指秋色园(流量小,服务器配置低&#xff09…

从运维角度看中大型网站架构的演变之路

前言 网上有很多文章类似于我今天要分享的课程,有架构师写的,有运维写的,还有开发些的,偏重点都不同,今天我以咱们运维角度全面讲解。 一个成熟的网站架构并不是一开始设计就具备高可用、高伸缩、高性能等特性的&#…

SVN 导出代码在VS2012运行提示“未能将网站xx 配置为使用 ASP.NET 4.0,为了使此网站正确运行,您必须将它手动配置为使用 ASP.NET 4.0”

今天接到了我们自己的一个订餐系统优化的任务,要想执行这个任务就得使用 SVN 获取源代码(我的学习进度还没有走到SVN); 其实这样来一下也好,有助于更好地学习接下来的SVN,哈哈。下面说问题: 1,当…

闪电精灵SEO 打破百度快速排名规则

我们许多站长们都是每天为了自己网站的排名操碎了心,然而纵使每天苦逼的更新网站,做外链,排名未必上得去,度娘总是不给面子,排名优化做的太慢。但是你可知道有一种方法能够在7-30天内快速提高网站排名吗?或者听说过但不会做? 百…

从运维角度看中大型网站架构的演变之路

本文出自 “李振良的技术博客” 博客,请务必保留此出处http://lizhenliang.blog.51cto.com/7876557/1951651 前言 网上有很多文章类似于我今天要分享的课程,有架构师写的,有运维写的,还有开发些的,偏重点都不同&#x…

当代文学网站设计初稿

完成设计初稿;设计思路:页头以毛笔开始,页尾以钢笔结束;为的是形象的表述当代文学从1949年至今的一个发展历程。页面采用古典元素点缀增加页面古典气息,采用笔墨、墨汁等增加页面文学韵味,页面背景采用有点…

网站、数据库的衍变之路

网站、数据库的衍变之路 转发自博客:http://www.cnblogs.com/birdshover/原文地址:http://www.cnblogs.com/birdshover/archive/2009/08/03/1537225.html (一) 最简单的一个网站,可能说是demo更加合适一些,…

20个非常不错的HTML5免费建站模板

HTML5是下一代主要的HTML编码规范,HTML5为网页设计者们提供了一些强大的新功能,HTML5的新功能包括:表单控制、APIS、拖拽、多媒体、屏幕绘图等。 本文向大家推荐12款免费的优秀高质量 HTML5CSS3 模板。 1. Touch The Future: Create An Elega…

20 个非常漂亮的 JavaScript 滑块设计的网站

这些东西一定会用的到的,哒哒 JavaScript 滑块,特别是基于 jQuery 插件的滑块在网站设计中使用非常频繁,下面是 20 个使用该技术设计的网站,设计非常精美,值得参考。 These Are Things Elevate Mathieu Clauss The Dai…

SEO禁用蜘蛛(爬虫)搜索收录网页(全)

手段一: Robots协议:用来告知搜索引擎哪些页面能被抓取,哪些页面不能被抓取;可以屏蔽一些网站中比较大的文件,如:图片,音乐,视频等,节省服务器带宽;可以屏蔽站…

今日头条垂涎已久的Reddit,到底是个什么网站?

硅谷Live / 实地探访 / 热点探秘 / 深度探讨 在国内,说起新闻网站,我们肯定会想到今日头条、百度、搜狐、网易等等网站。 那么你们知道么?在美国,如果你问美国人他们最常逛的新闻社区是什么,回答中肯定会提及一个网站。…

如何确定一个网站是用Wordpress开发的

问题 如何确定一个网站是用Wordpress开发的? 答案 打开网页的源码页,可以通过搜索功能查找一下是否源码中包含wp-content。如果有这个文字,说明此网站基本就是使用wordpress程序创建的网站,因为wp-content是wordpress建站程序的一…

著名电子商务网站高并发千万级大型数据库经验之- 读写分离

由于公司的主服务器责任重大,而且满负荷跑了接近2年了,怕万一有闪失主服务器出现硬件故障后重新购买新服务器订货到货周期可能会比较长,所以公司在春节期间购买了一台更强大的新服务器来当备用服务器,购买的初衷就是防止出现硬件故…

利用shell脚本批量提交网站404死链给百度

网站运营人员对于死链这个概念一定不陌生,网站的一些数据删除或页面改版等都容易制造死链,影响用户体验不说,过多的死链还会影响到网站的整体权重或排名。百度站长平台提供的死链提交工具,可将网站存在的死链(协议死链、404页面)进行提交,可快…

全球最大同性交友网站,已经10岁了!

本文转自硅星人(ID:guixingren123)作者:光谱1999 年上线的 SourceForge,因为免费一度是世界上最受欢迎的开源软件代码托管网站。然而 Google 担心它一家独大,上线了自家的代码托管网站 Google Code。2005 年&#xff0…

全球最大同性交友网站,已经10岁了!

本文转自硅星人(ID:guixingren123)作者:光谱1999 年上线的 SourceForge,因为免费一度是世界上最受欢迎的开源软件代码托管网站。然而 Google 担心它一家独大,上线了自家的代码托管网站 Google Code。2005 年&#xff0…

采用LAMP网站架构(Linux+Apache+MySQL+PHP)

2019独角兽企业重金招聘Python工程师标准>>> LAMP指的Linux(操作系统)、Apache(HTTP 服务器),MySQL(数据库软件) 和PHP(有时也是指Perl或Python) 的缩写&…

在免费的亚马逊服务器上手写个人网站是什么体验(文中有大量福利,别外传)

目录 本文引言部分: 本文必读部分: 本文福利白嫖部分: 接下来让我们在白嫖的亚马逊云服务Amazon EC2手写网页: 在亚马逊服务器上写网页三步走: 总结Amazon EC2(云服务器)的一些优势: 本次在亚马逊AW…