![HAProxy 无法在 nodejs web 服务器上绑定套接字](https://linux22.com/image/681276/HAProxy%20%E6%97%A0%E6%B3%95%E5%9C%A8%20nodejs%20web%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%BB%91%E5%AE%9A%E5%A5%97%E6%8E%A5%E5%AD%97.png)
我正在尝试使用 HAProxy 重定向到在三个不同端口上运行的不同 nodejs webserver。我想要的是,当我尝试打开 /node1 时,HAProxy 将我重定向到该 web 服务器。这是 HAProxy 配置:
frontend dispatcher
mode http
bind *:80
acl node_serv1 url_beg /node1
acl node_serv2 url_beg /node2
acl node_serv3 url_beg /node3
use_backend backend_1 if node_serv1
use_backend backend_2 if node_serv2
use_backend backend_3 if node_serv3
backend backend_1
mode http
balance roundrobin
option httpchk
server web01 127.0.0.1:3001 check
backend backend_2
mode http
balance roundrobin
option httpchk
server web02 127.0.0.1:3002 check
backend backend_3
mode http
balance roundrobin
option httpchk
server web03 127.0.0.1:3003 check
所有三个 nodejs 网络服务器都在运行,但是当我尝试启动 haproxy 时出现此错误:
Starting haproxy: [ALERT] 111/105652 (27208) : Starting frontend dispatcher: cannot bind socket [0.0.0.0:80]
在网上看到有人建议添加此属性
net.ipv4.ip_nonlocal_bind=1
在 /etc/sysctl.conf 上
但错误仍然存在,HAProxy 无法启动。我的配置有什么问题?
答案1
最可能的原因是其他某个进程已经绑定到端口 80(例如另一个 Web 服务器)。
在启动 haproxy 之前我建议检查端口 80 是否可以绑定
nestat -anp | grep ":80"
如果结果不为空,则表示某个进程已经“占用”了端口 80,您的 haproxy 将无法绑定到该端口(尤其是当您尝试绑定到所有接口时)。 某种解决方案是停止此进程,但这取决于您是否可行,因为那里可能正在运行另一个网页。
另一个原因是您尝试以非 root 用户身份启动该进程。非 root 用户通常不允许绑定到特权端口(编号低于 1024)。
答案2
只需将此行添加到“/etc/sysctl.conf”文件即可
net.ipv4.ip_nonlocal_bind = 1
然后运行此命令
sysctl -p
希望能帮助到你