# 11. 应避免的常见陷阱

> 应避免的运维失误与反直觉行为

---

LLMS 索引： [llms.txt](/zh/llms.txt)

---

<!-- Generated by scripts/generate-haproxy-docs.py from pinned upstream text. -->

有时会有人报告：系统重启后 HAProxy 服务没有启动，但手动启动又能正常工作。这通常出现在使用 keepalived 等集群 IP 地址机制、只把服务 IP 分配给主节点的环境中。HAProxy 绑定 0.0.0.0 时一切正常，改为绑定虚拟 IP 后却无法启动。原因是服务启动时，本地节点尚未持有该虚拟 IP；HAProxy 尝试绑定时，系统会因其不是本地 IP 地址而拒绝操作。正确的解决办法不是推迟 HAProxy 服务启动——这无法应对服务重启——而是把系统配置为允许绑定非本地地址。在 Linux 上，将 net.ipv4.ip_nonlocal_bind sysctl 设为 1 即可。如果需要透明截获经 HAProxy 转发到特定目标地址的 IP 流量，也必须启用此设置。

多进程配置若使用源端口范围，表面上可能运行正常，却会在高负载下随机失败：多个进程可能同时尝试使用同一源端口连接同一服务器，而这是不允许的。系统会报告错误并使用其他端口重试。增大 "retries" 参数可以在一定程度上掩盖问题，但也会增加 CPU 开销和处理时间，日志中仍会出现一定数量的重试记录。因此，多进程配置应避免使用端口范围。

HAProxy 使用 SO_REUSEPORT，并允许多个独立进程绑定同一个 IP:port。故障排查时，可能出现旧进程尚未停止、新进程便已启动的情况。这会产生荒谬的测试结果，看起来仿佛配置变更完全没有生效。实际上，即使新进程已经使用新配置重启，旧进程仍会接收并处理部分传入连接，从而返回意外结果。如有疑问，只需停止新进程后再次测试；如果服务仍然可用，很可能是旧进程依然存活，必须将其停止。Linux 的 "netstat -lntp" 命令在此很有帮助。

通过命令行向 ACL 添加条目时（例如将某个源地址加入黑名单），务必注意：这些条目不会同步写入文件，一旦有人重载配置，更新便会丢失。对于临时黑名单，这往往正是期望的效果；但如果所做变更是某个问题的正式修复，就可能不符合预期。详见 CLI 接口的 "add acl" 动作。
