在 HAProxy 中,有多种调试模式可以帮助你排查配置问题。以下是常用的调试方法:


1. 前台调试模式(最常用)

在前台运行 HAProxy,可以看到详细的日志输出:

# 前台运行,显示所有日志
haproxy -f /etc/haproxy/haproxy.cfg -d

# 或者使用 debug 模式(更详细)
haproxy -f /etc/haproxy/haproxy.cfg -db

参数说明:

  • -d:前台运行,显示所有日志
  • -db:前台运行 + 禁用后台模式 + 显示调试信息
  • -V:显示启动信息(verbose)

2. 检查配置文件语法

# 只检查语法,不启动
haproxy -c -f /etc/haproxy/haproxy.cfg

# 检查语法并显示更多信息
haproxy -c -f /etc/haproxy/haproxy.cfg -V

3. 启用详细日志(运行时调试)

方法一:修改配置文件启用详细日志

global
    log 127.0.0.1 local0 debug    # 启用 debug 级别日志
    # 或者
    log /dev/log local0 debug

defaults
    log global
    option httplog                  # 启用 HTTP 日志
    option dontlognull              # 不记录空连接
    # 临时关闭 dontlognull 可以看到所有连接
    # option dontlognull

方法二:启动时指定日志级别

# 启动时强制 debug 级别
haproxy -f /etc/haproxy/haproxy.cfg -d -V

4. 使用 tcpdump 抓包分析

# 抓取 HTTP 流量
tcpdump -i any -A port 80 -w haproxy.pcap

# 实时查看 HTTP 请求/响应
tcpdump -i any -A port 80 | grep -E "GET|POST|HTTP|Cache-Control"

5. 启用 HAProxy 统计页面

你的配置中已经有统计页面,可以通过浏览器访问查看状态:

# 访问统计页面
http://your-server-ip:9999/status

查看统计信息:

  • 可以看到每个后端的连接数、健康状态
  • 查看请求/响应统计
  • 查看错误计数

6. 使用 socat 动态调试

通过 socat 可以动态查看 HAProxy 运行时信息:

# 安装 socat
yum install -y socat

# 连接到 HAProxy 的统计套接字(需要配置)
echo "show info" | socat stdio /var/lib/haproxy/admin.sock
echo "show stat" | socat stdio /var/lib/haproxy/admin.sock

配置统计套接字:

global
    stats socket /var/lib/haproxy/admin.sock mode 660 level admin
    stats timeout 30s

7. 专门调试缓存头设置

为了验证你的图片缓存配置是否生效,可以这样测试:

方法一:使用 curl 测试

# 测试 doc.aiwaly.com 的图片
curl -H "Host: doc.aiwaly.com" -I http://localhost/uploads/test.jpg

# 查看响应头
curl -H "Host: doc.aiwaly.com" -I http://localhost/uploads/test.jpg 2>&1 | grep -E "Cache-Control|Expires"

# 测试其他域名的图片(应该没有缓存头)
curl -H "Host: www.aiwaly.com" -I http://localhost/uploads/test.jpg 2>&1 | grep -E "Cache-Control|Expires"

方法二:使用 HAProxy 调试模式 + curl 测试

# 终端1:启动 HAProxy 调试模式
haproxy -f /etc/haproxy/haproxy.cfg -d

# 终端2:发送测试请求
curl -H "Host: doc.aiwaly.com" -I http://localhost/uploads/test.jpg

# 查看终端1的输出,可以看到 HAProxy 如何处理这个请求

8. 完整调试脚本

创建一个调试脚本 debug_haproxy.sh

#!/bin/bash

echo "========================================="
echo "HAProxy 调试工具"
echo "========================================="

# 1. 检查配置语法
echo -e "\n1. 检查配置文件语法:"
haproxy -c -f /etc/haproxy/haproxy.cfg

# 2. 显示版本信息
echo -e "\n2. HAProxy 版本:"
haproxy -v

# 3. 显示编译选项
echo -e "\n3. 编译选项:"
haproxy -vv | head -20

# 4. 测试缓存规则
echo -e "\n4. 测试缓存规则 (doc.aiwaly.com):"
curl -s -H "Host: doc.aiwaly.com" -I http://localhost/uploads/test.jpg 2>&1 | grep -E "HTTP|Cache-Control|Expires"

# 5. 测试非缓存域名
echo -e "\n5. 测试非缓存域名 (www.aiwaly.com):"
curl -s -H "Host: www.aiwaly.com" -I http://localhost/uploads/test.jpg 2>&1 | grep -E "HTTP|Cache-Control|Expires"

# 6. 显示统计信息
echo -e "\n6. 统计页面地址:"
echo "http://$(hostname -I | awk '{print $1}'):9999/status"

运行:

chmod +x debug_haproxy.sh
./debug_haproxy.sh

9. 实时监控日志

查看系统日志

# CentOS 7 默认日志位置
tail -f /var/log/messages | grep haproxy

# 或者如果配置了 syslog
tail -f /var/log/haproxy.log

配置 syslog 记录 HAProxy 日志

编辑 /etc/rsyslog.conf/etc/rsyslog.d/haproxy.conf

# HAProxy 日志
local0.*                                                /var/log/haproxy.log

重启 rsyslog:

systemctl restart rsyslog

10. 针对你的缓存问题的调试步骤

# 1. 先验证配置语法
haproxy -c -f /etc/haproxy/haproxy.cfg

# 2. 如果语法正确,启动调试模式
haproxy -f /etc/haproxy/haproxy.cfg -d -V 2>&1 | tee haproxy-debug.log

# 3. 在另一个终端发送测试请求
curl -H "Host: doc.aiwaly.com" http://localhost/uploads/test.jpg -I -v

# 4. 查看调试输出,应该能看到类似:
#    "http-response rule(s) applied"
#    "set-header: Cache-Control: public, max-age=31536000, immutable"

# 5. 测试完成后,按 Ctrl+C 停止调试模式

总结

调试方法 命令 适用场景
前台运行 haproxy -f cfg -d 查看实时日志和错误
检查配置 haproxy -c -f cfg 验证语法正确性
curl 测试 curl -I -H "Host: xxx" 验证响应头
统计页面 http://ip:9999/status 查看后端状态
抓包分析 tcpdump -i any port 80 分析网络层问题

使用这些调试方法,你应该能够快速定位缓存配置是否生效以及为什么会有警告。

文档更新时间: 2026-03-28 02:12   作者:月影鹏鹏
IT运维支持-AIWALY-月影工作室