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 参数和日志监控,确保切换行为符合预期。
相关推荐
新新学长搞科研18 小时前
第五届电子、集成电路与通信技术国际学术会议(EICCT 2026)
运维·人工智能·自动化·集成测试·信号处理·集成学习·电气自动化
桌面运维家19 小时前
Windows/Linux双启动:BIOS/UEFI多配置桌面创建指南
linux·运维·windows
無法複制19 小时前
debian安装Postgresql-14.x
运维·postgresql·debian
IMPYLH19 小时前
Linux 的 chroot 命令
linux·运维·服务器
一殊酒19 小时前
【Docker】Docker Desktop 安装指南及汉化教程
运维·docker·容器
克莱因35819 小时前
Linux Cent OS7 at定时任务
linux·运维·服务器
RisunJan19 小时前
Linux命令-make(GNU的工程化编译工具)
linux·运维·gnu
闲猫19 小时前
Linux 历史命令(history)
linux·运维·chrome
Memory_荒年20 小时前
TiDB 单机部署与监控完整指南
运维·数据库·后端
耗子会飞20 小时前
小白学习centos7安装RocketMQ
运维