我有 nginx 作为 LB。还有 2 个 Apache 作为 Web 服务器。假设我有不同的域名:
- www.example.com
- checkout.example.com
两个域将位于相同的 2 个 Apache 服务器中。但当然位于不同的目录下。并且VHost
Apache vhost 文件上有不同的文件。
就像下面的设计一样:
Nginx
|
-------------
| |
Apache Apache
下面是我当前现有的 Nginx .conf 文件,它不适用于第二个域(checkout.example.com)。
从 NGINX (mysites.conf):
upstream serverpool {
server 1.2.3.101:80 weight=1;
server 1.2.3.102:80 weight=1;
}
server {
listen 80;
server_name www.example.com checkout.example.com;
location / {
proxy_pass http://serverpool;
}
}
从两个 Apache 服务器相同的Vhost 文件(httpd.conf):
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html/www.example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName checkout.example.com
DocumentRoot /var/www/html/checkout.example.com/
</VirtualHost>
但每当我浏览那个(http://checkout.example.com), 这域名仍然出现在浏览器中..但内容为 (www.example.com),这是完全错误的。
请问我做错了什么?
答案1
您几乎应该始终设置Host
标头。否则,nginx 将恢复为默认值,proxy_set_header Host $proxy_host;
而对于您而言,serverpool
默认值对 apache 毫无用处。
看http://nginx.org/r/proxy_set_header和http://nginx.org/r/proxy_pass了解详情。
upstream serverpool {
server 1.2.3.101:80 weight=1;
server 1.2.3.102:80 weight=1;
}
server {
listen 80;
server_name www.example.com checkout.example.com;
location / {
proxy_pass http://serverpool;
proxy_set_header Host $host;
}
}
答案2
你还需要向上游服务器 IP 发送 HOST: 标头
这篇文章充分回答了这个问题
你的 nginx 配置也应该是这样的
upstream serverpool {
server 1.2.3.101:80 weight=1;
server 1.2.3.102:80 weight=1;
}
server {
listen 80;
server_name www.example.com checkout.example.com;
location / {
proxy_pass http://serverpool;
proxy_set_header Host $host;
}
}