使用 Nginx 作为具有虚拟主机的 Apache 服务器的负载均衡器

使用 Nginx 作为具有虚拟主机的 Apache 服务器的负载均衡器

下面的附图代表我正在构建的应用程序堆栈。Apache 节点彼此完全相同,并且每个节点都服务于相同的虚拟主机,例如 example1.com、example2.com 和 example3.com。此外,对于具有数据库后端的 Apache 节点所服务的虚拟主机,数据库将托管在 Galera 集群节点上。所有这些节点都运行 Ubuntu 16.06。

到目前为止,我已经能够成功配置大部分设置,只是我似乎无法通过 Nginx Web 负载均衡器传递主机名。例如,当我访问 example1.com(并不断刷新)时,我可以看到应用程序正在从每个 Apache 节点正确地交替提供服务。

但是当我访问 example2.com 时,仍然显示 example1.com。这不是我的本地/etc/hosts文件的问题。我相信这是因为我没有正确配置 Nginx 负载平衡器来传递主机名,以便 Apache 节点对其进行解释。

以下是我链接的 3 个 nginx 服务器块sites-enabled

#/etc/nginx/sites-enabled/example1.dev
upstream example1 {
    least_conn;
      server do.webserver1:80;
      server do.webserver2:80;
  }

server {
  listen 80;
  server_name example1.dev;
  location / {
    proxy_pass http://example1;
  }
}

#/etc/nginx/sites-enabled/example2.dev
upstream example2 {
    least_conn;
      server do.webserver1:80;
      server do.webserver2:80;
  }

server {
  listen 80;
  server_name example2.dev;
  location / {
    proxy_pass http://example2;
  }
}

#/etc/nginx/sites-enabled/example3.dev
upstream example3 {
    least_conn;
      server do.webserver1:80;
      server do.webserver2:80;
  }

server {
  listen 80;
  server_name example3.dev;
  location / {
    proxy_pass http://example3;
  }
}

以下是我为 Apache 节点设置的 3 个 vhost 文件:

#/etc/apache2/sites-available/example1.dev.conf
<VirtualHost *:80>
        ServerName example1.dev
        ServerAlias www.example1.dev
        ServerAdmin [email protected]
        DocumentRoot /var/www/example1.dev/public_html

        ErrorLog /var/www/example1.dev/error.log
        LogLevel warn
        CustomLog /var/www/example1.dev/access.log combined
</VirtualHost>
<Directory "/var/www/html/example1.dev/public_html">
        AllowOverride All

        Order allow,deny
        Allow from all
</Directory>

#/etc/apache2/sites-available/example2.dev.conf
<VirtualHost *:80>
        ServerName example2.dev
        ServerAlias www.example2.dev
        ServerAdmin [email protected]
        DocumentRoot /var/www/example2.dev/public_html

        ErrorLog /var/www/example2.dev/error.log
        LogLevel warn
        CustomLog /var/www/example2.dev/access.log combined
</VirtualHost>
<Directory "/var/www/html/example2.dev/public_html">
        AllowOverride All

        Order allow,deny
        Allow from all
</Directory>

#/etc/apache2/sites-available/example3.dev.conf
<VirtualHost *:80>
        ServerName example1.dev
        ServerAlias www.example3.dev
        ServerAdmin [email protected]
        DocumentRoot /var/www/example3.dev/public_html

        ErrorLog /var/www/example3.dev/error.log
        LogLevel warn
        CustomLog /var/www/example3.dev/access.log combined
</VirtualHost>
<Directory "/var/www/html/example3.dev/public_html">
        AllowOverride All

        Order allow,deny
        Allow from all
</Directory>

在我添加 Nginx 负载均衡器之前,Apache vhost 配置工作正常。它们都链接到sites-enabled

我猜想这是因为如果 Apache 无法识别该如何处理请求,它将加载第一个启用的站点。对吗?

先简单介绍一下,我通常是一名 Web/移动应用开发人员,但最近我开始深入研究开发运营、站点可靠性和编排/自动化。这是我正在测试的第一个项目。

有人能告诉我该怎么做吗?非常感谢!

应用程序集群的图形表示

答案1

我只需要向proxy_set_header Host $http_host;nginx 服务器块配置文件添加如下内容:

upstream example2 {
    least_conn;
      server do.webserver1:80;
      server do.webserver2:80;
  }

server {
  listen 80;
  server_name example2.dev www.example2.dev;
  proxy_set_header Host $http_host;
  location / {
    proxy_pass http://example2;
  }
}

我对每个服务器块都执行了此操作,现在它可以正常工作了!

谢谢@JoshuaGriffiths!

相关内容