HAProxy 与 Tomcat
一、HAProxy 负载均衡
(一)HAProxy 概述
HAProxy 是一款使用 C 语言编写的自由开源软件,核心功能包括高可用性保障 、负载均衡 以及基于 TCP/HTTP 协议的应用代理。其特点如下:
- 适用场景:特别适合高并发 Web 站点,支持会话保持与七层(HTTP)请求处理,可轻松应对数万级并发连接。
- 运行模型:采用事件驱动的单一进程模型,避免多进程 / 多线程的内存限制与锁竞争问题;在多核系统上需优化以提升 CPU 利用率。
- 行业应用:GitHub、Stack Overflow、Twitter、亚马逊 AWS 等知名平台均采用 HAProxy 作为负载均衡解决方案。
(二)负载均衡层级划分
负载均衡按网络协议层级可分为以下几类,HAProxy 支持四层(TCP)与七层(HTTP)负载均衡:
|----------|----------------------------------|----------------------|---------------------------|
| 层级 | 核心原理 | 典型产品 | 适用场景 |
| 二层(MAC) | 基于虚拟 MAC 地址转发请求,响应由后端真实 MAC 地址处理 | 交换机(如 Cisco) | 局域网内低延迟转发 |
| 三层(IP) | 基于虚拟 IP 地址(VIP)转发请求,分配至后端真实 IP | 路由器、LVS | 跨网段路由转发 |
| 四层(TCP) | 基于 "IP + 端口" 接收请求,转发至后端对应服务端口 | F5、LVS、HAProxy、Nginx | TCP 协议服务(如数据库、SSH) |
| 七层(HTTP) | 基于 URL、主机名、请求头等应用层信息转发请求 | HAProxy、Nginx、Apache | Web 服务(HTTP/HTTPS)、API 接口 |
(三)HAProxy 安装部署
HAProxy 支持 yum 安装与源码安装,源码安装可自定义功能,是生产环境常用方式。
1. 环境准备
关闭防火墙与 SELinux(避免端口拦截):
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2. 安装方式一:yum 安装(简单快速)
yum -y install haproxy
3. 安装方式二:源码安装(推荐,自定义功能)
(1)下载源码包
HAProxy 源码包下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/
以 haproxy-2.1.3.tar.gz 为例,上传至服务器后执行以下操作。
(2)安装编译依赖
yum -y install make gcc pcre-devel bzip2-devel openssl-devel systemd-devel gcc-c++ zlib-devel lua
(3)创建 HAProxy 专用用户
useradd -r -M -s /sbin/nologin haproxy
# -r:系统用户;-M:不创建家目录;-s:禁止登录
(4)解压与编译安装
# 解压源码包
tar -xzvf haproxy-2.1.3.tar.gz
cd haproxy-2.1.3/
# 清理旧编译文件
make clean
# 编译(启用 OpenSSL、Zlib、PCRE、Systemd 支持)
make -j $(grep 'processor' /proc/cpuinfo | wc -l) \
TARGET=linux-glibc \
USE_OPENSSL=1 \
USE_ZLIB=1 \
USE_PCRE=1 \
USE_SYSTEMD=1
# 安装至指定目录
make install PREFIX=/usr/local/haproxy
# 复制命令至系统路径(方便全局调用)
cp haproxy /usr/sbin/
(5)配置内核参数
启用 IP 非本地绑定与 IP 转发(确保 HAProxy 可绑定虚拟 IP 并转发请求):
vim /etc/sysctl.conf
# 添加以下两行
net.ipv4.ip_nonlocal_bind = 1 # 允许绑定非本地 IP
net.ipv4.ip_forward = 1 # 启用 IP 转发
# 加载内核参数
sysctl -p
(四)HAProxy 配置文件
HAProxy 核心配置文件为 /etc/haproxy/haproxy.cfg,需手动创建并配置全局参数、默认参数、监控页面与后端集群。
1. 配置文件模板
# -------------------------- 全局配置(global)--------------------------
global
log 127.0.0.1 local0 info # 日志输出:本地 syslog(local0),级别 info
maxconn 20480 # 全局最大并发连接数
pidfile /var/run/haproxy.pid # 进程 PID 文件路径
user haproxy # 运行 HAProxy 的用户
group haproxy # 运行 HAProxy 的用户组
daemon # 后台运行模式
# -------------------------- 默认参数(defaults)--------------------------
defaults
mode http # 代理模式:http(七层)/ tcp(四层)
log global # 继承 global 段的日志配置
option dontlognull # 不记录空连接日志
option httpclose # 每次请求后关闭 HTTP 连接
option httplog # 记录 HTTP 详细日志(请求方法、URL、状态码等)
option redispatch # 后端服务器不可用时,重新分配请求
balance roundrobin # 负载均衡算法:轮询(roundrobin)
timeout connect 10s # 连接后端服务器超时时间
timeout client 10s # 客户端请求超时时间
timeout server 10s # 后端服务器响应超时时间
timeout check 10s # 健康检查超时时间
maxconn 60000 # 每个前端/后端的最大并发连接数
retries 3 # 连接失败重试次数(超过则标记服务器不可用)
# -------------------------- 监控页面配置(listen)--------------------------
listen admin_stats
bind 0.0.0.0:8189 # 监控页面监听地址与端口
stats enable # 启用监控功能
mode http # 监控页面使用 HTTP 协议
log global # 继承日志配置
stats uri /haproxy_stats # 监控页面访问路径(如 http://IP:8189/haproxy_stats)
stats realm Haproxy\ Statistics # 监控页面登录提示
stats auth admin:admin # 监控页面账号密码(格式:用户名:密码)
stats admin if TRUE # 允许手动启用/禁用后端服务器
stats refresh 30s # 监控页面自动刷新时间(30秒)
# -------------------------- Web 集群配置(listen)--------------------------
listen webcluster
bind 0.0.0.0:80 # 前端监听端口(HTTP 默认 80)
mode http # 七层代理模式
log global # 继承日志配置
maxconn 3000 # 该集群最大并发连接数
balance roundrobin # 轮询算法
cookie SESSION_COOKIE insert indirect nocache # 会话保持(基于 Cookie)
server rs1 192.168.100.20:80 check # 后端服务器 1(check:启用健康检查)
server rs2 192.168.100.30:80 check # 后端服务器 2
2. 核心配置说明
- global 段:全局参数,影响 HAProxy 整体运行(如日志、用户、进程模式)。
- defaults 段:默认参数,所有 listen/frontend/backend 段若未单独配置,将继承此处参数。
- listen 段:frontend(前端请求接收)与 backend(后端集群)的组合,适用于简单场景(如监控页面、Web 集群)。
- frontend / backend 段(扩展):复杂场景下拆分前端与后端(如多前端端口对应不同后端集群),HAProxy 1.3 后支持。
(五)HAProxy 服务管理
1. 创建 Systemd 服务单元
为 HAProxy 创建系统服务文件,支持 systemctl 管理:
vim /usr/lib/systemd/system/haproxy.service
写入以下内容:
[Unit]
Description=HAProxy Load Balancer # 服务描述
After=syslog.target network.target # 依赖服务(日志、网络启动后再启动)
[Service]
# 启动前检查配置文件合法性
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
# 启动命令(-Ws:支持 Systemd 管理;-p:指定 PID 文件)
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
# 重载配置(无需重启服务)
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target # 多用户模式下启动
2. 服务操作命令
# 重新加载 Systemd 配置
systemctl daemon-reload
# 启动 HAProxy
systemctl start haproxy
# 设置开机自启
systemctl enable haproxy
# 查看服务状态
systemctl status haproxy
# 重载配置(修改 cfg 后无需重启)
systemctl reload haproxy
(六)HAProxy 日志配置
HAProxy 自身不存储日志,需配合系统日志服务(如 rsyslog)实现日志收集。
1. 配置 rsyslog
vim /etc/rsyslog.conf
-
取消以下两行注释(启用 UDP 监听,接收 HAProxy 日志):
$ModLoad imudp
$UDPServerRun 514
-
添加 HAProxy 日志存储路径:
local0.* /var/log/haproxy.log # local0 设施的日志写入该文件
2. 重启 rsyslog 服务
systemctl restart rsyslog
systemctl enable rsyslog
3. 验证日志
访问 HAProxy 代理的服务后,查看日志文件:
tail -f /var/log/haproxy.log

二、Tomcat 应用服务器
(一)Tomcat 概述
Tomcat 是一款免费开源的 Java Servlet 容器,属于轻量级 Web 应用服务器,核心特点如下:
- 功能定位:运行 Java Web 应用(如 JSP、Servlet),是开发与调试 Java Web 程序的首选工具。
- 运行依赖:需基于 JDK(Java Development Kit)或 JRE(Java Runtime Environment)环境。
- 中间件对比:
-
- 小型项目 / 个人开发:Tomcat(轻量、易用)。
-
- Linux 环境 / 轻量需求:Jetty(比 Tomcat 更轻量)。
-
- 大型商业项目:JBoss、WebLogic、WebSphere(支持集群、高可用,收费)。
(二)Tomcat 部署步骤
1. 环境准备
- 关闭防火墙与 SELinux(同 HAProxy 环境准备步骤)。
-
安装 JDK(Tomcat 运行依赖):
yum -y install java-11-openjdk # 安装 OpenJDK 11(推荐版本)
java -version # 验证安装(显示类似 "openjdk version 11.0.20" 即成功)
2. 解压与安装 Tomcat
- 下载 Tomcat 压缩包:访问 Tomcat 官网,下载对应版本(如 apache-tomcat-10.0.23.tar.gz)。
-
解压至指定目录并创建软链接(方便后续操作):
解压至 /usr/local/
tar -xzvf apache-tomcat-10.0.23.tar.gz -C /usr/local/
进入 /usr/local/ 目录
cd /usr/local/
创建软链接(简化路径,后续可通过 /usr/local/tomcat 访问)
ln -s apache-tomcat-10.0.23/ tomcat
3. 自定义测试页面
Tomcat 默认网页路径为 /usr/local/tomcat/webapps/ROOT/,可创建自定义 JSP 页面验证功能:
# 创建测试页面目录
mkdir /usr/local/tomcat/webapps/test
# 创建 JSP 测试页面
vim /usr/local/tomcat/webapps/test/index.jsp
写入以下内容(简单输出 "Hello World"):
<html>
<head>
<title>Tomcat Test Page</title>
</head>
<body>
<%
out.println("Hello World from Tomcat!"); // Java 代码片段
%>
</body>
</html>
(三)Tomcat 服务管理
1. 启动与停止 Tomcat
# 进入 Tomcat 二进制文件目录
cd /usr/local/tomcat/bin
# 启动 Tomcat(脚本为 startup.sh)
./startup.sh
# 停止 Tomcat(脚本为 shutdown.sh 或 catalina.sh)
./shutdown.sh
# 或
./catalina.sh stop
2. 验证服务状态
-
查看 Tomcat 默认端口(8080)是否启用:
ss -tuln | grep 8080 # 显示 "LISTEN 0 100 :::8080 :::*" 即成功
-
网页验证:
-
- 访问 Tomcat 首页:http://服务器IP:8080(如 http://192.168.100.10:8080)。

-
- 访问自定义测试页:http://服务器IP:8080/test/(显示 "Hello World from Tomcat!" 即成功)。

(四)Tomcat 管理页面配置
Tomcat 首页包含 Server Status(服务状态) 、Manager App(应用管理) 、Host Manager(主机管理) 三个功能入口,默认点击会报 403 错误,需配置权限与访问控制。
1. 配置 Host Manager 页面(主机管理)
(1)添加用户角色与账号
编辑 Tomcat 用户配置文件:
vim /usr/local/tomcat/conf/tomcat-users.xml
在 <tomcat-users> 标签内添加以下内容(配置 admin-gui 角色与账号):
<role rolename="admin-gui"/> <!-- Host Manager 所需角色 -->
<user username="tomcat" password="123456" roles="admin-gui"/>
<!-- 账号:tomcat,密码:123456 -->
(2)允许指定网段访问
编辑 Host Manager 上下文配置文件:
vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
修改 allow 属性,允许 192.168.100.0/24 网段访问(示例):
<Context antiResourceLocking="false" privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.100\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> <!-- 允许的 IP 段 -->
</Context>
(3)重启 Tomcat
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh start
(4)验证访问
访问 http://服务器IP:8080,点击 Host Manager,输入账号 tomcat、密码 123456,即可正常进入。

2. 配置 Server Status 与 Manager App 页面
(1)添加 Manager 角色
编辑 tomcat-users.xml,添加 manager-gui 角色(Server Status 与 Manager App 所需):
vim /usr/local/tomcat/conf/tomcat-users.xml
修改为以下内容:
<role rolename="admin-gui"/>
<role rolename="manager-gui"/> <!-- Server Status/Manager App 所需角色 -->
<user username="tomcat" password="123456" roles="admin-gui,manager-gui"/>
<!-- 同时拥有两个角色 -->
(2)允许指定网段访问 Manager App
编辑 Manager App 上下文配置文件:
vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
同样修改 allow 属性,允许 192.168.100.0/24 网段访问(与 Host Manager 配置逻辑一致):
<Context antiResourceLocking="false" privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192\.168\.100\.\d+|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>
(3)重启 Tomcat 生效
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh start
(4)验证访问
- 访问 http://服务器IP:8080,点击 Server Status:可查看 Tomcat 服务状态(如 JVM 内存使用、线程数、连接器状态等)。

- 点击 Manager App:可管理 Web 应用(如部署 / 卸载 WAR 包、启动 / 停止应用、查看应用状态等)。

三、总结
- HAProxy:核心用于负载均衡与高可用,支持四层(TCP)与七层(HTTP)代理,通过配置文件定义前端监听、后端集群与健康检查,配合 rsyslog 实现日志收集,适合高并发场景。
- Tomcat:轻量级 Java Web 容器,依赖 JDK 环境运行,通过 tomcat-users.xml 与上下文配置文件开放管理页面,支持 WAR 包自动部署,是中小型 Java Web 应用的首选。
- 联动场景:HAProxy 作为前端入口,后端挂载多台 Tomcat 形成集群,可有效分散请求压力,避免单点故障,提升应用的可用性与并发处理能力。