Nginx反向代理与负载均衡部署实战指南

  • 前言
  • 一、规划部署负载均衡和反向代理
  • 二、部署Nginx负载均衡器
      • 2.1. 准备基础环境
      • 2.2. 创建Nginx运行用户
      • 2.3. 编译安装Nginx
      • 2.4. 配置Nginx系统服务
      • 2.5. 验证Nginx安装
  • 三、部署后端2台Tomcat应用服务器
      • 3.1. 安装JDK
      • 3.2. 部署Tomcat实例1
      • 3.3. 部署Tomcat实例2
  • 四、动静分离配置
      • 4.1. 配置Tomcat1的动态页面
      • 4.2. 配置Tomcat2的动态页面
      • 4.3. 配置Nginx的动静分离
  • 五、测试效果
      • 5.1. 测试静态页面
      • 5.2. 测试静态图片
      • 5.3. 测试负载均衡
  • 结语

前言

  在现代Web架构中,高可用性高性能是企业应用的核心需求。随着用户量和业务量的增长,单台服务器往往难以承受高并发请求,容易成为性能瓶颈。此时,反向代理负载均衡技术成为解决问题的关键——通过将请求分发到多台后端服务器,既能提升系统的整体处理能力,又能隐藏后端服务器的真实IP,增强安全性。本教程将详细介绍如何使用Nginx搭建反向代理与负载均衡集群,结合Tomcat实现动静分离,为企业应用打造稳定、高效的Web服务环境。

一、规划部署负载均衡和反向代理

在开始部署前,需明确各服务器的角色与IP地址,确保网络环境畅通:

  • Nginx负载均衡器:作为前端入口,负责接收客户端请求并将请求分发到后端Tomcat服务器,IP地址为192.168.10.10,监听端口80
  • Tomcat应用服务器1:运行Java Web应用,IP地址为192.168.10.11,监听端口8080
  • Tomcat应用服务器2:运行Java Web应用,IP地址为192.168.10.11,监听端口8081(同一服务器部署多实例,模拟多台服务器场景)。
    通过这种架构,Nginx作为“流量调度中心”,将客户端请求均匀分发到后端Tomcat服务器,既提升了系统的并发处理能力,又降低了单台服务器的压力。

二、部署Nginx负载均衡器

Nginx的安装与配置是搭建反向代理集群的第一步。以下是详细步骤:

2.1. 准备基础环境

首先关闭防火墙和SELinux,避免网络访问限制:

systemctl stop firewalld
setenforce 0

安装Nginx所需的依赖包(用于编译安装):

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

2.2. 创建Nginx运行用户

为保证安全性,Nginx以非root用户身份运行:

useradd -M -s /sbin/nologin nginx

2.3. 编译安装Nginx

下载并解压Nginx源码包(以1.20.2版本为例):

cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/

进入解压目录,配置编译选项:

cd /opt/nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \          # 安装目录
--user=nginx \                       # 运行用户
--group=nginx \                      # 运行组
--with-file-aio \                    # 启用文件异步IO(提升静态文件处理性能)
--with-http_stub_status_module \     # 启用状态统计模块(查看Nginx运行状态)
--with-http_gzip_static_module \     # 启用gzip静态压缩(减少传输体积)
--with-http_flv_module \             # 启用FLV视频伪流支持
--with-http_ssl_module \             # 启用SSL模块(支持HTTPS)
--with-stream \                      # 启用stream模块(支持四层负载均衡)
make && make install                 # 编译并安装

2.4. 配置Nginx系统服务

为了让Nginx随系统启动自动运行,需创建systemd服务文件:

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         # 设置开机自启

2.5. 验证Nginx安装

在浏览器中访问http://192.168.10.10,若出现Nginx欢迎页面,说明安装成功。

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

Tomcat作为Java Web应用服务器,需部署两个实例以实现负载均衡的目标。以下是详细步骤:

3.1. 安装JDK

Tomcat依赖JDK运行,首先安装JDK 8:

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

配置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

使环境变量生效:

source /etc/profile

3.2. 部署Tomcat实例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              # 检查8080端口是否监听

3.3. 部署Tomcat实例2

复制Tomcat实例1的目录,创建第二个实例:

cp -r /usr/local/tomcat /usr/local/tomcat1

修改Tomcat实例2的端口(避免与实例1冲突):
编辑/usr/local/tomcat1/conf/server.xml,修改以下端口:

<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Server port="8006" shutdown="SHUTDOWN" />

启动Tomcat实例2并验证端口:

/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 
netstat -ntap | grep 8081              # 检查8081端口是否监听

四、动静分离配置

  动静分离是提升Web性能的关键策略,通过将静态资源(如HTML、CSS、JS、图片)与动态资源(如JSP、Servlet)分开处理,减少Tomcat的负载压力。以下是具体配置:

4.1. 配置Tomcat1的动态页面

创建动态页面目录并编写JSP文件:

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

添加以下内容(显示动态页面1的信息):

<%@ 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>

修改Tomcat1的server.xml,配置虚拟主机:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
</Host>

重启Tomcat1:

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

4.2. 配置Tomcat2的动态页面

复制Tomcat1的动态页面目录,修改内容(当前tomcat为同一服务器):

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

添加以下内容(显示动态页面2的信息):

<%@ 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>

修改Tomcat2的server.xml,配置虚拟主机:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat1/webapps/test" path="" reloadable="true" />
</Host>

重启Tomcat2:

/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

4.3. 配置Nginx的动静分离

编辑Nginx的主配置文件:

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

http块中添加upstream(负载均衡服务器池)和动静分离配置:

http {# 定义负载均衡服务器池(权重可根据服务器性能调整)upstream tomcat_server {server 192.168.10.11:8080 weight=1;server 192.168.10.11:8081 weight=1;}server {listen 80;server_name www.kgc.com;charset utf-8;# 动态请求转发到Tomcat集群 {~ .*\,jsp$(匹配大小写)|~*\.jsp$(不匹配大小写)}location ~ .*\.jsp$ {proxy_pass http://tomcat_server;proxy_set_header Host $host;               # 传递客户端请求的Host头proxy_set_header X-Real-IP $remote_addr;   # 传递客户端真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链IP}# 静态图片请求(直接由Nginx处理,提升性能)location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;                               # 设置静态资源缓存时间(10天)}# 静态页面请求location / {root html;index index.html index.htm;}}
}

检查Nginx配置语法并重启:

/usr/local/nginx/sbin/nginx -t         # 检查配置是否正确
systemctl restart nginx.service        # 重启Nginx

五、测试效果

5.1. 测试静态页面

  在浏览器中访问http://192.168.10.10/,若显示Nginx的默认静态页面,说明静态页面配置成功。
在这里插入图片描述

5.2. 测试静态图片

  将图片1.png复制到/usr/local/nginx/html/img目录,访问http://192.168.10.10/1.png,若显示图片,说明静态图片配置成功。
在这里插入图片描述

5.3. 测试负载均衡

  在浏览器中反复访问http://192.168.10.11/index.jsp,若交替显示“动态页面 1”和“动态页面 2”的内容,说明负载均衡配置成功(Nginx将请求分发到Tomcat1和Tomcat2)。
在这里插入图片描述
在这里插入图片描述

结语

  通过本教程的部署,我们成功搭建了Nginx反向代理与负载均衡集群,并结合Tomcat实现了动静分离。这种架构不仅提升了Web应用的并发处理能力(Nginx处理静态请求,Tomcat处理动态请求),还通过负载均衡将请求分发到多台服务器,降低了单台服务器的压力,增强了系统的高可用性
  在实际生产环境中,还可以进一步优化配置:如开启Nginx的gzip压缩(减少传输体积)、配置SSL证书(实现HTTPS加密)、设置健康检查(自动剔除故障服务器)等。此外,结合Docker或Kubernetes等容器技术,可以实现更灵活的动态扩展,应对突发的流量高峰。
  反向代理与负载均衡是企业Web架构的核心组件,掌握其部署与配置技能,将为打造高性能、高可用的Web服务奠定坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98825.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98825.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98825.shtml

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

相关文章

从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)

AQS 概念 AbstractQueuedSynchronizer&#xff08;AQS&#xff09; 是 Java 并发包 (java.util.concurrent.locks) 的核心基础框架&#xff0c;它的实现关键是先进先出 (FIFO) 等待队列和一个用volatile修饰的锁状态status。具体实现有 : ReentrantLock、Semaphore、CountDownL…

Dart → `.exe`:Flutter 桌面与纯命令行双轨编译完全指南

Dart → .exe&#xff1a;Flutter 桌面与纯命令行双轨编译完全指南 关键词&#xff1a;Dart、Flutter、Windows、可执行文件、桌面端、CLI、交叉编译 1. 前言 很多开发者以为 Dart 只能跑在 AOT 移动端或 Web 端&#xff0c;其实 官方工具链早已支持一键输出 Windows 原生 .ex…

互联网接入网中PPPoE和PPP协议

<摘要> PPPoE和PPP是宽带接入网络中至关重要的协议组合&#xff0c;其中PPP提供通用的点对点链路层解决方案&#xff0c;而PPPoE则是在以太网架构上扩展PPP应用的技术桥梁。本文从技术演进视角系统解析了两者的内在关联与本质区别&#xff1a;PPP作为成熟链路层协议&…

详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣

spark streaming是基于微批处理的流式计算引擎&#xff0c;通常是利用spark core或者spark core与spark sql一起来处理数据。在企业实时处理架构中&#xff0c;通常将spark streaming和kafka集成作为整个大数据处理架构的核心环节之一。 针对不同的spark、kafka版本&#xff0…

Kite Compositor for Mac v2.1.2 安装教程|DMG文件安装步骤(Mac用户必看)

Kite Compositor​ 是一款专为 ​macOS​ 设计的 ​轻量级界面设计 & 动画制作工具&#xff0c;它可以让你像拼图一样直观地 ​创建、编辑和预览用户界面&#xff08;UI&#xff09;以及动画效果。 一、下载文件 首先&#xff0c;你得先把这个 ​Kite Compositor for Mac …

【逆向】Android程序静态+动态分析——去壳

对提供的 CrackmeTest.apk 进行逆向分析&#xff0c;程序含有反调试机制&#xff08;加壳&#xff09;&#xff0c;通过静态补丁反反调试&#xff08;去壳&#xff09;&#xff0c;再动态调试获取其中密码。 目录 环境 基础 实验内容 静态分析 动态分析 反反调试 再动态…

Rust 开发环境安装与 crates.io 国内源配置(Windows / macOS / Linux 全流程)

Rust 这几年在系统编程、WebAssembly、区块链、后端服务领域越来越火&#xff0c;很多开发者都在尝试用它做一些新项目。 但是国内安装 Rust 开发环境时&#xff0c;经常遇到 安装慢、依赖拉不下来、crates.io 超时 等问题。本文结合个人踩坑经验&#xff0c;整理了一份 跨平台…

Nginx SSL/TLS 配置

Nginx SSL/TLS 配置指南&#xff1a;从入门到安全强化前言一、环境准备&#xff1a;Nginx安装配置1.1. **EPEL仓库配置**&#xff1a;1.2. **Nginx安装**&#xff1a;1.3. **服务启停管理**&#xff1a;1.4. **服务状态验证**&#xff1a;二、SSL/TLS证书获取方案方案A&#xf…

Java ReentrantLock和synchronized的相同点与区别

1. 核心概念与定位synchronized&#xff1a;Java 内置的关键字&#xff0c;属于 JVM 层面的隐式锁。通过在方法或代码块上声明&#xff0c;自动实现锁的获取与释放&#xff0c;无需手动操作。设计目标是提供简单易用的基础同步能力&#xff0c;适合大多数常规同步场景。Reentra…

【npm】npm 包更新工具 npm-check-updates (ncu)

npm 包太多了&#xff0c;一个项目有那么多依赖包&#xff0c;它们的升级管理需要一个工具&#xff1a;npm-check-updates&#xff1a; 安装&#xff1a; npm install -g npm-check-updates安装之后&#xff0c;就可以使用它的命令&#xff1a;ncu 查看哪些包可以升级&#xff…

go资深之路笔记(一) Context

一、 Context 的正确使用与底层原理 1.结构体 type Context interface {// Deadline 返回此 Context 被取消的时间点。// 如果未设置截止时间&#xff0c;ok 为 false。Deadline() (deadline time.Time, ok bool)// Done 返回一个 channel。当 Context 被取消或超时后&#xff…

VS2022 + Qt5.9 中文乱码/项目设置utf-8编码

&#x1f6e0;️ 解决QT5.9 VS2022中文乱码的全面方案 &#x1f4c1; 1. 检查文件编码与编译器设置 确保源文件是 带BOM的UTF-8 编码对MSVC编译器很重要。VS2022默认可能使用本地编码&#xff08;如GB2312&#xff09;解析源文件&#xff0c;即使文件以UTF-8保存。 查看和设置…

数据库--MySQL数据管理

数据库–MySQL数据管理 文章目录数据库--MySQL数据管理1.外键管理2.数据库数据管理3.DML语言3.1添加数据3.2修改数据3.3删除数据4.练习1.外键管理 外键概念 如果公共关键字在一个关系中是主关键字&#xff0c;那么这个公共关键字被称为另一个关系的外键。由此可见&#xff0c;…

【C++练习】13.C++输出九九乘法表的方法详解

目录 C++输出九九乘法表的方法详解 方法1:双重for循环(最基础) 思考: 代码分析: 特点: 方法2:使用while循环 思考: 代码分析: 特点: 方法3:使用递归实现 思考: 代码分析: 特点: 方法4:格式化输出(对齐美观) 思考: 代码分析: 特点: 方法5:使用函数封装 思考…

MVC及其衍生

MVC 把软件分成模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三个基本部分。 事实上对应着 Controller——输入 用户交互&#xff0c;将输入处理成Controller能处理的形式 Model——处理 描述状态、逻辑规律…

微硕WINSOK MOS管WSF3089,赋能汽车转向系统安全升级

随着汽车电子化程度不断提高&#xff0c;转向系统对高效功率器件的需求日益增长。微硕WINSOK推出的N沟道Trench MOS管WSF3089&#xff0c;以30 V/72 A大电流、4.5 mΩ超低导通电阻和TO-252-2L紧凑封装&#xff0c;为EPS&#xff08;电动助力转向&#xff09;电机驱动、电源管理…

淘宝拍立淘接口的接入与应用||item_search_img-按图搜索淘宝商品(拍立淘)

淘宝拍立淘接口的接入与应用如下&#xff1a;接入流程注册与认证&#xff1a;开发者账号注册&#xff1a;访问淘宝开放平台&#xff0c;进行开发者账号注册。创建应用&#xff1a;在控制台创建新应用&#xff0c;获取 App Key 和 App Secret&#xff0c;这是接口调用的凭证。申…

Python学习-day8 元组tuple

元组&#xff08;Tuple&#xff09;是Python中一种不可变的序列类型&#xff0c;用于存储多个有序元素。与列表&#xff08;List&#xff09;类似&#xff0c;但元组一旦创建后不能修改&#xff08;不可添加、删除或修改元素&#xff09;&#xff0c;这使得它在安全性、性能优化…

大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

二次学习C语言补充2

文章目录表栈、队列、二叉树一、二叉树二、表栈三、队列链表一、单向链表二、循环链表、双向链表和双向循环链表预处理一、预处理二、宏定义文件文件操作补充本篇文章是对二次学习C语言12——文件操作 二次学习C语言14——预处理及模块化 二次学习C语言15——链表 二次学习C语言…