一: 动静分离概述
-
动静分离是将网站的静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用的访问
-
静态资源部署在Nginx,将静态资源部署在Nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求,全部去请求nginx服务器,达到动静分离的目标
-
静态资源部署在CDN上,将项目中的JavaScript,CSS以及img文件都存放在CDN服务器上,将HTML文件一起存放到CDN上之后,可以将静态资源统一放置在一种服务器上,便于前端进行维护;而且用户在访问静态资源时,可以很好利用CDN的优点
-
后端API提供数据,后端应用提供API,根据前端的请求进行处理,并将处理结果通过JSON格式返回至前端。目前应用主要采用Java平台开发,因此应用服务器主要是Tomcat服务器,现在也开始有部分应用采用node进行开发,应用服务器也开始使用node服务器
-
前后端域名,动静分离因为静态资源和应用服务分别部署在不同的服务器上,因此会面临域名策略的选择。采用相同域名下,用户请求API时可以避免跨域所带来的问题,相对开发更为快速,工作量也相对小一些。前后端采用不同域名时,需要前后端开发时兼容跨域请求的情况,开发量相对上一种会稍多一些。解决跨域方式最常用的方式就是采用JSONP,还有一种解决方式使用CORS(HTTP访问控制)允许某些域名下的跨域请求
-
动静分离实现的优缺点
优点:API接口服务化;前后端开发并行;减轻后端服务器的压力,提高静态资源访问速度
缺点:不利于网站SEO(搜索引擎优化);开发量变大;在业务高速发展时需要慎重考虑
-
动静分离的适用场景
- 静态文件访问量大,服务器负载高,I/O问题导致用户访问卡顿
- 静态文件数量大,服务器存储空间不够
- 静态文件用户访问量大,且分布在各地
- 移动更新包在某个时间段需要高速下载,且并发下载量高
二: Nginx与Tomcat实现动静分离具体步骤
-
由于Tomcat本身处理静态效率不高,还会带来资源消耗,因此使用动静分离,将静态请求交由Nginx处理,动态请求交由Tomcat处理
-
Nginx根据客户端请求的url来判断请求的是否是静态资源,如果请求的url包含jpg、png,则由Nginx处理;如果请求的url是.php或者.jsp等,则被认为是动态的,将转发tomcat处理。即Nginx通过url来区分请求的类型,并且转发给不同的服务端
-
网络结构图
三: 操作过程
3.1: 实验环境
类型 | IP地址 | 系统 | 软件包 |
---|---|---|---|
Nginx服务器(代理端) | 192.168.100.140/24 | centos7 | nginx-1.12.2.tar.gz |
Tomcat服务器(web服务端) | 192.168.100.140/24 | centos7 | jdk-8u91-linux-x64.tar.gz; apache-tomcat-8.5.16.tar.gz |
client客户端 | 192.168.100.140/24 | centos7 |
3.2: 实验拓扑
3.3 : 配置过程
-
部署Nginx服务器
[root@nginx ~]# mount.cifs //192.168.1.150/qq-Download /mnt //远程挂载共享文件夹获取安装包 1.在官网获得nginx软件包,前面在nginx的模块解析中有提到,解压 cd /mnt tar -zxvf nginx-1.12.0.tar.gz -C /usr/local/ 2.安装相关软件包 systemctl stop firewalld.service setenforce 0 yum -y install pcre-devel zlib-devel gcc-c++ 3.添加nginx用户 useradd -M -s /sbin/nologin nginx 4.编译且安装nginx cd /usr/local/nginx-1.12.0 ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module make && make install 5.创建软链接便于控制服务 ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ nginx -t #验证语法格式 6.编辑脚本,使用service工具,控制服务 vim /etc/init.d/nginx #!/bin/bash # chkconfig: - 99 20 # description: Nginx Service Control Script PROG="/usr/local/nginx/sbin/nginx" PIDF="/usr/local/nginx/logs/nginx.pid" case "$1" in start) $PROG ;; stop) kill -s QUIT $(cat $PIDF) ;; restart) $0 stop $0 start ;; reload) kill -s HUP $(cat $PIDF) ;; *) echo "Usage: $0 {start|stop|restart|reload}" exit 1 esac exit 0 chmod +x /etc/init.d/nginx chkconfig --add nginx 7. 关闭安全性功能,开启nginx服务 service nginx start netstat -ntap | grep 80
-
部署Tomcat服务器
1.配置java环境,jdk的软件包可去官网下载,解压软件包 tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/ systemctl stop firewalld 2.配置环境变量 vim /etc/profile '添加' export JAVA_HOME=/usr/local/jdk1.8.0_91 //指定家目录 export JRE_HOME=${JAVA_HOME}/jre //java虚拟机 export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib //java函数库 export PATH=${JAVA_HOME}/bin:$PATH 4.使环境变量运行 source /etc/profile 5.解压tomcat软件包,同样软件包也可以在官网获得 tar zxvf apache-tomcat-8.5.16.tar.gz -C /usr/local 6.修改文件名,便于操作 cd /usr/local mv apache-tomcat-8.5.16/ tomcat 7.建立软链接,便于服务控制 ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/ ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/ 8.关闭安全性功能,开启服务 startup.sh netstat -ntap | grep 8080
-
配置Nginx服务器,进行动静分离,对于java文件的请求转发到tomcat处理
1.配置nginx.conf //在nginx服务器中操作编辑配置文件nginx.conf server { listen 80; server_name localhost; location ~.*.jsp$ { //正则表达式,即任何以.jsp结尾的url proxy_pass http://192.168.100.150:8080; //转到192.168.100.150:8080 proxy_set_header Host $host; } nginx -t 2.配置nginx的站点 //创建静态页面 vim /usr/local/nginx/html/index.html //全删,添加以下内容 <!DOCTYPE html> <html> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>静态页面</h1> <p>这是个静态页面</p> </body> </html> 3.重启服务 service nginx stop service nginx start
-
配置tomcat服务器,tomcat处理动态请求
1.创建tomcat的web目录 mkdir /usr/local/tomcat/webapps/test 2.在test中编辑,动态页面的站点 vim /usr/local/tomcat/webapps/test/index.jsp <!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.Date" %> <%@ page import="java.text.SimpleDateFormat" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>动态页面</title> </head> <body> <div>动态页面</div> </body> </html> 3.测试 //访问静态 http://192.168.100.140 //访问动态 http://192.168.100.140/test/index.jsp 测试nginx接受动态请求是否交给后端tomcat 192.168.100.150去处理
-
当动态JSP交给Tomcat处理,jsp文件包含静态图片,怎么去请求Nginx处理静态图片?
//Tomcat服务操作 1.在tomcat服务器的动态站点上,添加静态图片 vim /usr/local/tomcat/webapps/test/index.jsp <body> <div>动态页面</div> <img src="game.jpg"/> //添加页面图片 </body> //nginx服务操作 2.在nginx服务器上,存放图片,而且图片的目录名称要和tomcat中的java项目名称相同 vim /usr/local/nginx/conf/nginx.conf location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ { root html; expires 30d; } (Tomcat指路径,nginx放图片) [root@tomcat01 test]# pwd /usr/local/tomcat/webapps/test [root@tomcat01 test]# ls index.jsp [root@nginx test]# ls game.jpg [root@nginx test]# pwd /usr/local/nginx/html/test 注意:目录名称需要和java项目名称相同 mkdir /usr/local/nginx/html/test cp /mnt/game.jpg /usr/local/nginx/html/test 3.重启nginx,测试动静分离页面 service nginx restart http://192.168.100.140/test/index.jsp