自定义 HAProxy 错误界面

目录
-
概念与用途
-
- sorryserver(备用主机)设置
- 环境准备(示例:Apache)
- HAProxy 配置示例(backup)
- 测试流程
-
- 自定义错误页面(errorfile)
- 创建自定义错误页
- HAProxy 配置示例(errorfile)
- 测试流程
-
- 从错误页面跳转到指定网站(errorloc)
-
常见问题与建议
-
常用命令速查
概念与用途
- sorryserver:当所有正常业务主机不可用时,将流量定向到的临时/备用主机(可显示维护信息或静态页面)。
- errorfile / errorloc:当 HAProxy 无可用后端时,展示自定义错误页面 (errorfile) 或跳转到外部 URL (errorloc)。
1. sorryserver 的设定
思路:在一台备用主机上部署简单的静态网站(或使用 HAProxy 主机本身),并在 HAProxy 的后端配置中将其标记为 backup。当正常后端全部 down 时,backup 节点开始接收流量。
示例操作(在备用主机或 HAProxy 主机上):
bash
# 安装 Apache(示例)
dnf install httpd -y
# 修改监听端口(若需要)或直接使用默认 80
# 示例只演示把 Apache 监听 8080(可选)
# 编辑 /etc/httpd/conf/httpd.conf,设置 Listen 8080,然后启动服务
systemctl enable --now httpd

# 简单测试页面
echo "说声拜拜,就不会再来" > /var/www/html/index.html
HAProxy 后端配置(示例:80 对外,备用节点 8080):
cfg
listen webcluster
bind *:80
mode tcp
balance roundrobin
server haha 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1
server hehe 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1
server wuwu 192.168.0.100:8080 backup # sorryserver
重启 HAProxy:
bash
systemctl restart haproxy.service
测试示例(curl):
bash
# 正常情况下会轮询到 webserver1 / webserver2 的响应
[root@server ~]# for i in {1..5};do curl 172.25.254.100; done
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10
webserver2 - 192.168.0.20
webserver1 - 192.168.0.10

bash
# 当关闭两个正常业务主机(systemctl stop httpd)后:
curl 172.25.254.100
# 输出将是备用主机(sorryserver)上的页面内容,例如 "说声拜拜,就不会再来"


2. 自定义错误页面(errorfile)
当包括 sorryserver 在内的所有后端都不可用时,HAProxy 会返回默认的错误页面(如 503)。可以通过 errorfile 指定自定义 HTTP 响应文件(包含响应头与响应体)。
默认示例当所有后端宕机时的输出:
html
<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>
创建自定义错误页面文件并配置 HAProxy:
bash
# 创建目录并准备错误页面(例如 503)
mkdir -p /errorpage/html
vim /errorpage/html/503.http
503.http 内容示例(文件必须是一个完整的 HTTP 响应头 + body):
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html;charset=UTF-8
<html><body><h1>什么动物最凶</h1>
!王雨婷!
</body></html>
在 haproxy.cfg 中指定 errorfile(并把 mode 改为 http):
cfg
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
errorfile 503 /errorpage/html/503.http
listen webcluster
bind *:80
mode http
balance roundrobin
server haha 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1
server hehe 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1
server wuwu 192.168.0.100:8080 backup

重启并测试:
bash
systemctl restart haproxy.service
systemctl stop httpd # 当所有后端都挂掉
curl -i 172.25.254.100
# 将返回 /errorpage/html/503.http 中定义的完整响应
示例截图(保留):

3. 从定向错误到指定网站(errorloc)
如果希望在错误发生时重定向到外部 URL,可使用 errorloc(针对指定错误码):
示例:
cfg
defaults
mode http
...
errorloc 503 http://www.baidu.com
重启后,当 503 发生时,HAProxy 会以 302/307 等方式重定向到指定 URL(行为视 HAProxy 版本与配置而定)。在浏览器访问可观察到跳转。
演示 GIF(保留):

常见问题与建议
- path 与 权限:
- 确保 errorfile 路径可读并且由 haproxy 进程读取(权限/SELinux 检查)。
- 文件格式:
- errorfile 文件需包含 HTTP 响应行(如 HTTP/1.0 503 ...),然后是头部与 body。
- mode:若使用 errorfile,defaults 中应使用
mode http,并确保相应的前端/监听块也在 HTTP 模式。 - backup 与 health check:
backup节点只在所有非 backup 节点 down 时接��流量。- health check 配置(inter, rise, fall)影响故障判定速度。
- SELinux:
- 若启用 SELinux,可能需要允许 haproxy 读取非标准路径或禁用相关限制。
- 日志:
- 通过 haproxy/httpd 日志排查请求流向与错误发生点。
常用命令速查
- 重启/检查服务:
bash
systemctl restart haproxy
systemctl status haproxy
systemctl restart httpd
systemctl status httpd
- HAProxy 配置校验:
bash
haproxy -c -f /etc/haproxy/haproxy.cfg
- 查看 haproxy 日志:
bash
journalctl -u haproxy -f
# 或 /var/log/haproxy.log(取决于 log 配置)
- 测试请求:
bash
curl -i http://<haproxy-ip>/
- SELinux 快速检查(若怀疑权限问题):
bash
sestatus
# 查看 audit 日志 /var/log/audit/audit.log 或 use audit2why 工具
小结
-
sorryserver 能在后端全部不可用时为用户提供可控的备用页面,提升用户体验。
-
自定义错误页面(errorfile)能在 HAProxy 层展示品牌化或维护信息;若需要跳转到外部站点可用 errorloc。
-
生产环境中注意权限、SELinux、health check 参数和日志监控,确保切换行为符合预期。
udit 日志 /var/log/audit/audit.log 或 use audit2why 工具
小结
- sorryserver 能在后端全部不可用时为用户提供可控的备用页面,提升用户体验。
- 自定义错误页面(errorfile)能在 HAProxy 层展示品牌化或维护信息;若需要跳转到外部站点可用 errorloc。
- 生产环境中注意权限、SELinux、health check 参数和日志监控,确保切换行为符合预期。