【问题标题】:Proxy HTTP requests using subdomain使用子域代理 HTTP 请求
【发布时间】:2011-08-24 19:37:12
【问题描述】:

我正在尝试完成以下工作:

  1. HTTP 请求进入地址 subdomain.domain.com 到运行代理的机器上的公共 ip(可能是 apache?更好?)
  2. 基于子域,我希望将请求重定向到私有 IP 和特定端口上的内部机器。该请求的响应将来自该内部机器。

我有哪些选择?有什么通用的指导方针可以实现这一目标吗?什么是好的代理实现选择?随着时间的推移,还需要动态添加子域,这些子域重定向到特定的内部 ips/端口。

ssl 证书如何在带有子域的设置中发挥作用?每个子域都需要单独的证书吗?

【问题讨论】:

  • 我认为这个问题对于 serverfault.com 来说更具话题性。我已经投票决定将它迁移到那里并回答它。如果有足够多的其他人同意,它将为您移动。

标签: networking proxy https dns subdomain


【解决方案1】:

设置并不难。您只需为每个子域创建一个虚拟主机并将虚拟主机配置为代理。无论您选择哪种代理软件,方法都是相同的。我建议你使用 Nginx 作为反向代理,因为配置更简单,性能也比 Apache 好得多。如果您仍想使用 Apache,请确保您不在代理机器上运行 PHP,并使用 mpm_worker 而不是 mpm_prefork。

您可以编写一个脚本,将新的子域添加到配置文件中。这应该不会太难,因为它们看起来几乎相同,除了 SSL 证书的路径和主干服务器的 IP。

对于 SSL,您可以使用覆盖整个域(包括子域)的通配符证书。并非所有平台都支持此功能,但在过去几年中支持有所增加,因此应该非常安全。

否则,如果没有通配符证书,则每个子域都需要一个证书和一个单独的 IP 地址(由于 SSL 连接是在知道域名之前建立的,因此您需要通过不同的 IP 来区分不同的证书)。

【讨论】:

    【解决方案2】:

    Apache 完全可以解决这个问题。你可以做使用mod_proxy的虚拟主机:

    <VirtualHost *:80>
        ServerAdmin xxx@yyy.com
        ServerName foo.yyy.com
    
        ProxyRequests Off
            <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
        ProxyErrorOverride On                       
        ProxyPass / http://192.168.1.1/
        ProxyPassReverse / http://192.168.1.1/
        <Location />
            Order allow,deny
            Allow from all
            </Location>
    
    </VirtualHost>
    

    如果您希望托管成百上千个子域,您实际上可以使用 mod_rewrite 来执行此操作,使用涉及本地名称查找的技巧,允许您将 bar.yyy.com 代理到 local.bar.yyy.com 之类的名称。使用 mod_rewrite 进行大规模虚拟主机是mentioned in the apache docs,使用它来代理而不是仅仅重写是相对简单的。这样做的好处是可以纯粹使用 DNS 添加新的子域。

    就 SSL 而言,如果您只是使用 *.yyy.com 作为子域,您可以使用 wildcard certificate(我既不推荐也不反对 thwate,他们只是对其进行了合理的描述)。在一般情况下,虽然在单个公共 IP 地址 is a bit more tricky 后面托管多个 SSL 站点。

    【讨论】: