503 使用 Varnish 转 HAproxy

503 使用 Varnish 转 HAproxy

我们在不同的应用服务器上托管多个应用。我们拥有的是

HAProxy -> 应用服务器

应用服务器可以是任何内容,从 Apache 上的 PHP 到 glassfish 中的 Java 应用。因此,我们使用 haproxy 向互联网公开 1 个 IP 和 1 个端口,然后对各个应用服务器进行负载平衡,每个项目都有两个应用服务器,这两个服务器相互平衡。

我们现在要做的是,将 Varnish 放在 HAProxy 前面以缓存所有流量,然后在其到达 HAproxy 并路由到任何应用服务器之前返回它。

问题是我从 varnish 到 haproxy 收到 503 错误,但如果我将 varnish 直接指向其中一个应用服务器,它就可以正常工作。有人有什么想法吗?

答案1

我曾有一个类似问题,不久前 - 而原因竟然是 SELinux。

如果 HAProxy 在特权端口(低于 1024)上运行,但您的应用服务器在更高的非特权端口上运行,则以下情况很可能发生。

某些设置(例如默认的 CentOS)的 SELinux 配置将阻止 Varnish 连接到特权端口。如果您正在auditd运行,您可以在审计日志中验证这一点。

例如,在全新安装的 CentOS 6.2 上(当我的后端服务器在端口 81 上运行时):

grep varnish /var/log/audit/audit.log

type=AVC msg=audit(1331500393.450:25): avc: denied { name_connect } for pid=1276 comm="varnishd" dest=81 scontext=unconfined_u:system_r:varnishd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket

可以通过以下方式确定 SELinux 执行的当前状态:

cat /selinux/enforce

(哪里1是强制执行,哪里0是允许执行)。

如果上述情况似乎是您的问题,请将 SELinux 设置为暂时允许并确认:

echo 0 >/selinux/enforce

如果您确认这确实是您的问题,您可以使用audit2allow -a -w(CentOS 上 policycoreutils-python 包的一部分)来分析您的审计日志并生成必要的规则,或者您可以尝试以下操作:

setsebool -P varnishd_connect_any 1

相关内容