通过 systemctl 运行 haproxy 与手动运行不同。
- 手动启动时,一切正常。
- 通过 systemctl 启动时,haproxy 无法找到它代理的服务,并以 503 响应。
以下是通过 systemctl 启动时的输出:
> sudo systemctl status -l haproxy.service
haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled)
Active: active (running) since Wed 2014-12-24 08:08:49 EST; 4min 59s ago
Main PID: 20307 (haproxy)
CGroup: /system.slice/haproxy.service
└─20307 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
Dec 24 08:08:49 localhost.localdomain systemd[1]: Starting HAProxy Load Balancer...
Dec 24 08:08:49 localhost.localdomain systemd[1]: Started HAProxy Load Balancer.
像这样,haproxy 只会对我的后端说 503。
如果我现在停止 haproxy 服务,而是在命令行上手动运行它,如下所示:
sudo /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
它可以很好地代理我的服务器。
我已经通过 yum 安装了 haproxy,并且使用了非常简单的配置:
# defaults above
frontend main *:80
default_backend app
backend app
option httpclose
option forwardfor
server web1 127.0.0.1:8001
知道有什么区别吗?我尝试过在守护进程和非守护进程模式下运行它。
这是使用 systemctl 运行时的日志:
Proxy app started.
127.0.0.1:44391 [24/Dec/2014:09:01:42.403] main app/web1 0/0/-1/-1/0 503 212 - - SC-- 0/0/0/0/3 0/0 "GET / HTTP/1.1"
这是手动运行时的日志:
Proxy app started.
127.0.0.1:44393 [24/Dec/2014:09:02:11.758] main app/web1 0/0/0/2/2 200 5699 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"
要清楚的是,我可以使用 sudo 和 haproxy 用户以部署用户身份成功 curl 127.0.0.1:8001。
编辑更多信息
我尝试使用 nginx 作为代理,但无济于事。所以这不是 haproxy 的问题。nginx 显示502 Bad Gateway
,日志显示:
2014/12/24 16:57:04 [crit] 23214#0: *1 connect() to 127.0.0.1:8001 failed (13: Permission denied) while connecting to upstream, client: 192.168.34.1, server: www.zombieclj.local, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8001/", host: "www.zombieclj.local"
是的,确实存在一些安全问题。我仍然可以 curl 到 127.0.0.1:8001。关闭防火墙不会改变任何事情。
答案1
问题在于 SELinux 仅允许 Web 服务器与有限的一组端口建立出站连接。
修复方式如下:
semanage port --add --type http_port_t --proto tcp 8001
semanage
安装后
yum install policycoreutils-python
答案2
我使用了centos 维基
回顾规则:
grep haproxy /var/log/audit/audit.log | audit2allow -m haproxy
创建策略文件 ( *.pp
)。
grep haproxy /var/log/audit/audit.log | audit2allow -M haproxy
现在,在安装软件包时,我还包括该haproxy.pp
文件并将其加载到 selinux 中
semodule -i haproxy.pp