文章目录
- 一.动静分离的原理及架构
- 1.1 动静分离是什么?
- 1.2 动静分离的原理
- 1.3 动静分离的架构组成
- 二.Nginx+Tomcat实现动静分离
- 2.1实验环境
- 2.2所需软件环境
- 2.3nginx服务的实现
- 2.4配置动静分离
一.动静分离的原理及架构
1.1 动静分离是什么?
动静分离(Separation of Concerns)是一种常见的Web架构设计模式,通过将动态内容(如Java应用程序、PHP脚本等)和静态内容(如HTML文件、图片、CSS、JavaScript等)分开处理,可以提高网站的性能和可伸缩性。在实现动静分离时,通常会使用Nginx作为反向代理服务器,将请求分发到不同的后端服务器上。
1.2 动静分离的原理
- 服务端接收来自客户端的请求中。既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源Nginx转发至后端。
原理图如下:
1.3 动静分离的架构组成
- Nginx 很少处理动态页面,说起来,它其实是一个基于多路复用模型构建的产品,常用来高性能HTTP和反向代理服务器,在运行的过程汇总占用较低的内存,可以支持更多的并发连接。
- nginx处理静态资源是tomcat的6倍
- Tomcat是一个Jsp/Servlet容器服务器,在最新的Tomcat版本中,支持epoll模型,如果要处理动态应用,比如java的动态应用,肯定是首选,但Tomcat处理静态请求能力就比较弱。
所以 Nginx与Tomcat的整合正好结合了两者的优点,在企业级生产环境应用中,这种组合去实现动静分离也非常常见。
二.Nginx+Tomcat实现动静分离
2.1实验环境
本次实验所用版本介绍:
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
2.2所需软件环境
[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
2.3nginx服务的实现
10.0.0.103为nginx服务器,本文采用yum安装的方式
nginx的其它安装方法可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128107565
- 安装nginx
[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运行进程
2.4配置动静分离
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
<html>
<body><h1>这是a rookie的页面</h1><img src="a rookie.jpg"/>
</body>
</html>
[root@mufeng101 static]# ls #a rookie.jpg图片通过xshell工具从windows本机上传至static目录
mufeng.png 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配置文件
- upstream模块用于设置后端服务器的服务池和负载均衡策略,以提供响应数据。
- location模块用于设置正则表达式对用户发起的URL进行匹配,也就是实现动静分离的功能
更多nginx配置文件模块可参考这篇博文:https://blog.csdn.net/zhanghongshun624/article/details/128212937
[root@nginx ~]# vim /etc/nginx/nginx.confupstream tomcatserver { #制定负载均衡器名字为tomcatserverserver 10.0.0.102:8080 weight=1; #通过8080提供web服务,配置权重(默认轮询)server 10.0.0.104:8080 weight=1; #通过8080提供web服务,配置权重(默认轮询)}server {listen 80; #监听端口80server_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动静分离