我有一个 nginx 反向代理,它将请求从外部 amazon ELB 代理到内部 ELB。
我有 6 个后端实例来处理请求。启用站点的配置如下所示,但端口号和 proxy_pass 不同。其他一切都相同:
server {
listen 3000;
location / {
proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
include /etc/nginx/proxy.conf;
}
}
大约每 24 小时,其中一个配置就会停止工作。所有其他代理都正常工作。如果我重新启动 nginx,所有配置都会再次正常工作。error.log 中没有任何内容,访问日志、系统日志或 dmesg 中也没有任何异常。
这是已知的吗?我的代理配置是否出了问题?还有其他日志可以查看吗?
答案1
这个问题的答案是 ELB 有时会更改 ip 地址,并且 nginx 在启动期间会进行名称解析。
为了解决这个问题,您的 VPC 中始终有一个 DNS 服务器,地址为 0.2。因此,如果本地 IP CIDR 为 10.0.0.0/16,则 DNS 服务器位于 10.0.0.2。
将其添加到 nginx 配置。
resolver 10.0.0.2 valid=10s;
proxy_pass 也需要定义为变量否则 nginx 只会解析一次。因此,根据上述配置,这是正确的配置:
server {
listen 3000;
location / {
resolver 10.0.0.2 valid=10s;
set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
proxy_pass $backend;
include /etc/nginx/proxy.conf;
}
}
答案2
如果您的 proxy_pass 没有像示例所示那样直接传递到一个 URL(http://amazonaws.com),而是使用代理上游服务器场,如下所示:
upstream my_upstream {
server1 127.0.0.1:1337;
server2 127.0.0.1:1338;
}
location / {
proxy_pass http://my_upstream;
}
这样你就不用太担心某个上游服务器暂时出现故障。因为它们都执行相同的工作。如果其中一个服务器无法回复,则下一个服务器将代理该服务器进行回复。这样就高枕无忧了。
Nginx 将自动跳过发生故障的机器 x 秒。直到您修复它,或者直到它自行恢复。(http://wiki.nginx.org/HttpUpstreamModule)
因此,无论中断的原因是什么,通过将其分布在上游农场,这都会转变为一种更简单的设置。