基于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://www.pswp.cn/web/96315.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5国庆网站源码

一. 网站概述 本国庆主题网站以弘扬爱国主义精神为核心&#xff0c;通过丰富多元的交互功能与视觉设计&#xff0c;打造沉浸式国庆体验空间。网站采用单页面架构&#xff0c;通过平滑滚动实现各模块的无缝衔接&#xff0c;涵盖首页、知识科普、互动体验等十大功能板块&#xf…

MySQL收集processlist记录的shell工具mysql_collect_processlist

文章目录安装指南日志文件内容日志分析参考1.简单检索2.统计不同状态的语句的数量3.按照时间统计注意事项仓库这是一个纯脚本工具&#xff0c;用于从MySQL的information_schema.processlist视图中定期收集数据并保存到本地日志文件。支持MYSQL5.7-9.4版本。 template copy fro…

工业RFID现场网关模块:实现多协议互通,128台读写设备互连!

随着工业4.0进程加速&#xff0c;企业对生产系统集成度的需求不断增长。在工厂中常需整合不同品牌PLC、驱动器、机械臂、读写器等设备系统&#xff0c;这其中就会涉及到如Profinet、EtherNet/IP、EtherCAT、Modbus TCP、CC-LINK IE等不同通讯协议连接。虽可将部分设备直接与PLC…

黑马点评高级篇第7节课 输入INFO replication 显示0个从节点,但是在7002节点又显示它已经是7001节点的从节点了

问题描述在黑马点评高级篇第七节课的这个位置​​​​​​&#xff0c;当我输入INFO replication 的时候下面本应该显示为connected_slaves: 2&#xff0c;但是我的显示的是0。然后当我切换到7002端口的节点时&#xff0c;又显示7002就是7001的从节点解决我看弹幕上说在7002和7…

pcb线路板打样厂家有哪些?

在电子制造产业升级浪潮中&#xff0c;PCB打样环节的效率与品质直接影响产品迭代速度。本文聚焦国内五家具备核心技术竞争力的PCB打样厂商&#xff0c;深度解析其差异化优势&#xff0c;为硬件开发者提供精准选型参考。猎板PCB作为国家高新技术企业&#xff0c;猎板PCB在高频高…

【python实用小脚本-211】[硬件互联] 桌面壁纸×Python梦幻联动|用10行代码实现“开机盲盒”自动化改造实录(建议收藏)

1. 场景故事 “作为HR&#xff0c;我曾每天手动换壁纸提神&#xff0c;直到某天忙到忘记&#xff0c;结果被同事截图当‘黑历史’…” → 转折点&#xff1a;用Python调用Windows API写了个“随机壁纸机”&#xff0c;开机自启&#xff0c;每次登录都是新风景&#xff0c;现在截…

集成学习 —— 梯度提升树GBDT、XGBoost

目录 一、梯度提升树 1、残差提升树 Boosting Decision Tree 2、梯度提升树 Gradient Boosting Decision Tree 二、构建案例 1、 初始化弱学习器(CART树)&#xff1a; 2、 构建第1个弱学习器 3、 构建第2个弱学习器 4、 构建第3个弱学习器 5、 构建最终弱学习器 6、 构…

【船类】监控录像下船舶类别检测识别数据集:近7k图像,6类,yolo标注

监控录像下船舶类别检测识别数据集概述 数据集包含 6900监控录像下船舶类别图像&#xff0c;6个标注类别&#xff1a; 散货船、集装箱船、渔船、杂货船、矿砂船、客船 标注格式&#xff1a;yolo txt&#xff08;格式可转&#xff0c;可直接训练&#xff09; 标注工具&#…

用户故事设计范式(As a... I want to... So that...)

我们来详细解析一下用户故事&#xff08;User Story&#xff09;&#xff0c;包括其结构、为什么重要、如何编写好的用户故事以及一个完整的示例。1. 用户故事的基本结构&#xff1a;三段式模板最经典和通用的用户故事模板就是您提到的三段式&#xff1a;As a [角色]:目的&…

【OpenGL】LearnOpenGL学习笔记20 - 实例化 Instancing

上接&#xff1a;https://blog.csdn.net/weixin_44506615/article/details/151156446?spm1001.2014.3001.5501 完整代码&#xff1a;https://gitee.com/Duo1J/learn-open-gl | https://github.com/Duo1J/LearnOpenGL 实例化 Instancing 以往当我们在场景中要大量绘制相同模型…

MySQL主从不一致?DBA急救手册:14种高频坑点+3分钟定位+无损修复!

MySQL「主从不一致」最常见的成因、快速定位思路以及可落地的修复手段 一、为什么会不一致&#xff1f;14 类高频场景类别典型表现/触发条件快速自检命令/日志1. 从库被写入业务或 DBA 直连从库 UPDATE/INSERTSHOW VARIABLES LIKE read_only 应为 ON2. 复制过滤规则主从 binlog…

AI 网站源码:探秘 SUNO,革新音乐创作的 AI 先锋

在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正深刻地重塑各个领域&#xff0c;音乐创作也不例外。SUNO 作为一款引领潮流的音乐生成工具&#xff0c;宛如一颗璀璨新星&#xff0c;在音乐创作的天空中熠熠生辉&#xff0c;为音乐爱好者和创作者们带来了前…

Linux:malloc背后的实现细节

目录前言一、先搞懂基础&#xff1a;程序的内存布局&#xff08;关键前提&#xff01;&#xff09;二、malloc的核心实现步骤&#xff08;4层架构拆解&#xff09;第1层&#xff1a;用户调用 → 标准库处理&#xff08;glibc的malloc.c&#xff09;第2层&#xff1a;堆内存池管…

什么是X11转发?

X11 转发&#xff08;X11 forwarding&#xff0c;ssh -X&#xff09;是一种 SSH 协议功能&#xff0c;它允许用户在远程服务器上运行图形化应用程序&#xff0c;并通过本地的显示设备和输入输出设备与这些程序进行交互。它被开发者广泛使用&#xff0c;用于在大规模、异构的服务…

Android Kotlin 动态注册 Broadcast 的完整封装方案

在 Kotlin 中封装动态注册的 Broadcast 可以让你更优雅地管理广播的注册和注销&#xff0c;避免内存泄漏。下面是一个完整的封装方案&#xff1a; 基础封装类 import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import …

VGG改进(8):融合Self-Attention的CNN架构

1. 自注意力机制简介自注意力机制是Transformer架构的核心组件&#xff0c;它能够计算输入序列中每个元素与其他所有元素的相关性。与CNN的局部感受野不同&#xff0c;自注意力机制允许模型直接建立远距离依赖关系&#xff0c;从而捕获全局上下文信息。在计算机视觉中&#xff…

ES6 面试题及详细答案 80题 (33-40)-- Symbol与集合数据结构

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

PG-210-HI 山洪预警系统呼叫端:筑牢山区应急预警 “安全防线”

在山洪灾害多发的山区&#xff0c;及时、准确的预警信息传递是保障群众生命财产安全的关键。由 PG-210-HI 型号构成的山洪预警系统呼叫端主机&#xff0c;凭借其全面的功能、先进的特性与可靠的性能&#xff0c;成为连接管理员与群众的重要应急枢纽&#xff0c;为山区构建起一道…

研学旅游产品设计实训室:赋能产品落地,培养实用人才

1. 研学旅游产品设计实训室的定位与功能 研学旅游产品设计实训室是专门为学生提供研学课程与产品开发、模拟设计、项目推演、成果展示等实践活动的教学空间。该实训室应支持以下功能&#xff1a; 研学主题设计与目标制定&#xff1b; 课程内容与学习方法的选择与整合&#xf…

4215kg轻型载货汽车变速器设计cad+设计说明书

第一章 前言 3 1.1 变速器的发展环绕现状 3 1.2 本次设计目的和意义 4 第二章 传动机构布置方案分析及设计 5 2.1 传动机构结构分析与类型选择 5 2.2变速器主传动方案的选择 5 2.3 倒档传动方案 6 2..4 变速器零、部件结构方案设计 6 2.4.1 齿轮形式 …