使用Nginx作为带有vhost的Apache服务器的负载均衡器

时间:2017-11-10 04:40:35

标签: ubuntu nginx load-balancing

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

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

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

以下是我在sites-enabled

中链接的3个nginx服务器块
#/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 webmaster@example1.dev
        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 webmaster@example2.dev
        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 webmaster@example3.dev
        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在这种情况下不知道如何处理请求,那么Apache会加载第一个启用了网站的网站。是吗?

在某些情况下,我通常是网络/移动应用程序开发人员,但我最近一直在深入研究开发,网站可靠性和编排/自动化。这是我第一个测试的项目。

有谁能给我一些关于如何做到这一点的见解?非常感谢提前!

Graphical representation of application cluster

1 个答案:

答案 0 :(得分:0)

我只需要将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;
  }
}

我对每个服务器块做了这个,现在它可以工作了!