当前位置: 首页 > news >正文

基于Nginx实现反向代理、负载均衡与动静分离完整部署指南

基于Nginx实现反向代理、负载均衡与动静分离完整部署指南

文章目录

  • 基于Nginx实现反向代理、负载均衡与动静分离完整部署指南
    • 一、架构规划与环境准备
      • 1.1 架构设计思路
      • 1.2 服务器规划
      • 1.3 环境依赖
    • 二、部署Nginx负载均衡器
      • 2.1 安装Nginx依赖包
      • 2.2 创建Nginx专用用户
      • 2.3 编译安装Nginx
      • 2.4 配置Nginx系统服务
    • 三、部署后端Tomcat应用服务器
      • 3.1 安装JDK(Tomcat依赖)
      • 3.2 部署Tomcat 8080实例
      • 3.3 部署Tomcat 8081实例
    • 四、配置Nginx反向代理、负载均衡与动静分离
      • 4.1 准备静态资源
      • 4.2 修改Nginx核心配置
      • 4.3 验证Nginx配置并重启
    • 五、功能测试
      • 5.1 静态资源测试
      • 5.2 负载均衡与动态请求测试
    • 六、常见问题与解决方案
    • 七、总结

在实际生产环境中,单台应用服务器往往难以承受高并发请求的压力,同时静态资源与动态资源混合处理也会降低服务响应效率。Nginx作为一款高性能的HTTP和反向代理服务器,凭借其轻量级、高并发的特性,成为实现负载均衡与动静分离的理想选择。本文将详细介绍如何基于Nginx部署反向代理、负载均衡,并结合Tomcat实现动静分离,构建高效稳定的Web服务架构。

一、架构规划与环境准备

1.1 架构设计思路

本次部署采用“Nginx前端负载均衡+Tomcat后端应用”的架构模式,核心目标如下:

  • 反向代理:通过Nginx接收客户端请求,隐藏后端Tomcat服务器的真实地址,提高服务安全性。
  • 负载均衡:将客户端的动态请求分发到多台Tomcat服务器,避免单台服务器过载,提升服务并发能力。
  • 动静分离:Nginx直接处理静态资源(图片、HTML等),动态请求(JSP等)转发至Tomcat处理,优化资源处理效率。

1.2 服务器规划

服务器角色IP地址端口主要作用
Nginx负载均衡器192.168.10.2280反向代理、负载均衡、静态资源处理
Tomcat应用服务器1192.168.10.178080处理动态请求(JSP)
Tomcat应用服务器2192.168.10.178081处理动态请求(JSP)

1.3 环境依赖

  • 操作系统:CentOS 7(所有服务器均需安装)
  • 软件版本:Nginx 1.20.2、JDK 1.8、Tomcat 8.5.16
  • 前置操作:所有服务器关闭防火墙、禁用SELinux,避免端口拦截。
    # 关闭防火墙
    systemctl stop firewalld
    systemctl disable firewalld
    # 禁用SELinux
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    

二、部署Nginx负载均衡器

Nginx是整个架构的入口,需先完成其安装与基础配置,确保能够正常接收和转发请求。

2.1 安装Nginx依赖包

Nginx编译安装需依赖pcre、zlib等库,通过yum安装相关开发包:

yum -y install pcre-cdevel zlib-devel openssl-devel gc gcc-c++ make

2.2 创建Nginx专用用户

为提高安全性,创建无登录权限的nginx用户用于运行Nginx服务:

useradd -M -s /sbin/nologin nginx

2.3 编译安装Nginx

  1. 上传Nginx 1.20.2安装包至/opt目录,解压后进入源码目录:

    cd /opt
    tar zxvf nginx-1.20.2.tar.gz
    cd nginx-1.20.2/
  2. 配置编译参数(启用SSL、stream、状态统计等核心模块):

./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
  1. 编译并安装:
    make && make install
    
  2. 创建软链接,方便全局调用nginx命令:
    ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    

2.4 配置Nginx系统服务

为便于通过systemctl管理Nginx,创建系统服务文件:

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

设置权限并启动Nginx:

# 赋予执行权限
chmod 754 /lib/systemd/system/nginx.service
# 启动并设置开机自启
systemctl start nginx.service
systemctl enable nginx.service
# 验证启动状态
systemctl status nginx.service

三、部署后端Tomcat应用服务器

Tomcat作为Java Web容器,负责处理动态JSP请求。本次在同一台服务器上部署2个Tomcat实例(端口8080、8081),模拟多台应用服务器。

3.1 安装JDK(Tomcat依赖)

  1. 上传JDK 1.8安装包至/opt目录,解压至/usr/local

    tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
    
  2. 配置JDK环境变量:

    vim /etc/profile
    

    添加如下内容:

    export JAVA_HOME=/usr/local/jdk1.8.0_91
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
  3. 生效环境变量:

    source /etc/profile
    # 验证JDK安装
    java -version
    

3.2 部署Tomcat 8080实例

  1. 上传Tomcat 8.5.16安装包至/opt目录,解压并重命名:

    tar zxvf apache-tomcat-8.5.16.tar.gz
    mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
    
  2. 创建测试动态页面:

    mkdir /usr/local/tomcat/webapps/test
    vim /usr/local/tomcat/webapps/test/index.jsp
    

    添加如下JSP内容(标记为test1页面,便于区分负载均衡效果):

    <%@ 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>
    </html>
    
  3. 配置Tomcat虚拟主机:

    vim /usr/local/tomcat/conf/server.xml
    

    删除原有<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>
    
  4. 启动Tomcat并验证:

    # 启动Tomcat
    /usr/local/tomcat/bin/startup.sh
    # 验证8080端口是否监听
    netstat -ntap | grep 8080
    

3.3 部署Tomcat 8081实例

通过复制8080实例快速创建8081实例,只需修改端口和测试页面即可:

  1. 复制Tomcat目录并命名为tomcat1:
    cp -r /usr/local/tomcat /usr/local/tomcat1
    
  2. 修改Tomcat1端口(避免端口冲突):
    vim /usr/local/tomcat1/conf/server.xml
    
    需修改3处端口:
    • 关闭端口:<Server port="8005" shutdown="SHUTDOWN"> → 改为8006
    • 监听端口:<Connector port="8080" protocol="HTTP/1.1"> → 改为8081
    • AJP端口:<Connector port="8009" protocol="AJP/1.3"> → 改为8010
  3. 修改测试页面(标记为test2):
    vim /usr/local/tomcat1/webapps/test/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>
    </html>
    
  4. 启动Tomcat1并验证:
    /usr/local/tomcat1/bin/startup.sh
    netstat -ntap | grep 8081
    

四、配置Nginx反向代理、负载均衡与动静分离

Nginx的核心配置集中在nginx.conf文件中,需在此文件中实现负载均衡池定义、动静请求分发规则。

4.1 准备静态资源

在Nginx服务器上创建静态页面和图片目录,用于测试动静分离:

# 创建静态首页
echo '<html><body><h1>这是Nginx处理的静态页面</h1></body></html>' > /usr/local/nginx/html/index.html
# 创建图片目录并上传测试图片(此处以上传game.jpg为例)
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img

4.2 修改Nginx核心配置

编辑nginx.conf文件:

vim /usr/local/nginx/conf/nginx.conf

重点修改http块内容,添加负载均衡池、动静分离规则,完整配置如下:

http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;# 1. 定义负载均衡池(tomcat_server),weight为权重(权重越高,被分配概率越大)upstream tomcat_server {server 192.168.10.17:8080 weight=1;  # Tomcat 8080server 192.168.10.17:8081 weight=1;  # Tomcat 8081}# 2. 配置虚拟主机server {listen       80;server_name  www.test.com;  # 可自定义域名,需在本地hosts解析charset utf-8;access_log  logs/host.access.log  main;# 3. 动态请求转发(.jsp结尾请求转发至负载均衡池)location ~ .*\.jsp$ {proxy_pass http://tomcat_server;  # 转发至定义的负载均衡池# 传递客户端真实IP和主机名给后端Tomcatproxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 4. 静态资源处理(图片、CSS等由Nginx直接返回)location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;  # 静态资源根目录expires 10d;  # 设置浏览器缓存10天,减少重复请求}# 5. 默认请求处理(静态首页)location / {root   html;index  index.html index.htm;}# 错误页面配置error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

4.3 验证Nginx配置并重启

# 检查配置文件语法是否正确
nginx -t
# 重启Nginx使配置生效
systemctl reload nginx.service

五、功能测试

配置完成后,通过浏览器访问Nginx服务器IP(192.168.10.22),分别测试静态资源、动态请求、负载均衡效果。

5.1 静态资源测试

  1. 访问静态首页:http://192.168.10.22
    预期结果:显示“这是Nginx处理的静态页面”,说明Nginx正常处理静态HTML。
  2. 访问静态图片:http://192.168.10.22/game.jpg
    预期结果:成功显示上传的game.jpg图片,说明静态图片处理正常。

5.2 负载均衡与动态请求测试

访问动态JSP页面:http://192.168.10.22/index.jsp
预期结果

  • 首次刷新可能显示“动态页面 1,http://www.test1.com”(Tomcat 8080处理);
  • 再次刷新可能显示“动态页面 2,http://www.test2.com”(Tomcat 8081处理);
  • 多次刷新后,页面在两个动态页面间交替显示,说明负载均衡生效,请求被均匀分发到两台Tomcat服务器。

六、常见问题与解决方案

  1. Tomcat启动失败,端口被占用?
    执行netstat -ntap | grep 8080查看占用端口的进程,杀死对应进程或修改Tomcat端口。
  2. 访问JSP页面返回404?
    检查Tomcat的server.xml<Context>docBase路径是否正确,确保index.jsp存在于该路径下。
  3. Nginx配置后无法转发请求?
    确认Nginx的upstream中Tomcat的IP和端口是否正确,同时检查Tomcat是否启动、防火墙是否关闭。

七、总结

本文通过“Nginx+Tomcat”架构实现了反向代理、负载均衡与动静分离,核心优势如下:

  • 高并发支持:Nginx处理静态资源效率远高于Tomcat,动静分离减少了Tomcat的资源消耗;
  • 负载均衡:通过权重分配请求,避免单台Tomcat过载,提升服务可用性;
  • 安全性提升:客户端仅与Nginx交互,后端Tomcat不直接暴露在公网,降低攻击风险。

该架构可根据实际业务需求扩展Tomcat服务器数量,进一步提升并发处理能力,适用于中小规模Web应用的生产环境部署。


文章转载自:

http://yru71ru1.dbfwq.cn
http://FUlBmeUW.dbfwq.cn
http://uqNtH0L0.dbfwq.cn
http://GgAKykYT.dbfwq.cn
http://HJ6io95O.dbfwq.cn
http://0wq0LiHK.dbfwq.cn
http://aWenOCvG.dbfwq.cn
http://zIksQmSi.dbfwq.cn
http://Z8RRM5Gx.dbfwq.cn
http://Ps4PLmRx.dbfwq.cn
http://4ooFZXb3.dbfwq.cn
http://ppe3RmMw.dbfwq.cn
http://Fye2YAL1.dbfwq.cn
http://4mwGglIS.dbfwq.cn
http://vsljYIjo.dbfwq.cn
http://DBWq14cd.dbfwq.cn
http://aymM90xv.dbfwq.cn
http://9R1Jy3g1.dbfwq.cn
http://7f1kLqHN.dbfwq.cn
http://TxhUYgRh.dbfwq.cn
http://FZ5dAScT.dbfwq.cn
http://oD23eszb.dbfwq.cn
http://hno2n9zA.dbfwq.cn
http://KPL4sKfW.dbfwq.cn
http://ZSqlHsDp.dbfwq.cn
http://CwPfEU4W.dbfwq.cn
http://pPURYpYc.dbfwq.cn
http://oGnOxEzF.dbfwq.cn
http://3OkSviuW.dbfwq.cn
http://dyenfugl.dbfwq.cn
http://www.dtcms.com/a/375078.html

相关文章:

  • Excel 表格 - Excel 单元格添加边框
  • 产品无法正确解析复杂表格和流程图,有什么替代方案或优化方法?
  • C++ -- 模板
  • C# ObjectListView实现树状文件夹浏览
  • 高级 RAG 技术原理和前沿进展
  • 42.Shell脚本判断和if语句及相关案例
  • Game Runtime Libraries Package 解决游戏运行的痛点困境
  • 《P3825 [NOI2017] 游戏》
  • 第三课、Cocos Creator 项目创建与目录结构详解
  • C#中的浅拷贝与深拷贝
  • docker 整理几个常用的指令
  • Git上有更新而本地无更新时的解决方案
  • Doc2X为一切AI文档服务的基础设施,将PDF转换为Word、HTML、LaTeX、Markdown等
  • k8s 内置的containerd配置阿里云个人镜像地址及认证
  • 新节点加入k8s集群命令查看
  • 在 PostgreSQL中查看有哪些用户
  • 【从零开始的大模型原理与实践教程】--第一章:NLP基础概念
  • 零侵入式对接美团核销接口的技术合作模式
  • Kafka面试精讲 Day 14:集群扩容与数据迁移
  • 解耦-IOCDI
  • 【秋招笔试】2025.09.07蚂蚁算法岗笔试题
  • 10月17日,博睿数据受邀出席GOPS 全球运维大会 2025 · 上海站!
  • 第三方软件测评机构:MongoDB分片集群写入吞吐量与延迟第三方性能测评
  • 【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
  • 【56页PPT】数字孪生智能工厂总体结构技术架构MES+ERP建设方案(附下载方式)
  • type(类型别名)和 interface的区别和最佳实践
  • 【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
  • 4 C 语言数据结构实战:栈和队列完整实现(结构体 + 函数)+ 最小栈解决方案
  • day2 java 基础语法
  • Elasticsearch:智能搜索的 MCP