在 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 作者:月影鹏鹏