Nginx+Tomcat 负载均衡、动静分离

目录

一、Tomcat 和 Nginx

(1)Tomcat 概述

(2)Nginx 概述

(3)应用场景

(4)动静分离原理

(5)nginx负载均衡的原理

(6)nginx动静分离的原理

二、案例

(1)概述

(2)环境部署


一、Tomcat 和 Nginx

(1)Tomcat 概述

  • 定位:Java Servlet 容器( Jakarta EE 实现之一),专注 动态 Java 应用部署(如 Servlet、JSP、Spring Boot 应用)。
  • 核心能力
    • 支持 Java 生态(Spring、Hibernate 等框架无缝集成),作为嵌入式服务器(如 Spring Boot 默认内嵌)。
    • 处理动态请求(数据库交互、业务逻辑计算等),通过多线程模型(BIO/NIO/APR 模式)处理并发。
  • 场景:企业级 Java 系统(金融、后端服务)、微服务架构中的动态服务节点。

(2)Nginx 概述

  • 定位:高性能 HTTP 服务器 + 反向代理 + 负载均衡器,主打 静态资源处理与 高并发流量管理
  • 核心能力
    • 静态资源加速(HTML、CSS、JS、图片等),通过事件驱动(异步非阻塞)模型,支持 10 万 + 并发连接,资源消耗极低。
    • 负载均衡(轮询、权重、IP 哈希等策略)、反向代理(隐藏后端服务 IP,增强安全)、缓存(静态资源缓存、动态内容缓存)。
  • 场景:高并发网站(电商、资讯)、前后端分离架构的前端代理、CDN 边缘节点、微服务网关(服务网关(API 路由)。

(3)应用场景

  • 动静分离架构:Nginx 处理静态资源(直接返回或缓存),Tomcat 处理动态请求(如 /api 接口、JSP 页面),减少 Tomcat 负载,提升整体性能。
  • 负载均衡集群:Nginx 作为前端负载均衡器,将请求分发到多台 Tomcat 服务器(横向扩展),实现 高可用(故障节点自动剔除)。
  • 安全加固:Nginx 作为反向代理,屏蔽 Tomcat 直接暴露(如 Tomcat 的 8080 端口仅内网访问),并通过 Nginx 配置 限流、WAF(Web 应用防火墙) 增强安全。

(4)动静分离原理

  • 分流逻辑
    • 静态资源:Nginx 通过 location 配置匹配文件扩展名(如 *.css*.js*.png),直接从本地文件系统或缓存返回(无需转发到 Tomcat)。
    • 动态请求:Nginx 将 *.jsp/api 等动态路径的请求,通过反向代理(如 proxy_pass)转发到 Tomcat 处理。
  • 优势
    • 静态资源由 Nginx 高速处理(减少 Tomcat 线程占用),动态请求专注业务逻辑,实现 资源分工,提升整体吞吐量。
    • 支持静态资源缓存(proxy_cache),进一步降低后端压力。

(5)nginx负载均衡的原理

  • 策略
    • 轮询(默认):请求按顺序分发到后端 Tomcat 节点,适用于无状态服务。
    • 权重(weight):按节点性能分配请求比例(如高性能服务器权重高)。
    • IP 哈希(ip_hash):同客户端 IP 固定访问同一 Tomcat 节点(解决会话粘性问题)。
  • 实现
    • 配置后端服务列表(upstream 块),Nginx 定期检查节点健康(health_check),自动隔离故障节点,确保流量仅分发到正常节点。
  • 价值:提升系统 扩展性(横向扩展 Tomcat 节点)与 容错性(单个节点故障不影响整体服务)。

(6)nginx动静分离的原理

核心配置示例

server {
    listen 80;
    server_name example.com;
    
    # 静态资源处理(直接返回,无需转发)
    location ~* \.(css|js|png|jpg|gif)$ {
        root /path/to/static/files;  # 静态资源目录
        expires 30d;  # 缓存过期时间
    }
    
    # 动态请求转发到 Tomcat(如 8080 端口)
    location / {
        proxy_pass http://tomcat_server:8080;  # Tomcat 集群或单节点
        proxy_set_header Host $host;  # 保留请求头信息
    }
}
  • 原理总结:通过 正则匹配 分离动静请求,静态资源由 Nginx 直接响应(利用其静态处理优势),动态请求转发至 Tomcat(专注动态逻辑),实现 I/O 密集型(静态) 与 CPU 密集型(动态) 任务的高效分工。

二、案例

(1)概述

Tomcat 单节点易单点故障、难抗高并发,不适合生产。Nginx 作为 HTTP 服务器,高并发(5 万 +)、静态资源处理强、资源消耗低,常作反向代理和负载均衡器。其处理静态文件(图、HTML、CSS、JS 等),减轻 Tomcat 动态请求压力(Tomcat 动态处理效率弱)。通过 Nginx+Tomcat 架构,Nginx 负责静态资源、负载均衡,Tomcat 专注动态内容,二者互补,提升站点性能与稳定性,解决单 Tomcat 的架构缺陷,适用于生产环境的 Web 站点部署

(2)环境部署

  • Tomcat 部署(两台)
    --关闭防火墙
    systemctl stop firewalld
    setenforce 0
    
    --安装JDK和Tomcat
    dnf -y install java
    java -version   #检查
    tar zxvf apache-tomcat-9.0.9.tar.gz  #软件包安装(提前准备)
    mv apache-tomacat-9.0.8 /usr/local/tomcat
    
    --启动tomcat
    /usr/local/tomcat/bin/startup.sh
    netstat -anpt | grep java
    tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      2250/java           
    tcp6       0      0 :::8009                 :::*                    LISTEN      2250/java           
    tcp6       0      0 :::8080                 :::*                    LISTEN      2250/java           
    ###解析端口
    8005 端口    接收关闭服务器的命令,只有在服务器启动时才会开放
    8009 端口    AJP端口用于和 Web 服务器进行通信,借助 AJP 协议,能够实现负载均衡或者静态资源的缓存
    8080 端口    ava Web 应用最常用的端口
    
    --部署网站
    mkdir -p /web/webapp1
    cd /web/webapp1
    vim index.jsp    #添加
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>   
    <head>
         <title>JSP test1 page</title>   </head>
       <body>
         <% out.println("动态页面 1,http://www.test1.com");%>
       </body>
       <body>
        <div>动态页面的图片 1</div><br><img src="logo.png">
       </body>
    </html>
    
    
    --定义自己的网站目录(在配置文件中添加)
    cd /usr/local/tomcat/conf/server.xml
    <Context docBase="/web/webapp1" path=""></Context>
    
    --重启
    /usr/local/tomcat/bin/shutdown.sh 
    /usr/local/tomcat/bin/startup.sh 
    
    
  •  nginx部署
    安装nginx
    
    --改配置文件(指定代理处理) 用于定义反向代理设置
    upstream my_tomcat {    #上游服务器组
    	server 192.168.10.102:8080 weight=1;
    	server 192.168.10.103:8080 weight=1;
    }
    server {   #服务器配置块
      location ~ .*\.jsp$ {
    	proxy_set_header HOST $host  #代理请求头中的 “HOST” 字段为客户端请求中的主机名
            proxy_pass http://my_tomcat;   #匹配的请求转发到“my_tomcat” 
    
    	}
    
      location ~ .*\.(png|gif|jpg|jpeg)$ {
    	root /usr/local/nginx/html/img;   #指定图片路径位置
    	expires 30d;         #过期时间,缓存的时间
    }

    关于日志的设置(可选)

    #让后端服务器能通过日志看到真正的访问IP,默认只能看到代理的IP(添加以下内容)
    nginx:
    location ~ .*\.jsp$ {
        proxy_set_header X-Real-IP $remote_addr;      # 记录客户端真实IP(单级代理)
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 记录完整代理链IP
        proxy_set_header X-Forwarded-Proto $scheme;   # 传递协议类型(HTTP/HTTPS)
    }
    关键头信息说明:
    X-Real-IP:记录真实客户端 IP(适用于单级代理,如 Nginx 直接代理 Tomcat)。
    X-Forwarded-For:记录代理链中的所有 IP(格式为客户端IP, 代理1IP, 代理2IP,...)。
    X-Proxy-IP:记录当前代理的 IP(即 Nginx 的 IP)。
    
    tomcat:
    vim  /usr/local/tomcat/conf/server.xml
    <Connector>
        <Valve className="org.apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="X-Real-IP"            <!-- 解析X-Real-IP头作为客户端真实IP -->
               protocolHeader="X-Forwarded-Proto"    <!-- 可选:处理HTTPS协议头 -->
               internalProxies="127\.0\.0\.1"        <!-- 信任的代理IP(Nginx的IP) -->
               />
    <Host>
    <Valve className="org.apache.catalina.valves.AccessLogValve"
           directory="logs"
           prefix="localhost_access_log."
           suffix=".txt"
           pattern="%a %{X-Real-IP}i %h %l %u %t &quot;%r&quot; %s %b" />
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值