反向代理到 URL

反向代理到 URL

我有一个 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)

相关内容