NGINX 是否使用“serverpool”作为同一 Apache 服务器上不同域的 LB?

NGINX 是否使用“serverpool”作为同一 Apache 服务器上不同域的 LB?

我有 nginx 作为 LB。还有 2 个 Apache 作为 Web 服务器。假设我有不同的域名:

  • www.example.com
  • checkout.example.com

两个域将位于相同的 2 个 Apache 服务器中。但当然位于不同的目录下。并且VHostApache 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_headerhttp://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 在反向代理时传递上游的主机名

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

相关内容