下面的附图代表我正在构建的应用程序堆栈。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!