Nginx反向代理与负载均衡部署实战指南
前言
在现代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; # 传递客户端真实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配置语法并重启:
/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服务奠定坚实基础。