我正在尝试使用 ProxyPass 和 ProxyPassReverse 通过 Apache 将请求代理到绑定到本地主机的另一个服务器实例,该实例位于 Vhost 存在的不同 TCP 端口上(当目标绑定到:5000 时,VHost 绑定到:80)。
但是,访问位置时我反复收到 HTTP 503。
根据ProxyPass 文档...
<VirtualHost *:80>
ServerName apacheserver.domain.local
DocumentRoot /var/www/redmine/public
ErrorLog logs/redmine_error
<Directory /var/www/redmine/public>
Allow from all
Options -MultiViews
Order allow,deny
AllowOverride all
</Directory>
</VirtualHost>
PassengerTempDir /tmp/passenger
<Location /rhodecode>
ProxyPass http://127.0.0.1:5000/rhodecode
ProxyPassReverse http://127.0.0.1:5000/rhodecode
SetEnvIf X-Url-Scheme https HTTPS=1
</Location>
我已经测试将备用服务器绑定到接口 IP 地址,并且出现了同样的问题。
服务器服务请求是 python paste:httpserver 的一个实例,并且已将其配置为使用 /rhodecode 后缀(因为我看到其他关于 ProxyPass 的帖子中提到了这一点)。项目本身的文档,Rhodecode,报告使用上述内容。
如果我瞄准另一个在不同端口上提供服务的服务器,问题仍然存在。
ProxyPass 是否允许代理到不同的 TCP 端口?
[更新]
我不会删除这个,以防有人遇到同样的问题。
我设置了一个 ErrorLog,并且在该 ErrorLog 中报告了以下错误:
[Wed Nov 09 11:36:35 2011] [error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:5000 (192.168.100.100) failed
[Wed Nov 09 11:36:35 2011] [error] ap_proxy_connect_backend disabling worker for (192.168.100.100)
经过进一步研究后,我尝试将 SELinux 设置为宽容(echo 0 >/selinux/enforce
),然后重试。
事实证明,SELinux 布尔值httpd_can_network_connect
必须设置为1
。
重启后持久保存:
setsebool -P httpd_can_network_connect=1
答案1
对于 SELinux 来说,解决此问题(鱼与熊掌兼得)的一个更好的方法是运行此命令以使 httpd_t 类型知道您正在使用的端口。
semanage port -a -p tcp -t http_port_t 5000
然后您可以关闭该布尔值并仍使其工作。