某些 nginx 反向代理配置每天停止工作一次

某些 nginx 反向代理配置每天停止工作一次

我有一个 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

因此,无论中断的原因是什么,通过将其分布在上游农场,这都会转变为一种更简单的设置。

相关内容