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 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 管理页面配置

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 包、启动 / 停止应用、查看应用状态等)。

三、总结

  1. HAProxy:核心用于负载均衡与高可用,支持四层(TCP)与七层(HTTP)代理,通过配置文件定义前端监听、后端集群与健康检查,配合 rsyslog 实现日志收集,适合高并发场景。
  2. Tomcat:轻量级 Java Web 容器,依赖 JDK 环境运行,通过 tomcat-users.xml 与上下文配置文件开放管理页面,支持 WAR 包自动部署,是中小型 Java Web 应用的首选。
  3. 联动场景:HAProxy 作为前端入口,后端挂载多台 Tomcat 形成集群,可有效分散请求压力,避免单点故障,提升应用的可用性与并发处理能力。
相关推荐
JH30732 小时前
深入解析Tomcat类加载器:为何及如何打破Java双亲委派模型
java·开发语言·tomcat
bug攻城狮2 小时前
Tomcat 9+ 版本默认主页迁移至 webapps.dist
java·tomcat
爱吃煎蛋的小新2 小时前
C#语法回忆零散巩固(持续更新最新版)
java·开发语言·笔记·学习·算法·c#
依加依等于绫2 小时前
javaweb tomcat的使用
java·tomcat
东方佑2 小时前
docker 部署gitlib
运维·docker·容器
一只乔哇噻2 小时前
java后端工程师进修ing(研一版‖day48)
java·开发语言·学习
x-ming-code2 小时前
Spring AOP + Redisson 实现基于注解的分布式限流方案
java·redis·分布式·spring
宇钶宇夕2 小时前
S7-200 SMART PLC 以太网通信详解:3 种方式从原理到实操
运维·算法·自动化
渣哥3 小时前
用错了就翻车!Thread.sleep() vs Thread.yield() 的区别,很多人都踩过坑
java