Apache:多个ProxyPassReverse,多个ServerNames,单个vhost

时间:2014-03-25 15:49:53

标签: apache nginx vhosts

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

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

我遇到的问题是要重定向到nginx的主机名数量正在快速增长,而且我有一个烦人的vhost列表,这些列表很难维护。

所以,问题是:有没有办法在没有ServerNames的情况下在apache中定义默认vhost,并将所有与其他vhost不匹配的流量重定向到localhost:8080?

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

目前,我唯一能做的就是将每个虚拟主机中的行数减少到最小,但它仍然太多了。

这里有一些配置示例:

Nginx的:

hostname

的Apache:

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;
        }
}

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

正如我所说,我已经尝试使用没有<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> 标记的单个虚拟主机来转发流量,但我最终在重定向中获得了http://balancer.local/some/path,这显然无效。< / p>

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

  

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

可能你的Apache配置中有UseCanonicalName On

尝试在VirtualHost中明确设置Off