Nginx反向代理与负载均衡部署

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

  • 前言
  • 一、规划部署负载均衡和反向代理
  • 二、部署Nginx负载均衡器
      • [2.1. 准备基础环境](#2.1. 准备基础环境)
      • [2.2. 创建Nginx运行用户](#2.2. 创建Nginx运行用户)
      • [2.3. 编译安装Nginx](#2.3. 编译安装Nginx)
      • [2.4. 配置Nginx系统服务](#2.4. 配置Nginx系统服务)
      • [2.5. 验证Nginx安装](#2.5. 验证Nginx安装)
  • 三、部署后端2台Tomcat应用服务器
      • [3.1. 安装JDK](#3.1. 安装JDK)
      • [3.2. 部署Tomcat实例1](#3.2. 部署Tomcat实例1)
      • [3.3. 部署Tomcat实例2](#3.3. 部署Tomcat实例2)
  • 四、动静分离配置
      • [4.1. 配置Tomcat1的动态页面](#4.1. 配置Tomcat1的动态页面)
      • [4.2. 配置Tomcat2的动态页面](#4.2. 配置Tomcat2的动态页面)
      • [4.3. 配置Nginx的动静分离](#4.3. 配置Nginx的动静分离)
  • 五、测试效果
      • [5.1. 测试静态页面](#5.1. 测试静态页面)
      • [5.2. 测试静态图片](#5.2. 测试静态图片)
      • [5.3. 测试负载均衡](#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,避免网络访问限制:

bash 复制代码
systemctl stop firewalld
setenforce 0

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

bash 复制代码
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make

2.2. 创建Nginx运行用户

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

bash 复制代码
useradd -M -s /sbin/nologin nginx

2.3. 编译安装Nginx

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

bash 复制代码
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/

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

bash 复制代码
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服务文件:

bash 复制代码
vim /lib/systemd/system/nginx.service

添加以下内容(关键参数说明见注释):

ini 复制代码
[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:

bash 复制代码
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:

bash 复制代码
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

配置JDK环境变量:

bash 复制代码
vim /etc/profile

添加以下内容:

bash 复制代码
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

使环境变量生效:

bash 复制代码
source /etc/profile

3.2. 部署Tomcat实例1

解压Tomcat源码包:

bash 复制代码
tar zxvf apache-tomcat-8.5.16.tar.gz

移动到指定目录并重命名:

bash 复制代码
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

启动Tomcat并验证端口:

bash 复制代码
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 
netstat -ntap | grep 8080              # 检查8080端口是否监听

3.3. 部署Tomcat实例2

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

bash 复制代码
cp -r /usr/local/tomcat /usr/local/tomcat1

修改Tomcat实例2的端口(避免与实例1冲突):

编辑/usr/local/tomcat1/conf/server.xml,修改以下端口:

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并验证端口:

bash 复制代码
/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文件:

bash 复制代码
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp

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

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>
</html>

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

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:

bash 复制代码
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

4.2. 配置Tomcat2的动态页面

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

bash 复制代码
mkdir /usr/local/tomcat/tomcat1/webapps/test
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp

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

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>

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

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:

bash 复制代码
/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

4.3. 配置Nginx的动静分离

编辑Nginx的主配置文件:

bash 复制代码
vim /usr/local/nginx/conf/nginx.conf

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

nginx 复制代码
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;   # 传递客户端真实IP
            proxy_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配置语法并重启:

bash 复制代码
/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服务奠定坚实基础。

相关推荐
荣--2 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森2 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜2 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB3 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode5 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220706 天前
如何搭建本地yum源(上)
运维
ping某7 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树888 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠8 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质8 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务