HAProxy 自定义错误页面配置指南

自定义 HAProxy 错误界面


目录

  • 概念与用途

    1. sorryserver(备用主机)设置
    • 环境准备(示例:Apache)
    • HAProxy 配置示例(backup)
    • 测试流程
    1. 自定义错误页面(errorfile)
    • 创建自定义错误页
    • HAProxy 配置示例(errorfile)
    • 测试流程
    1. 从错误页面跳转到指定网站(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 参数和日志监控,确保切换行为符合预期。
相关推荐
heartbeat..2 小时前
Redis Cluster (Redis 集群模式)从入门到精通:架构解析、机制详解与运维排查
java·运维·redis·架构·nosql
阿湯哥2 小时前
Reactor响应式编程中Flux和FluxSink
运维·服务器·网络
桌面运维家2 小时前
vDisk考场环境网络瓶颈怎么定位?快速排查指南
运维·服务器·网络
Cisco_hw_zte2 小时前
挂载大容量磁盘【Linux系统】
linux·运维·服务器
腾科IT教育2 小时前
华为认证报考常见问题解析
运维·服务器·华为认证·hcia
_运维那些事儿2 小时前
GitLabCI-CD入门
运维·ci/cd·容器·云计算·k8s·运维开发
杜子不疼.2 小时前
【Linux】Ext系列文件系统(一):文件系统的初识
linux·运维·服务器
zhangzeyuaaa2 小时前
SQL Server删除重复数据
运维·sqlserver
2401_865854883 小时前
轻量型服务器和云服务器的区别
运维·服务器