传统方式请求静态资源
- 宽带传输速度和整个客户端与服务器的访问距离是有关系的,距离越远传输速度越慢
- 传统方式架构的弊端:
(1)带宽传输压力大
(2)因为所有用户全部聚集到同一个地区服务器上访问,无法保证整体的系统高可用
(3)因为如果客户端与服务器端传输距离越远,那么宽带传输非常消耗资源,导致用户体验非常差,响应慢;距离越远传输速率越慢
WEB前端优化方案
(1)网站动静分离,将静态资源放到Nginx服务器(静态服务器),动态资源经由Nginx跳转到服务器中,处理请求。
(2)使用浏览器缓存(http状态码304表示的是请求的是缓存的资源),浏览器内置缓存技术,只要访问一次静态资源,都会缓存到客户端。一般服务器上线的时候一定要在静态资源js,css后面加上时间戳,目的是防止发布版本与资源有冲突
(3)减少http请求,合并一些css或者js资源,使用压缩技术(就是文件该去掉的去掉,直接写成一行),一般情况下,压缩文件后缀是.min
(4)使用CDN内容分发,缓存静态资源,注意,CDN不能缓存动态资源,使用CDN还可以配置压缩(压缩缓存的静态资源)
注意一点:DNS解析域名只是将域名解析成IP地址,不包括端口号,不加端口号我们也能访问是因为端口号如果是80则可以省略
什么是CDN
- CDN加速的意思就是在用户和我们的服务器之间加一个缓存机制,动态获取IP地址根据地理位置,让用户到最近的服务器上去访问。
- CDN的最终目的就是减轻了客户端与服务端宽带的传输
- CDN获取客户端的服务地址,实现动态化(DNS负载均衡),根据客户端的Ip地址判断CDN内容分发服务器的距离(判断CDN服务器与客户端最近的是哪台CDN服务器),让客户端从最近的服务器进行访问,减轻宽带传输,提高网站的吞吐量。
- CDN就是内容分发网络。
- CDN服务器部署在多个不同的地区
- CDN是一组分布在多个不同地理位置的Web服务器,用于更加有效的向用户发布内容,在优化性能的时候,会根据距离的远近来选择。
- CDN系统能实时的根据网络流量和各个节点的连接,负载状况以及用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上面,其目的就是使用户能够就近的获取请求数据,解决网络拥塞,提高访问速度,解决由于网络带宽小,用户访问量大,网点分布不均匀等原因导致的访问速度慢的问题。
- 由于CDN部署在网络运营商的机房上,这些运营商又是终端用户网络的提供商,因此用户请求的第一跳就是到达CDN服务器,当CDN服务器缓存有用户请求的数据的时候,就可以从CDN返回给浏览器,提高访问速度。
- CDN能够缓存JS脚本,CSS样式,图片,图标,flash等静态资源文件,这些静态资源文件的访问频率很高,将其缓存在CDN上可以极大的提高网站的访问速度,但是由于CDN一般部署在网络运营商的机房中,所以在一般的网站上很少使用CDN加速。
CDN内容分发原理
- 这里我们先解析的域名,解析的结果不是实际的IP,而是用CDN域名解析器解析出CDN的ip,再由CDN进行解析,CDN服务器中访问真实的IP地址
(1)用户向浏览器提供要访问的域名;
(2)浏览器调用DNS(域名解析服务),利用域名解析库将域名进行解析,由于CDN对域名解析的过程进行了调整,所以解析库一般得到的是该域名对应的CNAME记录,为了得到实际的IP地址,在此过程中,使用的全局负载均衡DNS解析,如根据地理位置的信息解析对应的IP地址,使得用户能够就近访问;
CNAME:即别名,可以用来把一个域名解析到另一个域名。当DNS系统查询CNAME左面名称的时候,都会转向CNAM右面的名称再进行查询,一直追踪到最后的PTR或者A名称,成功查询后才会做出回应,否则失败。
- 例如:你有一台服务器上存放了很多的资料,你使用docs.example.com去访问这些资源,但又希望通过documents.example.com去访问这些资源,那么你就可以在自己的DNS解析服务上添加一条CNAME记录,将documents.example.com指向docs.example.com,如:documents.example.com docs.example.com(左面的名称访问右面的名称),添加该条CNAME记录。
(3)此次解析得到的CDN缓存服务器的IP地址,浏览器在得到的实际的IP地址以后,向缓存服务器发出访问请求;
(4)缓存服务器根据浏览器提供的要访问的域名,通过Cache内部专用的DNS解析得到此域名的实际的IP地址,再由缓存服务器向实际的IP地址提交访问请求;
(5)缓存服务器从实际的IP地址得到内容以后,一方面在本地进行保存,以备以后的时候,另一方面把获取到的数据返回给客户端,完成数据服务过程(和Nginx类似,nginx也是可以开启缓存的,其也有缓存功能)
(6)客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览器的数据请求过程。