【发布时间】: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 Onsomwhere 吗? -
@alexeyten:触摸!实际上,我的 httpd.conf 中有相反的
UseCanonicalName Off,但它似乎被某种方式忽略或根本不够用。所以,我在我的VirtualHost中明确表示了这一点,这就成功了!请将您的评论转换为完整答案(建议将值明确设置为Off),我将接受它作为有效答案。