动静分离 + 负载均衡:Nginx 与 Tomcat 深度整合实战

一、Nginx 核心功能

1. 核心角色

Nginx 兼具 Web 服务器、反向代理服务器和负载均衡(LB)功能,是实现 "动静分离" 架构的核心中间件。

2. 动静分离工作流程

接收用户 URL 请求后,Nginx 先区分资源类型。

静态资源(html、png、css 等):Nginx 直接读取本地文件并返回给用户。

动态资源(jsp、php 等):Nginx 转发给后端服务器(如 Tomcat)处理,后端处理完成后通过 Nginx 响应给用户。

3. 负载均衡作用

Nginx 会将动态请求均衡分发到多个后端服务器,避免单台服务器负载过高,提升系统可用性。

二、Nginx location 配置

1. 匹配类型与修饰符

匹配类型 修饰符 说明
精准匹配 = 普通字符完全匹配,优先级最高
前缀匹配 ^~ 普通字符前缀匹配,成功后不再匹配其他正则
正则匹配 ~ 区分大小写的正则匹配
正则匹配 ~* 不区分大小写的正则匹配
取非匹配 !~ 区分大小写的正则取非
取非匹配 !~* 不区分大小写的正则取非
一般匹配 前缀匹配,遵循最长前缀原则
通用匹配 / 匹配所有未被其他规则匹配的请求,优先级最低

2. 优先级顺序

  1. 精准匹配(=)

  2. 前缀匹配(^~)

  3. 正则匹配(~ 或~*,按配置文件顺序)

  4. 不带修饰符的一般前缀匹配

  5. 通用匹配(/)

3. 经典示例

精准匹配:location = / { ... } 仅匹配根路径 /,不匹配 /data 等子路径。

正则匹配:location ~* \.(gif|jpg|jpeg)$ { ... } 匹配所有图片格式请求。

优先级验证:location ^~ /images/ { ... } 优先级高于图片正则匹配,访问 /images/example.jpg 会触发前缀匹配规则。

三、Nginx 常用功能配置

1. URL 重写(rewrite)

核心作用是重写用户访问的 URL 路径,常见场景为域名跳转。

需求:旧域名 www.xy101.com 跳转到新域名 www.xy102.com 并保留参数。

配置示例:在 server 块中添加

rewrite /(.*)$ ``http://www.xy102.com/$1`` permanent;

permanent 表示永久重定向。

2. 反向代理与负载均衡配置

定义后端服务器集群:通过 upstream 模块配置,weight 参数指定权重(权重越高,被分配概率越大)。

配置示例:

复制代码
upstream tomcatserver {
   server 192.168.10.137:8080 weight=1;
   server 192.168.10.130:8080 weight=1;
   server 192.168.10.130:8081 weight=1;
}

动态请求转发:通过 location ~ .*\.jsp$ { proxy_pass http://tomcatserver; } 将 JSP 请求转发到后端 Tomcat 集群。

3. 静态资源配置

指定静态资源目录:location ~ .*\.(gif|jpg|jpeg|png|css)$ { root /usr/local/nginx/html/img; expires 10d; }

expires 10d 表示设置资源缓存有效期为 10 天,提升访问速度。

四、Tomcat 核心知识

1. 本质与核心职责

Tomcat 是轻量级 Web 应用服务器,核心是 Servlet 容器,主要职责包括:

接收 HTTP 请求(内置简单 HTTP 服务器)。

按 URL 映射分发请求到对应 Web 应用。

执行 Servlet/JSP 并生成响应,返回给客户端。

支持 Servlet、JSP、Spring MVC、Spring Boot(war 部署)等 Java 应用。

2. 核心工作流程

  1. 启动:加载 server.xml 配置,初始化 Connector、Service、Engine 等组件,创建 Servlet 容器。

  2. 接收请求:Connector 监听端口(如 8080),封装请求为 Request 对象。

  3. 请求分发:Mapper 通过 URL 找到对应 Web 应用(Context)和 Servlet(Wrapper)。

  4. 执行 Servlet:调用 Servlet 的 service () 方法,处理业务逻辑并返回 Response 对象。

  5. 响应客户端:将 Response 转换为 HTTP 报文,通过 Socket 返回给浏览器。

3. 核心配置文件

配置文件 作用
conf/server.xml 主配置文件,定义端口、协议、Engine、Host 等核心组件
conf/web.xml 全局 Web 应用默认配置(如 MIME 映射、默认 Servlet)
context.xml Web 应用级配置(如数据源、Session 配置)
tomcat-users.xml 用户、角色及安全配置,用于管理后台登录
应用内 WEB-INF/web.xml 单个 Web 应用的 Servlet、Filter、Listener 配置

五、Nginx + Tomcat 部署实战

1. 部署计划

Nginx 服务器:192.168.10.137:80(处理静态请求、反向代理与负载均衡)。

Tomcat 服务器 1:192.168.10.130:8080(动态应用 1)。

Tomcat 服务器 2:192.168.10.130:8081(动态应用 2,避免端口冲突)。

2. 部署步骤

  1. 环境准备:关闭防火墙(systemctl stop firewalld),禁用 SELinux(setenforce 0)。

    复制代码
    systemctl stop firewalld
    setenforce 0
  2. 安装 JDK:配置 JAVA_HOME 等环境变量,通过 java -version 验证。

    复制代码
    首先下载 然后再 上传 并且解压(解压完之后配置环境变量即可)
    tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
    
    vim /etc/profile 这是配置JDK 现在系统基本自带openJDK
    
    在最后面加入
    export JAVA_HOME=/usr/local1/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 #刷新

验证开发环境是否安装成功
java -version
  1. 安装 Tomcat:解压安装包,测试是否安装成功。

    复制代码
    #先下载安装包 然后再 上传
    tar zxvf apache-tomcat-8.5.16.tar.gz
    
    #修改服务名字
    mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
    
    #启动tomcat
    /usr/local/tomcat/bin/shutdown.sh # 关闭
    /usr/local/tomcat/bin/startup.sh # 启动
    
    #查看端口
    netstat -ntap | grep 8080
  2. 部署负载均衡和反向代理:在两台 Tomcat 中创建测试 JSP 页面,配置 Context 指向应用目录。

    规划部署负载均衡和反向代理服务器

    复制代码
    Nginx 服务器:192.168.10.137:80
    Tomcat服务器1:192.168.10.130:8080
    Tomcat服务器2:192.168.10.130:8081
    
    部署Nginx服务器负载均衡
    systemctl start nginx.service
    systemctl enable nginx.servic
    
    部署后端2台Tomcat应用服务器
    
    /usr/local/tomcat/bin/shutdown.sh
    /usr/local/tomcat/bin/startup.sh
    netstat -ntap | grep 8080
    
    第二台直接复制
    cp -r /usr/local/tomcat /usr/local/tomcat1

    动静分离配置

    复制代码
    第一台Tomcat server配置
    
    创建页面
    mkdir /usr/local/tomcat/webapps/test
    
    vim /usr/local/tomcat/webapps/test/index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>
    <head>
    <title>JSP test1 page</title> #指定为 test1 页面
    </head>
    <body>
    <% out.println("动态页面 1,http://www.test1.com");%>
    </body>
    </html>
    
    
    修改server.xml配置文件,第一份端口不需要改动,按原端口执行
    vim /usr/local/tomcat/conf/server.xml
    #由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" 
    xmlValidation="false" xmlNamespaceAware="false">
         <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
         </Context>
    </Host>
    
    开启tomcat
    /usr/local/tomcat/bin/shutdown.sh
    /usr/local/tomcat/bin/startup.sh
    
    第二台Tomcat server配置
    mkdir /usr/local/tomcat1/webapps/test
    
    vim /usr/local/tomcat1/webapps/test/index.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>
    <head>
    <title>JSP test2 page</title> #指定为 test2 页面
    </head>
    <body>
    <% out.println("动态页面 2,http://www.test2.com");%>
    </body>
    </html>
    
    
    vim /usr/local/tomcat1/conf/server.xml
    
    更改相应端口,避免与第一台服务器端口冲突
    更改端口如下
    调整Server,HTTP和AJP端口:
    xml
    <Server port="8006" shutdown="SHUTDOWN">  <!-- 8005 → 8006 -->
    <Connector port="8081" protocol="HTTP/1.1" <!-- 8080 → 8081 -->
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />  <!-- 8009 → 8010 -->
    
    
    #删除前面的 HOST 配置
    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/usr/local/omcat1/webapps/test" path=""
    reloadable="true" />
    </Host>
    
    /usr/local/tomcat/tomcat1/bin/shutdown.sh
    /usr/local/tomcat/tomcat1/bin/startup.sh
  3. 配置 Nginx:准备静态页面和图片,配置 upstream 与 location 规则,实现动静分离和负载均衡。

    复制代码
    #准备静态页面和静态图片
    echo '<html><body><h1>这是静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
    mkdir /usr/local/nginx/html/img
    cp /root/tu.jpg /usr/local/nginx/html/img
    
    
    #nginx配置文件
    vim /usr/local/nginx/conf/nginx.conf
    
    http {
    ......
    
        #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
        upstream tomcatserver {
            server 192.168.10.137:8080 weight=1;
            server 192.168.10.130:8080 weight=1;
            server 192.168.10.130:8081 weight=1;
        }
        server {
            listen       80;
            server_name  localhost;
    
            charset utf-8;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html;
            }
    
            #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
            location ~ .*\.jsp$ {
               proxy_pass http://tomcatserver;
               #设置后端的Web服务器可以获取远程客户端的真实IP
    ##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令
    设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都
    来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
               proxy_set_header HOST $host;
               ##把$remote_addr赋值给X-Real-IP,来获取源IP
               proxy_set_header X-Real-IP $remote_addr;
               ##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
            #配置Nginx处理静态图片请求
            location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
                root /usr/local/nginx/html/img;
                expires 10d;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }

3. 测试效果

静态资源:访问 http://192.168.10.137/ 可查看静态页面,访问 http://192.168.10.137/img/tu.jpg可查看静态图片。

负载均衡:多次访问 http://192.168.10.137/index.jsp,会交替显示两台 Tomcat 的动态页面。

六、数据流向总结

客户端 → Nginx(80/443 端口)→ 匹配 location 规则:

静态请求:Nginx 直接读取本地资源并响应。

动态请求:通过 proxy_pass 转发到 upstream 定义的 Tomcat 集群 → 后端 Tomcat 处理请求 → 结果经 Nginx 返回给客户端。

页面,访问 http://192.168.10.137/img/tu.jpg 可查看静态图片。

负载均衡:多次访问 http://192.168.10.137/index.jsp,会交替显示两台 Tomcat 的动态页面。

六、数据流向总结

客户端 → Nginx(80/443 端口)→ 匹配 location 规则:

静态请求:Nginx 直接读取本地资源并响应。

动态请求:通过 proxy_pass 转发到 upstream 定义的 Tomcat 集群 → 后端 Tomcat 处理请求 → 结果经 Nginx 返回给客户端。

相关推荐
w_t_y_y2 小时前
Nginx Plus
运维·数据库·nginx
乘风!9 小时前
NSSM启动tomcat部署Java程序
java·服务器·后端·tomcat
老姚---老姚10 小时前
Nginx Location 匹配优先级详解
nginx
露临霜10 小时前
Docker安装nginx
nginx·docker·容器
AlianNiew10 小时前
Nginx 反向代理 403 问题复盘
nginx
油丶酸萝卜别吃10 小时前
lombok的几个核心注解是什么?
java·tomcat
计算机毕设指导615 小时前
基于微信小程序的积分制零食自选平台【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
早川91916 小时前
Nginx反向代理
nginx
计算机学姐17 小时前
基于SSM的生鲜食品商城系统【2026最新】
java·vue.js·后端·mysql·java-ee·tomcat·mybatis
云和数据.ChenGuang19 小时前
运维工程师技术之nginx搭配php
运维·nginx·php·运维技术·数据库运维工程师·运维教程