动静分离 + 负载均衡: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 返回给客户端。

相关推荐
ttthe_MOon1 小时前
LVS-NAT 模式负载均衡集群部署与配置指南
运维·负载均衡·lvs
凯子坚持 c6 小时前
Docker实战深度解析:从Nginx部署到私有镜像仓库管理
nginx·docker·eureka
百***935011 小时前
Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)
java·tomcat
百***812711 小时前
Spring 中使用Mybatis,超详细
spring·tomcat·mybatis
lwhdjbcjdjd11 小时前
Nginx与Tomcat协作处理流程及数据流向
运维·nginx·tomcat
大大水瓶14 小时前
Nginx学习
学习·nginx·dubbo
百***256114 小时前
Nginx作用以及应用场景
运维·nginx
小徐敲java15 小时前
window使用phpStudy在nginx部署前端测试
运维·前端·nginx
Crazy________15 小时前
38nginx四层负载均衡配置,和动静分离解析
linux·运维·nginx·负载均衡