Nginx+Tomcat负载均衡
目录
一,了解什么是Tomcat
1,核心功能
2,应用场景
3,tomcat处理静态文件
4,tomcat处理动态文件
二,了解nginx的动静分离
1,静态资源处理流程
2,动态资源处理流程
3,动静分离的优势
三,部署nginx+tomcat负载均衡
1,准备工作
2,准备tomcat网站
3,修改nginx的配置文件
3,修改tomcat的配置文件
4,验证
5,在日志中显示真实客户端地址
一,了解什么是Tomcat
Apache Tomcat(简称 Tomcat)是一个开源的 Servlet 容器,用于运行 Java Web 应用程序。Tomcat 是 Java 生态中最流行的 Web 容器之一,适合快速部署 Java Web 应用,尤其在开发环境和中小型项目中广泛使用。通过合理配置和优化,也可满足高并发场景需求。
配置文件
<Connector port="8080" protocol="HTTP/1.1" />
<Host name="localhost" appBase="webapps" /> ##可以在此部分添加多个页面内容节点
格式如下:
<Context docBase="网站路径位置" path="" reloadable="false">
</Context>
- server.xml:主配置文件,定义 Connector、Engine、Host 等组件。
- web.xml:全局 Web 应用配置,定义 Servlet、过滤器、会话等默认行为。
- context.xml:Web 应用上下文配置,控制资源加载、安全约束等。
1,核心功能
- servlet容器:支持java servlet,jsp和WebSocket标准,是运行java Web应用的基础环境
- HTTP服务器:内置 HTTP 服务器,可直接处理 Web 请求,但性能通常不如专业服务器(如 Nginx、Apache HTTP Server),因此生产环境常与反向代理配合使用
- 轻量级:相比企业级应用服务器,Tomcat 更轻量、启动快,适合中小型应用和开发环境。
2,应用场景
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML页面的 功能,然而由于其处理静态 HTML的能力远不及 Apache 或者Nginx,所以 Tomcat 通常是作 为一个 Servlet 和 JSP 容器,单独运行在后端,
3,tomcat处理静态文件
Tomcat 可以直接处理 HTML、CSS、JavaScript、图片等静态文件,但存在性能瓶颈,当请求静态文件时,Tomcat 会从 webapps/应用名/
目录下查找并返回,
<Host name="localhost" appBase="webapps">
<Context path="" docBase="app" /> </Host> ##可以将新的节点写在当前部分后
4,tomcat处理动态文件
Tomcat 的核心优势在于处理动态资源
处理流程:
- 客户端请求 → Connector(如 HTTP/1.1)接收请求。
- 请求被转发到 Servlet 容器(Catalina)。
- Catalina 调用对应的 Servlet/JSP 处理请求。
- 动态生成响应内容(如 HTML、JSON)返回客户端。
二,了解nginx的动静分离
Nginx 动静分离是一种将动态资源请求和静态资源请求分开处理的架构设计,目的是提升网站性能、减轻应用服务器负担并优化资源利用。
- 静态资源:HTML、CSS、JavaScript、图片、视频、字体等不需服务器动态生成的文件
- 动态资源:需要后端程序(如 PHP、Java、Python)实时计算的内容(如 API 响应、用户个性化页面)
为什么需要动静分离?
- 静态资源访问频率高、变化少,适合缓存和 CDN 加速
- 动态资源依赖数据库和业务逻辑,需更多计算资源
- 分离后可针对不同资源特性优化,提升整体性能
1,静态资源处理流程
nginx动静分离的核心是通过URL规则匹配将请求分发到不同的处理路径
客户端请求 → Nginx → 直接返回静态文件(或从缓存读取)
配置关键点
使用localtion快匹配静态资源路径(例如:*.jpg *.css)
设置root或者alias指定静态文件存放目录
配置长缓存策略(通过expires指令)
2,动态资源处理流程
客户端请求 → Nginx → 转发至后端应用服务器 → 处理后返回结果
配置关键点
使用proxy_pass指令将动态请求转发至后端服务器(如 Tomcat、PHP-FPM)
配置连接超时、缓冲区大小等代理参数
可设置负载均衡策略处理多台应用服务器
3,动静分离的优势
- 性能提升:静态资源直接由 Nginx 返回,减少后端服务器压力,浏览器缓存和 CDN 加速可大幅减少响应时间
- 资源优化:应用服务器专注处理动态逻辑,资源利用更高效,静态资源可部署在廉价存储或对象存储
- 可扩展性增强:静态资源可通过 CDN 全球分发,提升用户访问速度,动态服务可独立横向扩展(增加应用服务器)
- 高可用性:静态资源可本地多副本或 CDN 冗余存储,应用服务器集群化部署,避免单点故障
三,部署nginx+tomcat负载均衡
1,准备工作
tomcat1服务器 | 192.168.10.104 |
tomcat2服务器 | 192.168.10.106 |
nginx服务器 | 192.168.10.102 |
2,准备tomcat网站
##两台tomcat服务器配置一致
[root@localhost /]# mkdir -p /web/webapp1
[root@localhost webapp1]# ls
index.jsp##第一台tomcat服务器
[root@localhost webapp1]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>JSP test2 page</title> </head><body><% out.println("动态页面 1,http://www.test2.com");%></body> <body> <div>动态页面的图片 1</div><br><img src="logo.png"> </body>
</html>##第二台tomcat服务器
[root@localhost webapp1]# cat index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>JSP test2 page</title> </head><body><% out.println("动态页面 2,http://www.test2.com");%></body> <body> <div>动态页面的图片 2</div><br><img src="logo.png"> ##为了方便验证两台服务器页面可以不一致</body>
</html>
3,修改nginx的配置文件
[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf
##这个要写在http部分upstream web {server 192.168.10.104:8080 weight=1;server 192.168.10.106:8080 weight=2;}##新添加的localtion部分
location ~ .*\.jsp$ {proxy_set_header HOST $host; proxy_pass http://web;
}##检查配置文件是否有误
[root@nginx /]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful##重载nginx服务
[root@nginx /]# nginx -s reload
3,修改tomcat的配置文件
##两台服务器都要配置
[root@localhost /]# vim /usr/local/tomcat/conf/server.xml
<Context docBase="/web/webapp1" path="" reloadable="false"> ##在150行添加</Context>docBase ##指定网页的路径
path="" ##定义 Web 应用的访问路径(上下文路径)
reloadabel ##控制 Tomcat 是否自动检测应用文件的修改并重新加载应用
false(默认值) ##不自动重新加载,修改文件后需手动重启 Tomcat 或应用。
true ##开启自动重新加载##重启两台服务器,使配置文件生效
[root@localhost /]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost /]# /usr/local/tomcat/bin/startup.sh
4,验证
如果想要添加图片可以修改nginx的配置文件并指定要添加的图片
[root@nginx /]# vim /usr/local/nginx/conf/nginx.conf
location ~ .*\.(gif|jsp|bmp|png)$ { ##添加新的localtion部分root /usr/local/nginx/html/img;expires 30d;}(gif|jsp|bmp|png) ##指定图片的后缀root /usr/local/nginx/html/img; ##图片存放的目录在/usr/local/nginx/html/img下expires 30d; ##图片的缓存存放时间30d表示30天
5,在日志中显示真实客户端地址
##修改nginx的配置文件location ~ .*\.jsp$ {proxy_set_header HOST $host;proxy_set_header Client-IP $remote_addr; ##添加三行proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://web;}proxy_set_header Client-IP $remote_addr; ##把客户端的真实 IP 地址(即$remote_addr变量的值)添加到请求头的Client-IP字段里。proxy_set_header X-Real-IP $remote_addr; ##将客户端的真实 IP 地址存入X-Real-IP请求头。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##$proxy_add_x_forwarded_for是一个特殊变量,它会把客户端的 IP 地址追加到原请求头的X-Forwarded-For字段中。若原请求头中没有X-Forwarded-For,就会直接设置为$remote_addr。
当我们访问页面时,可以在nginx服务器通过日志查看真实客户端的ip
[root@nginx logs]# pwd
/usr/local/nginx/logs
[root@nginx logs]# cat access.log
192.168.10.1 - - [29/Apr/2025:11:43:52 +0800] "GET /logo.png HTTP/1.1" 304 0 "http://192.168.10.102/index.jsp" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0"
还可以配置以下设置让真实客户端ip在tomcat中显示
[root@localhost /]# vim /usr/local/tomcat/conf/server.xml
pattern="%{X-Real-IP}i %h %l %u %t "%r" %s %b" /> ##164行修改
%{}i ##表示从 HTTP 请求头中提取指定字段的值
X-Real-IP ##这是一个 自定义请求头,通常由反向代理服务器(如 Nginx)设置,用于传递客户端的真实 IP 地址##重载生效
[root@localhost /]# /usr/local/tomcat/bin/shutdown.sh
[root@localhost /]# /usr/local/tomcat/bin/startup.sh
通过tomcat日志查看客户端IP地址
[root@localhost /]# cat /usr/local/tomcat/logs/localhost_access_log.2025-06-03.txt
192.168.10.1 192.168.10.102 - - [03/Jun/2025:11:18:18 +0800] "GET /index.jsp HTTP/1.0" 200 240
192.168.10.1 192.168.10.102 - - [03/Jun/2025:11:18:19 +0800] "GET /index.jsp HTTP/1.0" 200 240192.168.10.1代表真实客户端的ip地址
192.168.10.102代表nginx调度器的ip地址