动静分离(Separation of Concerns)是一种常见的Web架构设计模式,通过将动态内容(如Java应用程序、PHP脚本等)和静态内容(如HTML文件、图片、CSS、JavaScript等)分开处理,可以提高网站的性能和可伸缩性。在实现动静分离时,通常会使用Nginx作为反向代理服务器,将请求分发到不同的后端服务器上。
原理图如下:
所以 Nginx与Tomcat的整合正好结合了两者的优点,在企业级生产环境应用中,这种组合去实现动静分离也非常常见。
本次实验所用版本介绍:
CentOS7.9,jdk-11.0.22,nginx-1.20.1,tomcat-10.1.19
本次实验所用主机:
hostname ip port
nginx 10.0.0.103. 80
tomcat1 10.0.0.102 8080
tomcat2 10.0.0.104 8080
[root@tomcat1 ~]# java -version #检查java版本
openjdk version "11.0.22" 2024-01-16 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.22.0.7-1.el7_9) (build 11.0.22+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.22.0.7-1.el7_9) (build 11.0.22+7-LTS, mixed mode,
sharing)
systemctl stop firewalld.service #停止防火墙服务
systemctl disable firewalld.service #关闭防火墙服务
setenforce 0 #设置selinux模式为不可用
关于jdk的安装可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128245144
注意: 在tomcat1和tomcat2两台服务器都需要安装jdk和tomcat
10.0.0.103为nginx服务器,本文采用yum安装的方式
nginx的其它安装方法可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128107565
[root@nginx ~]# yum install -y nginx
[root@nginx ~]# systemctl daemon-reload
[root@nginx ~]# systemctl start nginx.service #启动nginx
[root@nginx ~]# systemctl enable nginx.service #设置nginx开机启动
[root@nginx ~]# ps -ef|grep nginx #检查nginx运行进程
nginx服务器设置静态页面:
1.在Ngnix服务器后台创建用于静态页面目录static,并在其中添加静态测试页面:
[root@nginx ~]# mkdir /usr/local/nginx/html/static
[root@nginx ~]# cd /usr/local/nginx/html/static
[root@nginx static]# vim test.html
这是a rookie的页面
"a rookie.jpg"/>
[root@nginx static]# ls #a rookie.jpg图片通过xshell工具从windows本机上传至static目录
a rookie.jpg test.html
2.在tomcat1、tomcat2服务器上分别创建动态目录test,在目录中各自创建一个动态页面:
mkdir -p /usr/local/tomcat/webapps/test/
[root@tomcat1 ~]# vim /usr/local/tomcat/webapps/test/index.jsp #编辑动态jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("这是第一个页面");%>
</body>
</html>
[root@tomcat2 ~]# vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("这是第二个页面");%>
</body>
</html>
修改server.xml文件中的Context和appBase
[root@tomcat1 ~]# vim /usr/local/tomcat/apache-tomcat-10.1.19/conf/server.xml
[root@tomcat2 ~]# vim /usr/local/tomcat/apache-tomcat-10.1.19/conf/server.xml
3.配置nginx配置文件
更多nginx配置文件模块可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128212937
[root@nginx ~]# vim /etc/nginx/nginx.conf
upstream tomcatserver { #制定负载均衡器名字为tomcatserver
server 10.0.0.102:8080 weight=1; #通过8080提供web服务,配置权重(默认轮询)
server 10.0.0.104:8080 weight=1; #通过8080提供web服务,配置权重(默认轮询)
}
server {
listen 80; #监听端口80
server_name localhost; #默认本机地址
charset 'utf-8'; #使用utf-8字符集
location ~* .*\.jsp$ { #正则表达式匹配动态页面
proxy_pass http://tomcatserver; #反向代理服务域名
proxy_redirect off; #当上游服务器返回响应式重定向或者刷新时
proxy_set_header Host $host; #设置由后端服务器获取用户主机名、真实IP地址以及代理者的真实IP地址
proxy_set_header X-Real-IP $remote_addr; #只添加客户端IP到请求报文头部,转发至后端服务器
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #添加客户端IP和反向代理服务器IP到请求报文头部
}
location ~ .*\.(jpg|jpeg|png|htm|html|css)$ { #正则表达式匹配静态文件
root /usr/local/nginx/html/static/; #指定静态文件
expires 1d; #指定1天的延期时间
}
}
4.重启服务
[root@tomcat1/2 bin]# /usr/local/tomcat/bin/shutdown.sh #停止tomcat进程
[root@tomcat1/2 bin]# /usr/local/tomcat/bin/startup.sh #重启tomcat进程
[root@nginx ~]# systemctl restart nginx
5.访问测试
首先验证静态页面,用户只需要访问Nginx服务器地址,两台Tomcat服务器对用户是透明的,在浏览器输入访问地址http://10.0.0.103/test.html,发现静态页面已经由Nginx服务器提供静态解析并反馈浏览器显示如下:
验证动态页面,在浏览器输入访问地址http://10.0.0.103/index.jsp,发现动态页面已经由Nginx服务器提供动态解析,并且随着用户对页面的访问刷新,按照轮询负载均衡策略,交替显示“第一个页面”与“第二个页面”,如下所示:
以上就是本篇的全部内容,实现了Nginx+Tomcat动静分离