前言
1. 什么是网站动静分离架构模式?
- 网站中的动静分离其实就是将动态资源和静态资源分离处理。
- 传统网站架构模式:jsp、html、img、css、js全部存放在一个服务器上,把静态资源和动态资源共同放到一台服务器上。
- 大型互联网公司中前端与后端开发是分离,静态资源和动态资源不会部署到同一台服务器上,静态资源部署在一个服务器上(html、css、img、js …),动态资源部署在一个服务器上(后端代码)
2. 动态资源和静态资源的区别?
- 静态资源:用户多次访问后,html源代码不会发生改变,例如html、jpg 、css、js 等不需要后台处理的资源。
- 动态资源:用户多次访问后,html源代码可能会发生改变,例如我们访问的JSP页面 (本质是一个Servlet)或*.do请求等。
- 区别:判断标准是,刷新多次,html源代码是否发生改变 。
- 误区:并不是页面是动态的,就一定是动态页面,一般动态页面为了提高被搜索引擎搜到的机率,会使用伪静态;也就是说使用动态页面静态化技术将页面静态化,静态化技术有Freemarker、Beetl、Velociity、Thymeleaf 等。
3. 为什么要使用动静分离?
- 其实就是减轻服务器的压力、提高服务器的响应速度和效率、保证高并发。就像数据库的读写分离一样,也是保证高并发。
- 静态服务器我们同时也可以使用CDN做内容分发,访问不同的资源转发到不同的服务器。
- 静态服务器我们一般使用Nginx,Nginx实现静态服务器要比Tomcat 快得多。
4. 动静分离与前后端分离的区别?
- 动静分离:指的是动态资源和静态资源分离,分别部署在不同的服务器上。
- 前后端分离:网站架构模式中,微服务开发基于SOA面向服务开发,后台和前端都采用调用接口方式。
5. 图示
图片来源:蚂蚁课堂
搭建动静分离(Nginx+Tomcat实现)
Nginx的nginx.conf文件配置中配置如下:
由于不是详细教学篇,不熟悉nginx的想要详细了解每个配置的意义会花些时间,这里只是做个记录供自己以后查看。
#静态资源服务配置(一定要配置在动态资源之前,因为动态资源location采用/匹配的,否则请求就被统一当做动态资源处理)
server {
listen 80; # 表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name wangxu;
#静态资源
location .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
root html;
index index.html index.htm;
}
}
#配置上游服务器 集群,默认轮询机制
upstream backServer{
server 127.0.0.1:81;
server 127.0.0.1:82;
}
#动态资源服务配置
server {
listen 80; # 表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name localhost; # 表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
#charset koi8-r;
#access_log logs/host.access.log main;
location / { # 表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
#root html; # 里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
#指定上游负载均衡服务器
proxy_pass http://backServer/;
#index index.html index.htm; # 当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
浏览器访问wangxu时会访问Nginx本地html文件夹内的index.html页面
浏览器访问localhost/api-member时会转发到上游网关服务,由网关转发到对应的服务;
拓展
其实我们在实际做动静分离的时候我们一般不这样做。因为大多数网站静态资源比动态资源大得多,往往影响网站加载速度的往往是静态资源,这其实对我们的带宽要求非常高。
例如我服务器带宽是1Mbps(1Mbps≈128kb/s),发一个请求动态资源10kb、静态资源590kb,这时候我们也要(590+10)/128≈5秒才能完成加载,更别说并发访问的情况了,我们虽然也可以提高带宽,而且带宽是非常贵的(比服务器配置还贵),治标不治本,一般我们采用三方服务商CDN来做静态资源缓存,它会将我们的静态资源缓存到各个节点,并支持就近原则访问。
为什么将静态资源存放到第三方服务器效率非常高呢?
1.云服务器签订带宽都是将T算;
2.CDN内容分发,能够将静态资源缓存到全国各地节点能够减少客户端与CDN带宽距离从而提高响应速度;就近原则访问,举个例子,比如说我是四川的用户就访问成都的节点或离四川比较近的节点。
3.春节人口迁徙,根据就近原则会导致某些节点压力很大,这时也会访问其他节点的。
------------------------------------- 学习不易,需要坚持----------------------------------------