news 2026/5/1 6:58:26

Nginx 反向代理+负载均衡+动静分离整合 Tomcat

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx 反向代理+负载均衡+动静分离整合 Tomcat

一、环境准备

1. 服务器准备

角色IP地址端口核心功能
Nginx192.168.81.13380反向代理、负载均衡、静态资源处理
Tomcat节点1192.168.81.1348080处理动态请求(JSP/Servlet)
Tomcat节点2192.168.81.1358081处理动态请求(JSP/Servlet)
静态资源存储192.168.81.133-存放HTML、图片、CSS等静态文件

2. 临时关闭防火墙和selinux

# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0

二、部署Nginx(编译安装)

1. 安装编译依赖包

  • pcre用于正则匹配,zlib用于Gzip压缩,openssl用于SSL加密
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

2.创建Nginx用户

  • Nginx专用用户,无登录权限,仅用于运行nginx进程,提升安全性
useradd -M -s /sbin/nologin nginx

3.下载并解压源码包

# 下载 cd /opt wget https://nginx.org/download/nginx-1.20.2.tar.gz # 解压 tar zxvf nginx-1.20.2.tar.gz -C /opt/

4. 配置编译参数

cd /opt/nginx-1.20.2 # 配置 ./configure --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-file-aio \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_flv_module \ --with-http_ssl_module \ --with-stream # 编译并安装 make && make install

5. 创建Nginx系统服务,支持systemctl命令管理

vim /lib/systemd/system/nginx.service # 添加系统服务配置 [Unit] Description=nginx After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target

6. 设置权限并启动nginx

chmod 777 /lib/systemd/system/nginx.service # 重新加载系统服务配置 systemctl daemon-reload systemctl start nginx.service systemctl enable nginx.service

三、配置Nginx(反向代理+负载均衡+动静分离)

编辑/usr/local/nginx/conf/nginx.conf,实现“反向代理+负载均衡+动静分离”一体化配置:

user nginx; # 注意这里,对后面的权限很关键。 ... http { include mime.types; default_type application/octet-stream; # 1. 定义Tomcat集群(加权轮询+故障转移+备份节点) upstream tomcat_cluster { server 192.168.81.134:8080 weight=1 max_fails=3 fail_timeout=30s; server 192.168.81.135:8081 weight=2 max_fails=3 fail_timeout=30s; server 192.168.81.136:8080 backup; # 备份节点 } # 2. Nginx服务配置 server { listen 80; server_name 192.168.81.133; charset utf-8; gzip on; # 启用Gzip压缩 # 默认nginx访问页面(这里我把index.html文件移到了/data/www/static目录下) location / { root /data/www/static; # 告诉 Nginx,找不到后缀的文件也来这里找 index index.html index.htm; # 告诉 Nginx,如果只访问 IP,默认打开 index.html } # 3. 静态图片单独配置(缓存10天) location ~ \.(jpg|png|jpeg)$ { root /data/www/static/img; expires 10d; access_log off; } # 4. 动静分离:静态资源本地处理 location ~ \.(html|htm|gif|jpg|jpeg|css|js|bmp|swf)$ { root /data/www/static; # 静态资源目录 expires 30d; # 缓存30天 access_log off; # 关闭日志 } # 5. 反向代理+负载均衡:动态请求转发 location ~ \.(jsp|do|action)$ { proxy_pass http://tomcat_cluster; # 指向Tomcat集群 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 30s; # 连接超时时间 proxy_read_timeout 60s; # 读取超时时间 } } }

补充:这里的只显示了主要的功能配置,有一些默认的配置(比如,nginx的默认访问页面)需要自行调整。若报错,仔细思考配置文件里的内容,当你找出问题所在,相信你会对nginx的配置理解更上一层。

四、Tomcat 应用部署

1. 安装JDK

# 下载 cd /opt wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz # 解压 tar zxvf jdk-8u202-linux-x64.tar.gz -C /usr/local/

2. 配置环境变量

vim /etc/profile # 环境变量 export JAVA_HOME=/usr/local/jdk1.8.0_202 # JDK安装目录 export JRE_HOME=${JAVA_HOME}/jre # JRE目录 export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib # 类路径,指定JVM查找类文件的路径 export PATH=${JAVA_HOME}/bin:$PATH # 将JDK二进制目录加入系统PATH,全局可用Java命令 # 生效 source /etc/profile # 验证 java -version

3. 安装并启动 Tomcat

# 下载 cd /opt wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.75/bin/apache-tomcat-9.0.75.tar.gz # 解压 tar zxvf apache-tomcat-9.0.75.tar.gz -C /usr/local/ # 为了方便操作,修改一下名字 mv apache-tomcat-9.0.75 tomcat9 # 启动tomcat cd /usr/local/tomcat9/bin ./startup.sh # 验证是否启动成功 ps -ef | grep tomcat # 查看进程 # 查看端口监听 netstat -tunlp | grep 8080

  • 补充:如果要停止tomcat,使用命令./shutdown.sh

另外一个Tomcat节点同理。

4.Tomcat 应用部署

  • 在两台Tomcat的/usr/local/tomcat/webapps/ROOT目录下,分别创建测试JSP页面,验证负载均衡:

Tomcat节点1(192.168.81.134:8080)

cd /usr/local/tomcat9/webapps/ROOT # 备份默认页面 mv index.jsp index.jsp.bak

添加测试内容:

vim index.jsp # 添加以下内容 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head><title>JSP Test1 Page</title></head> <body> <% out.println("动态页面 1 - Tomcat Node1: 192.168.81.134:8080"); %> </body> </html>

重启Tomcat节点1:

/usr/local/tomcat9/bin/shutdown.sh /usr/local/tomcat9/bin/startup.sh

Tomcat节点2(192.168.81.135:8081)

cd /usr/local/tomcat/webapps/ROOT # 备份默认页面 mv index.jsp index.jsp.bak

添加测试内容:

vim index.jsp # 添加以下内容 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head><title>JSP Test2 Page</title></head> <body> <% out.println("动态页面 2 - Tomcat Node1: 192.168.81.135:8081"); %> </body> </html>

修改端点8080 -> 8081:

cd /uar/local/tomcat9/conf/server.xml

重启Tomcat节点2:

/usr/local/tomcat9/bin/shutdown.sh /usr/local/tomcat9/bin/startup.sh

五、测试验证

1. 静态页面访问

  • 浏览器输入http://192.168.81.133,显示静态页面内容
  • 命令行curl -I http://192.168.81.133,返回200状态码,说明静态资源处理正常。

2. 静态图片访问

前提:已经在/data/www/static/img目录下存放了图片 test.jpg,然后给文件增加权限chmod 644 /data/www/static/img/test.jpg

  • 浏览器访问http://192.168.81.133/test.jpg

深度验证:为了证明这张图是Nginx 直接给你的,而不是转发给 Tomcat 找的,我们需要看HTTP 响应头(Response Headers)

  1. 在浏览器按F12打开开发者工具,切换到Network(网络)标签。

  2. 刷新页面,点击test.jpg请求。

  3. 查看右侧的Headers

    • Server: 应该显示nginx/1.xx.x

    • Cache-Control / Expires: 应该显示你配置的max-age=864000(即 10 天),这证明expires 10d生效了。

    • X-Real-IP / X-Forwarded-For: 如果你在响应头里能看到这些,说明请求还在 Nginx 层。

查看nginx的访问日志(Access Log):

  • 由于nginx.conf文件中设置了静态缓存关闭了日志,所以这一步需要修改配置文件打开日志。
tail -f /usr/local/nginx/logs/access.log

3. 反向代理与负载均衡验证

  • 多次刷新http://192.168.81.133,内容按权重1:2显示。

  • 查看Tomcat访问日志(/usr/local/tomcat/logs/localhost_access_log.*.txt),可看到日志中记录的是用户真实IP(而非Nginx服务器IP),说明X-Real-IP配置生效。

这里没有显示用户真实IP,除了配置nginx,还需要配置tomcat的日志格式

vim /usr/local/tomcat9/conf/server.xml # 修改以下内容 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%{X-Real-IP}i %l %u %t &quot;%r&quot; %s %b" />

重启tomcat;重新查看日志

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:53:31

中小团队如何利用Taotoken统一管理多个项目的API密钥与访问权限

中小团队如何利用Taotoken统一管理多个项目的API密钥与访问权限 1. 多项目密钥管理的核心挑战 在中小型技术团队同时推进多个AI应用项目时&#xff0c;API密钥管理往往面临三个典型问题。首先是密钥分散导致的安全隐患&#xff0c;开发者可能将密钥硬编码在项目代码或配置文件…

作者头像 李华
网站建设 2026/5/1 6:52:52

【Cursor 工程rules实际感悟】

Cursor 工程规则分享&#xff1a;.cursor/rules 全览与实践感悟 适用读者&#xff1a;使用 Cursor / Copilot 类工具做真实业务研发、希望用「可重复的规则」约束 AI 行为的开发者。 说明&#xff1a;下文规则正文来自本仓库 .cursor/rules/*.mdc&#xff0c;为便于离线阅读与转…

作者头像 李华
网站建设 2026/5/1 6:51:14

YOLO11语义分割注意力机制改进:全网首发--使用MultiSEAM多分支增强注意力提升分割头多尺度表达(方案1)

1. 工程简介 🚀 本工程基于 Ultralytics 框架扩展,面向语义分割与 YOLO 系列模型改进实验。核心优势不是只支持单一模型,而是支持通过切换 yaml 配置文件,快速完成不同网络结构的训练、验证与对比实验。 当前已支持的主要模型家族 🧩 语义分割模型:UNet、UNet++、Dee…

作者头像 李华
网站建设 2026/5/1 6:50:32

分布式系统中 Map 增量(Delta)是否需要持久化

以 Ceph OSDMap 为例&#xff0c;结合自研分布式文件系统的设计决策一、背景&#xff1a;什么是 Map 增量 在分布式系统中&#xff0c;通常有一个"集群拓扑视图"&#xff08;Map&#xff09;&#xff0c;比如&#xff1a; Ceph 的 OSDMap&#xff1a;描述每个 OSD 的…

作者头像 李华