刚刚首次设置 HAProxy,作为平衡 2 台服务器的单个负载均衡器,每台服务器运行 Varnish 和 Nginx。
这是 cfg 文件:
global
#uid 99
#gid 99
daemon
stats socket /var/run/haproxy.stat mode 600 level admin
maxconn 40000
ulimit-n 81000
pidfile /var/run/haproxy.pid
defaults
mode http
contimeout 4000
clitimeout 42000
srvtimeout 43000
balance roundrobin
listen webfarm 91.227.223.61:80
mode http
stats enable
stats auth admin:password
balance roundrobin
cookie web insert indirect nocache
option httpclose
option forwardfor
option httpchk HEAD /check.txt HTTP/1.0
server webA 91.227.223.58:80 cookie A check
server webB 91.227.221.121:80 cookie B check
option forwardfor except 91.227.223.61
reqadd X-Forwarded-Proto:\ https
reqadd FRONT_END_HTTPS:\ on
listen stats :7777
stats enable
stats uri /
option httpclose
stats auth admin:password
问题是,这只能在本地主机上运行。如果我curl 91.227.223.61
在本地机器上运行,页面加载正常。在任何其他机器上,我都要等待几秒钟才能让页面超时。
似乎任何服务器上都没有任何防火墙(目前),并且我已经iptables -F
在每台机器上尝试过了。
答案1
我遇到了同样的问题。我的 HAProxy 在本地运行正常(已通过 curl 确认)。命令
iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT
解决了我的问题!
答案2
对于日志,请直接使用log 127.0.0.1 local0
(不开启过滤notice
),并确保您的 syslogd 正在监听 UDP 套接字(例如syslogd -r
:)。还请添加“option httplog”以获取完整请求的日志。
您的描述让我想到了三种可能性:
- 连接在其他地方被阻止,甚至无法到达 haproxy
- 服务器无法响应“localhost”以外的主机名并关闭连接。
- 服务器将重定向到 curl 无法到达的位置(例如:localhost:12345),导致 curl 尝试几次并失败。
日志会告诉你这一点。顺便问一下,您是否尝试过使用curl -i
或telnet
查看服务器返回的内容?
此外,当您使此配置正常工作时,请将“option httpclose”替换为“option http-server-close”,这将支持客户端 HTTP keep-alive(我假设您正在运行 1.4 或 1.5-dev),从而获得更好的性能和更低的延迟。
答案3
也许还iptables -F
不够。试试iptables -P INPUT ACCEPT && iptables -P OUTPUT ACCEPT