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

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

到目前为止,我已经能够成功configuration这个设置的大部分,除了我似乎无法通过Nginx Web负载均衡器传递主机名。 例如,当我去example1.com(并不断刷新),我可以看到,应用程序交付正确地从每个Apache节点交替。

但是当我去example2.com时,仍然显示example1.com。 这不是我的本地/etc/hosts文件的问题。 我相信这是因为我没有正确configurationNginx负载均衡器来传递主机名,以便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; } } 

这里是我的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 vhostconfiguration正常工作。 它们都链接在sites-enabled

我的猜测是这样的,因为如果在这种情况下Apache不能识别如何处理请求的话,Apache会加载第一个启用的站点。 是对的吗?

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

任何人都可以给我一些见解,我怎么能做到这一点? 非常感谢!

应用程序集群的图形表示

我只需要添加proxy_set_header Host $http_host; 到如下所示的nginx服务器块configuration文件:

 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!