我正在尝试在 CentOS 7 中使用 node.js 后端设置一个非常简单的 HTTP 负载平衡器。后端都是 HTTP 服务器。
如果我将后端设置为侦听端口 80,并将 HAProxy 设置为侦听端口 80 并在后端使用端口 80,则一切正常。这是配置文件在这样的配置中的样子:
global
log 127.0.0.1 local2 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 256
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
timeout connect 10s
timeout client 30s
timeout server 30s
frontend http-in
bind :80
default_backend backend_servers
option forwardfor
backend backend_servers
balance roundrobin
server backend1 10.0.4.51:80 check
# server backend2 10.0.4.52:80 check
# server backend3 10.0.4.53:80 check
# server backend4 10.0.4.54:80 check
# server backend5 10.0.4.55:80 check
# server backend6 10.0.4.56:80 check
Run Code Online (Sandbox Code Playgroud)
但是,如果我将所有端口更改为 8124,HAProxy 在启动时会显示以下错误:
haproxy[3324]: backend backend_servers has no server available!
Run Code Online (Sandbox Code Playgroud)
这是新配置的样子
global
log 127.0.0.1 local2 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 256
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
timeout connect 10s
timeout client 30s
timeout server 30s
frontend http-in
bind :8124
default_backend backend_servers
option forwardfor
backend backend_servers
balance roundrobin
server backend1 10.0.4.51:8124 check
# server backend2 10.0.4.52:8124 check
# server backend3 10.0.4.53:8124 check
# server backend4 10.0.4.54:8124 check
# server backend5 10.0.4.55:8124 check
# server backend6 10.0.4.56:8124 check
Run Code Online (Sandbox Code Playgroud)
当然,后端 node.js 程序现在正在侦听端口 8124。
防火墙在后端打开8124端口,命令如下:
wget http://10.0.4.51:8124/action
Run Code Online (Sandbox Code Playgroud)
从负载均衡器完美运行,这表明负载均衡器确实可以访问后端。
在这种情况下,HAProxy 似乎无法启动,因为我在LISTEN使用netstat -an.
这是我第一次使用 HAProxy,所以我可能会遗漏一些非常微不足道的东西。
还有什么我应该检查的吗?
我刚刚想通了。
问题不在于 HAProxy 的配置,而在于 SELinux,它在 CentOS 7 上默认启用并设置为强制模式。 SELinux 的默认配置似乎仅允许在端口 80 上使用 HAProxy。
将 SELinux 设置为宽容模式,完全禁用它,或者让 SELinux 允许 HAProxy 使用其他端口解决了问题。
您可以使用 semanage 允许 HAProxy 使用该端口:
sudo semanage port -a -p tcp -t http_port_t 8124
Run Code Online (Sandbox Code Playgroud)