一.动静分离概述
动静分离是将网站的静态资源(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来区分请求的类型,并且转发给不同的服务端
实验环境
角色 | IP地址 | 系统 | 软件包 |
Nginx服务器(代理端) | 192.168.179.225 | centos7 | nginx-1.12.2.tar.gz |
Tomcat服务器(web服务端) | 192.168.179.132 | centos7 | jdk-8u231-linux-x64.tar.gz apache-tomcat-8.5.50.tar.gz |
client客户端 | 192.168.179.132 | centos7 |
1.安装Nginx服务
//解压缩包
tar zxvf nginx-1.12.2.tar.gz -C /opt
//创建用户
useradd -M -s /sbin/nologin nginx
//安装环境依赖包
yum install gcc gcc-c++ pcre pcre-devel zlib-devel -y
//配置
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
//创建软连接,便于管理服务命令
ln -s /usr/local/nginx/sbin/* /usr/local/sbin
//便于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);;
*)
exit 1
esac
exit 0
//添加执行权限
chmod +x /etc/init.d/nginx
//添加为系统服务
chkconfig --add nginx
//启动服务
service nginx start
//验证服务
netstat -ntap | grep nginx
2.安装Tomcat服务
tar zxvf jdk-8u91-linux-x64.tar.gz -C /opt/
cd /opt/
//更改环境变量
mv /opt/jdk1.8.0_91/ /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
//解压缩包
tar zxvf apache-tomcat-8.5.16.tar.gz -C /usr/local/
//重命名
cd /usr/local/
mv apache-tomcat-8.5.16/ tomcat/
//便于系统识别命令
ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/
//启动服务
startup.sh
//验证服务开启
netstat -ntap | grep 8080
3.配置Nginx服务器,进行动静分离,对于java文件的请求转发到tomcat处理
/在Nginx服务器中操作编辑配置文件nginx.conf
ln -s /usr/local/nginx/conf/nginx.conf /etc/
vim /etc/nginx.conf
server {
省略内容
location ~.*.jsp$ {
proxy_pass http://192.168.179.132:8080;
proxy_set_header Host $host;
}
}
//创建静态页面
vim /usr/local/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>静态页面</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>静态页面</h1>
<p><em>这个是静态页面</em></p>
</body>
</html>
//重启服务
service nginx stop
service nginx start
4.配置Tomcat服务
mkdir /usr/local/tomcat/webapps/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>
5.把静态资源放到nginx服务器上,当访问动态页面时,调用静态资源
//Tomcat服务操作
vim /ust/local/tomcat/webapps/test/index. jsp
<body>
<div>动态页面</div><br><img src="game. jpg"> //添加页面图片
</body>
//nginx服务操作
vim /usr/local/nginx/conf/nginx.conf
location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
root html;
expires 30d;
}
(Tomcat 指路径,nginx放图片)
注意:目录名称需要和java项目名称相同
mkdir /usr/local/nginx/html/test
cp /pic/LAMP/game. jpg /usr/local/nginx/html/test
http://192.168.179.225/test/index.jsp