连接到 aws 的上游 nginx 时,connect() 失败(113:主机无法访问)

NIr*_*odi 8 nginx amazon-web-services

我知道这个问题被问过多次并且与 aws 无关。

2020/07/29 10:23:17 [error] 6#6: *37749 connect() failed (113: Host is unreachable) while connecting to upstream, client: 
Run Code Online (Sandbox Code Playgroud)

当我在 aws 云中部署 nginx 时,我遇到了这个问题。

本地化配置

location /test {
         proxy_pass http://test-service;
         proxy_set_header HOST $host;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
Run Code Online (Sandbox Code Playgroud)

上游部分如下

upstream test-service {
    server test-service.internal:38102;
    keepalive 10;
}
Run Code Online (Sandbox Code Playgroud)

test-service.internal是我的route53托管区域条目,它指向一些internal application load balanceraws。

当我部署/重新启动 nginx 服务器时,它运行良好,但几天后(大约两/三天)它只会挂在代理通道中。当我加载 html 内容时,它工作正常,但代理传递调用卡住了。

任何解决方案会有帮助吗?

谢谢。

NIr*_*odi 4

经过长时间的调试,我们发现nginx会缓存test-service.internalips。AWS 将更改其内部负载均衡器的 ip。

所以nginx缓存的ips不再存在。所以我们需要提供新的ip。

解决方案:

nginx已经提供了resolver指令

location /test {
           resolver 10.0.0.2 127.0.0.1 valid=30s;
           set $backend_servers test-service.internal;
           proxy_pass http://$backend_servers:38102;
         #proxy_pass http://test-service;
         proxy_set_header HOST $host;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_http_version 1.1;
           proxy_set_header Connection "";
         }
Run Code Online (Sandbox Code Playgroud)

我们改变了两件事。

  1. 添加了解析器。

  2. 删除了上游(nginx 不支持解析器。nginx-plus 支持带解析器的上游)

    resolver 10.0.0.2 127.0.0.1 valid=30s;    
    set $backend_servers test-service.internal;
    proxy_pass http://$backend_servers:38102;
    
    Run Code Online (Sandbox Code Playgroud)

现在我们使用 aws dns 服务器每 30 秒10.0.0.2解析一次test-service.internal