【问题标题】:Apache: Multiple ProxyPassReverse, Multiple ServerNames, Single vhostApache:多个 ProxyPassReverse、多个 ServerNames、单个 vhost
【发布时间】:2014-05-03 14:18:45
【问题描述】:

我正在按如下方式进行特定设置:

  • 多个主机和不同端口中的多个应用程序
  • 运行 nginx 的服务器(假设 balancer.local)在 localhost 的 8080 端口上侦听,它充当在先前主机上运行的应用程序的代理/负载平衡器
  • 与nginx在同一台机器上运行的apache2服务器,监听80端口(对公众开放),直接为一些ServerName提供一些内容并将其他一些ServerName转发到localhost:8080,让nginx做负载均衡工作

我遇到的问题是要重定向到 nginx 的主机名数量正在快速增长,而且我有一个令人讨厌的虚拟主机列表,变得难以维护。

所以,问题是:有没有一种方法可以在 apache 中定义一个默认的 vhost,而不使用 ServerNames,并将所有与任何其他 vhost 不匹配的流量重定向到 localhost:8080?

我已经尝试删除 ServerName 指令,但我遇到的问题是 ProxyPassReverse 将其 hostname 插入传出 URL。

目前,我唯一能做的就是将每个 vhost 中的行数减少到最低限度,但还是太多了。

这里有一些配置示例:

Nginx:

upstream foo {
        server foo1.local:9999 max_fails=3 fail_timeout=30s;
        server foo2.local:9999 max_fails=3 fail_timeout=30s;
}

upstream bar {
        server bar1.local:8888 max_fails=3 fail_timeout=30s;
        server bar2.local:8888 max_fails=3 fail_timeout=30s;
}
server {
        listen *:8080;
        server_name  foo.public.com;
        access_log  /var/log/nginx/foo.public.com-access.log  proxy;
        error_log   /var/log/nginx/foo.public.com-error.log;
        location / {
                proxy_pass         http://foo/;
                include            /etc/nginx/proxy_app.conf;
        }
}
server {
        listen *:8080;
        server_name  bar.public.com;
        access_log  /var/log/nginx/bar.public.com-access.log  proxy;
        error_log   /var/log/nginx/bar.public.com-error.log;
        location / {
                proxy_pass         http://bar/;
                include            /etc/nginx/proxy_app.conf;
        }
}

阿帕奇:

<VirtualHost *:80>
        ServerName foo.public.com
        ErrorLog /var/log/httpd/nginx-redirect.sis.service-error.log
        CustomLog /var/log/httpd/nginx-redirect.sis.service-access.log combined
        ProxyPreserveHost On
        ProxyPass               /       http://localhost:8080/
        ProxyPassReverse        /       http://%{HTTP_HOST}:8080/
</VirtualHost>
<VirtualHost *:80>
        ServerName bar.public.com
        ErrorLog /var/log/httpd/nginx-redirect.sis.service-error.log
        CustomLog /var/log/httpd/nginx-redirect.sis.service-access.log combined
        ProxyPreserveHost On
        ProxyPass               /       http://localhost:8080/
        ProxyPassReverse        /       http://%{HTTP_HOST}:8080/
</VirtualHost>
<VirtualHost *:80>
    ServerName baz.public.com
    DocumentRoot /some/local/path
    <Directory "/">
      some irrelevant options
    </Directory>
</VirtualHost>

在这个例子中,只有两个虚拟主机被转发到 nginx,但在我的实际设置中,有超过 30 个!

正如我所说,我已经尝试使用没有ServerName 标签的单个虚拟主机来转发流量,但我最终在重定向中获得了http://balancer.local/some/path,这显然不起作用。

我还尝试使用单个 ServerName 和多个 ServerAlias,但在这种情况下,ProxyPassReverse 始终在响应中使用 ServerName。

有什么建议吗?

【问题讨论】:

  • > 我也尝试使用单个 ServerName 和多个 ServerAlias,但在这种情况下,ProxyPassReverse 始终在响应中使用 ServerName。你在 Apache 配置中有 UseCanonicalName On somwhere 吗?
  • @alexeyten:触摸!实际上,我的 httpd.conf 中有相反的 UseCanonicalName Off,但它似乎被某种方式忽略或根本不够用。所以,我在我的VirtualHost 中明确表示了这一点,这就成功了!请将您的评论转换为完整答案(建议将值明确设置为Off),我将接受它作为有效答案。

标签: apache nginx vhosts


【解决方案1】:

我也尝试使用单个 ServerName 和多个 ServerAlias,但在这种情况下,ProxyPassReverse 始终在响应中使用 ServerName。

您的 Apache 配置中可能有 UseCanonicalName On

尝试在您的虚拟主机中明确设置Off

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2020-12-15
    • 2021-06-16
    • 1970-01-01
    • 2017-07-26
    • 2023-03-26
    • 2012-10-18
    • 2016-08-09
    • 2018-11-11
    相关资源
    最近更新 更多