整活 · 7 11 月, 2021 0

试图绑定不存在的IP地址导致Haproxy启动错误

写在前面的废话

不得不说Haproxy这玩意儿坑也是挺多的……

现在知道在带有SELinux的系统中想正常启动监听需要执行一句setsebool -P haproxy_connect_any=1。Haproxy是可以启动了,然而事情还没完。

发生肾么事了

为了让Haproxy开机启动,这里使用了:

systemctl enable haproxy
systemctl start haproxy

结果一重启系统发现Haproxy居然启动失败了??用journal -xe查看错误信息:

● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 日 2021-11-07 21:53:16 JST; 45s ago
  Process: 991 ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS (code=exited, status=1/FAILURE)
 Main PID: 991 (code=exited, status=1/FAILURE)
(中略)
11月 07 21:53:16 gw.srd haproxy-systemd-wrapper[991]: [ALERT] 310/215316 (1001) : Starting proxy <服务器名>: cannot bind socket [<IP>:<端口>]
(中略)
11月 07 21:53:16 gw.srd haproxy-systemd-wrapper[991]: haproxy-systemd-wrapper: exit, haproxy RC=1
11月 07 21:53:16 gw.srd systemd[1]: haproxy.service: main process exited, code=exited, status=1/FAILURE
11月 07 21:53:16 gw.srd systemd[1]: Unit haproxy.service entered failed state.
11月 07 21:53:16 gw.srd systemd[1]: haproxy.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

好像什么都说了又好像什么都没说……只知道错误原因是“cannot bind socket”。导致这个错误的原因有很多,这边会是因为什么呢。

试图绑定了不存在的IP地址

排除法发现,报错的条目试图绑定的IP地址都是N2N创建的虚拟网卡地址,而LAN内地址并未报错。N2N的启动脚本写在了rc.local里,这个脚本应该是在Haproxy服务启动之后启动的。也就是说,Haproxy服务启动的时候虚拟网卡尚未被创建。

解决方案

调整启动顺序就行了。这里用了一个比较弱智的办法,即不使用systemctl启动Haproxy:

systemctl stop haproxy
systemctl disable haproxy

然后把Haproxy的启动脚本

haproxy -f /etc/haproxy/haproxy.cfg -D

也写进rc.local,写在N2N的启动脚本之后就可以了。

事后吐槽

Haproxy就不能在没有连接的时候忽略这个错误吗。看看隔壁gost做的多好。