如果无法访问默认服务器,Nginx使用回退上游服务器

omhiaaxx  于 2023-01-04  发布在  Nginx
关注(0)|答案(1)|浏览(164)

我目前正在使用Nginx配置来将我的一些Docker容器分组到子域中。这些容器中的一些没有永久运行,并且阻止nginx启动(错误为host not found in upstream "somecontainer:5000" in /etc/nginx/conf.d/default.conf:48),因为上游中定义的主机不可访问。有没有办法设置一个备用上游服务器,以防第一个服务器没有运行?
当前配置如下所示:

upstream somecontainer {
    server somecontainer:5000;
    # here i need something like: if host is unreachable
    # server fallbackserver:5000
}

server {
     listen 443 ssl http2;
     server_name some.subdomain.com;
     root /public_html/;

     client_max_body_size 16384m;

     ssl on;
     server_tokens off;
     ssl_certificate sslstuff;
     ssl_certificate_key sslstuff;

     ssl_buffer_size 8k;
     ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
     ssl_prefer_server_ciphers on;
     ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

     location / {
        proxy_pass        http://somecontainer;
        proxy_set_header  Host              $http_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;
        proxy_read_timeout                  900;
    }
}
pkwftd7m

pkwftd7m1#

不幸的是,这是因为Nginx的设计。
您可以在proxy_pass中使用变量,该变量将在运行时解析,因此在nginx加载时不会出现此类错误:

set $destination_host somecontainer;
        proxy_pass http://$destination_host:5000;

但上述解决方案的缺点是,你不能利用nginx upstream,如指定负载平衡算法或加权平衡...
另外,如果上游和动态服务初始化都需要,你必须修补nginx。我有一个补丁,它改变了Nginx的设计,在这里讨论过,我在生产环境中使用了一段时间。如果修补对你来说不是问题,你可以检查它https://github.com/ZigzagAK/ngx_dynamic_upstream/issues/8#issuecomment-814702336

相关问题