我有一个 Ubuntu 12.04.3 服务器,用作 DNS 服务器 (BIND9)、Web 服务器 (Apache2) 和反向代理服务器 (haproxy)。我的目标是让 haproxy 重定向到网络上的一些其他服务器,其中一些服务器我想重定向到“子 URL”(不确定这是否是正确的术语。请参见下面的示例)
用户进入“monitor.example.com”> haproxy 重定向到 > “1.1.1.1:80/nagios”
我的 DNS 服务器是使用通配符子域名设置的,现在如果我访问 monitor.example.com,它会转到监控服务器上的默认 apache 页面,但如果我可以让它自动指向 /nagios 页面,它会看起来更美观,输入起来也会更短。如果我访问 monitor.example.com/nagios,它会按预期工作,但有点多余。
我花了一段时间寻找解决方案,但没有找到问题的答案。有人知道这是否可能吗?如果可能的话,我该如何解决?这是我的 haproxy.conf 文件:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#chroot /usr/share/haproxy
user haproxy
group haproxy
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend http-in
bind 1:80
acl host_apache hdr(host) -i example.com
acl host_monitor hdr(host) -i monitor.example.com
acl host_cloud hdr(host) -i cloud.example.com
use_backend apache if host_apache
use_backend monitor if host_monitor
use_backend cloud if host_cloud
backend apache
server web3 127.0.0.1:81
backend monitor
server monitor 1.1.1.1:80/monitor
backend cloud
server cloud 2.2.2.2:80
如果有人有其他建议或我可以使用的其他程序来实现我的目标,我愿意听取建议。我不使用 haproxy 不是出于任何特殊原因。我也尝试过 pound,但也无法配置它。
谢谢阅读!
布里格兹
答案1
虽然我喜欢 HAProxy,但我同意 davidgo 的观点,它可能不是这项工作的最佳工具。我还认为,具有多个命名虚拟主机和 mod_rewrite 的 Apache 将请求代理到必要的后端是可行的方法。
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
ProxyPreserveHost On
RewriteRule ^/(.*)$ http://127.0.0.1:81/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName monitor.example.com
RewriteEngine on
ProxyPreserveHost On
RewriteRule ^/(.*)$ http://1.1.1.1:80/monitor/$1 [P]
</VirtualHost>
根据后端的应用程序,重写可能会或可能不会完全按照您的预期工作。例如,如果 nagios 预计其资源位于 /monitor 的根目录下,并且它链接到 /monitor/someurl 之类的内容,那么您的重写将导致 URL 在到达您的服务器时最终位于 /monitor/monitor/someurl。这可能可以通过另一个 RewriteRule 或当前规则中的一点正则表达式来克服。
您也可以直接使用带有 ProxyPass 指令的 mod_proxy,而不是 mod_rewrite (在这种情况下,也使用 mod_proxy)