HAProxy 与 Tomcat
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 firewalldsetenforce 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.gzcd 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 # 允许绑定非本地 IPnet.ipv4.ip_forward = 1 # 启用 IP 转发# 加载内核参数sysctl -p
(四)HAProxy 配置文件
HAProxy 核心配置文件为 /etc/haproxy/haproxy.cfg,需手动创建并配置全局参数、默认参数、监控页面与后端集群。
1. 配置文件模板
# -------------------------- 全局配置(global)--------------------------globallog 127.0.0.1 local0 info # 日志输出:本地 syslog(local0),级别 infomaxconn 20480 # 全局最大并发连接数pidfile /var/run/haproxy.pid # 进程 PID 文件路径user haproxy # 运行 HAProxy 的用户group haproxy # 运行 HAProxy 的用户组daemon # 后台运行模式# -------------------------- 默认参数(defaults)--------------------------defaultsmode 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_statsbind 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 webclusterbind 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# 启动 HAProxysystemctl 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 rsyslogsystemctl 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 形成集群,可有效分散请求压力,避免单点故障,提升应用的可用性与并发处理能力。