通过显示 404 的私有网络的 nginx 上游负载平衡
nginx upstream load balancing through private networking showing 404
我在 Digital Ocean 上有两个 droplet。一台带 nginx 的负载均衡器和一台带 nginx 反向代理的 node/express 网络服务器。我们称它们为 load-1 和 web-1。 load-1 处理 SSL 终止并通过 nginx 上游模块通过 http 通过 Digital Ocean 提供的私有网络将请求转发到 web-1。
在 public IP 上访问 web-1 时一切正常。通过 load-1 访问时,我只收到 404。我已验证请求实际上已转发到 web-1,这是 web-1 的 nginx 访问日志在从 load-1 收到的每个请求上显示的内容:
load-1.private.ip - [09/Jan/2017:13:14:00 +0000] "GET / HTTP/1.0" 404 580 "-" >"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) >Chrome/55.0.2883.87 Safari/537.36"
为什么直接请求有效时转发请求无效?由于 web-1 在直接访问时可以正常工作,所以我将请求从 load-1 转发到 web-1 的方式一定有问题吗?
加载 1 时我的 nginx 配置:
upstream web-servers {
server web-1.private.ip;
}
server {
listen 80;
listen 443 ssl;
server_name mydomain.com;
ssl on;
ssl_certificate /etc/ssl/mycert.crt;
ssl_certificate_key /etc/ssl/mykey.key;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000";
location / {
proxy_pass http://web-servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
我在 web-1 上的 nginx 配置:
server {
listen 80;
server_name web-1.public.ip web-1.private.ip;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
简单地说,web-1 上的 Nginx 不知道要使用什么配置。
Nginx looks at the host header 确定要使用的服务器配置。您在 load-1 的代理设置中将主机设置为 mydomain.com
,但是在 web-1.
上没有对应的条目 mydomain.com
或者
- 在 web-1 上设置
default_server
标志(通过将 listen 80;
指令更改为 listen 80 default_server;
)
- 删除任何其他
server
块,因此这是唯一的块(导致 Nginx 将其视为默认服务器)
- 将
mydomain.com
添加到 server_name
列表
我在 Digital Ocean 上有两个 droplet。一台带 nginx 的负载均衡器和一台带 nginx 反向代理的 node/express 网络服务器。我们称它们为 load-1 和 web-1。 load-1 处理 SSL 终止并通过 nginx 上游模块通过 http 通过 Digital Ocean 提供的私有网络将请求转发到 web-1。
在 public IP 上访问 web-1 时一切正常。通过 load-1 访问时,我只收到 404。我已验证请求实际上已转发到 web-1,这是 web-1 的 nginx 访问日志在从 load-1 收到的每个请求上显示的内容:
load-1.private.ip - [09/Jan/2017:13:14:00 +0000] "GET / HTTP/1.0" 404 580 "-" >"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) >Chrome/55.0.2883.87 Safari/537.36"
为什么直接请求有效时转发请求无效?由于 web-1 在直接访问时可以正常工作,所以我将请求从 load-1 转发到 web-1 的方式一定有问题吗?
加载 1 时我的 nginx 配置:
upstream web-servers {
server web-1.private.ip;
}
server {
listen 80;
listen 443 ssl;
server_name mydomain.com;
ssl on;
ssl_certificate /etc/ssl/mycert.crt;
ssl_certificate_key /etc/ssl/mykey.key;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
add_header Strict-Transport-Security "max-age=31536000";
location / {
proxy_pass http://web-servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
我在 web-1 上的 nginx 配置:
server {
listen 80;
server_name web-1.public.ip web-1.private.ip;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
简单地说,web-1 上的 Nginx 不知道要使用什么配置。
Nginx looks at the host header 确定要使用的服务器配置。您在 load-1 的代理设置中将主机设置为 mydomain.com
,但是在 web-1.
mydomain.com
或者
- 在 web-1 上设置
default_server
标志(通过将listen 80;
指令更改为listen 80 default_server;
) - 删除任何其他
server
块,因此这是唯一的块(导致 Nginx 将其视为默认服务器) - 将
mydomain.com
添加到server_name
列表