nginx 连接到上游时没有实时上游,但上游正常

bvjveswy  于 2023-03-12  发布在  Nginx
关注(0)|答案(3)|浏览(272)

我对NGINX有个很奇怪的问题。
我有下面的upstream.conf文件,其上游代码如下:

upstream files_1 {
    least_conn;
    check interval=5000 rise=3 fall=3 timeout=120 type=ssl_hello;

    server mymachine:6006 ;
}

在locations.conf中:

location ~ "^/files(?<command>.+)/[0123]" {
        rewrite ^ $command break;
        proxy_pass https://files_1 ;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

在/etc/主机中:

127.0.0.1               localhost               mymachine

当我这样做时:wget https://mynachine:6006/alive --no-check-certificate,我得到了HTTP request sent, awaiting response... 200 OK。我还验证了端口6006正在使用netstat进行侦听,并且没有问题。
但是当我向NGINX文件服务器发送请求时,我得到了以下错误:
连接到上游时没有实时上游,客户端:..,请求:“POST /文件/保存/2 HTTP/1.1,上游:“https://files_1/save
但上游还可以,到底出了什么问题?

omjgkv6w

omjgkv6w1#

当定义upstream时,Nginx处理目标服务器和一些可以启动或关闭的服务器。Nginx根据fail_timeout(默认为10s)和max_fails(默认为1)来决定上游服务器是否关闭
因此,如果有几个慢请求超时,Nginx可以判断上游服务器宕机了,因为只有一个,整个上游服务器实际上宕机了,Nginx报告no live upstreams
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/
我有一个类似的问题,你可以防止这个覆盖这些设置。
例如:

upstream files_1 {
    least_conn;
    check interval=5000 rise=3 fall=3 timeout=120 type=ssl_hello max_fails=0;
    server mymachine:6006 ;
}
r6vfmomb

r6vfmomb2#

我遇到了相同的错误no live upstreams while connecting to upstream
我的是SSL相关的:加上proxy_ssl_server_name on就解决了。

location / {
    proxy_ssl_server_name on;
    proxy_pass https://my_upstream;
  }
but5z9lq

but5z9lq3#

如果你使用的是docker-compose设置,你必须在url中使用服务名称而不是IP,例如:

server{
           location / {
                proxy_pass http://com_api;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
            }
    }
        
   upstream com_api {
      server api:6060; //<----------where api is service name
   }

相关问题