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 参数和日志监控,确保切换行为符合预期。
相关推荐
七夜zippoe15 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64817 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满17 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠17 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥17 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey90317 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技18 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀19 小时前
Linux环境变量
linux·运维·服务器
zzzsde19 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º20 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann