Nginx [emerg] host not found in upstream

Nginx About 1,172 words

错误信息

❯ nginx -t
nginx: [emerg] host not found in upstream "abc" in /opt/homebrew/etc/nginx/nginx.conf:57
nginx: configuration file /opt/homebrew/etc/nginx/nginx.conf test failed

初始配置

location /abc {
    proxy_pass http://abc;
}

错误原因

Nginx启动时需要解析proxy_pass代理的下游地址,如果DNS无法解析,则将启动失败。

解决方法

proxy_pass以变量的方式可以让Nginx懒加载。用时再解析。

location /abc {
    set $target http://abc;
    proxy_pass $target;
}

Docker 容器

对于Docker容器下的Nginx,需要添加resolver,并指定127.0.0.11(注意不是127.0.0.1

location /abc {
    resolver 127.0.0.11;
    set $target http://abc;
    proxy_pass $target;
}

Kubernetes 环境

对于Kubernetes容器下的Nginx,需要指定KubernetesCoreDNS地址kube-dns.kube-system.svc.cluster.local

注意:被代理的upstream地址必须是完整Service名。

location /abc {
    resolver kube-dns.kube-system.svc.cluster.local;
    set $target http://my-service.my-namespace.svc.cluster.local;
    proxy_pass $target;
}

补充

KubernetesService的地址可能会漂移,可以缩短Nginx缓存DNS解析结果的时间。默认是5分钟。

使用valid指定缓存正确解析的地址的时间。

location /abc {
    resolver kube-dns.kube-system.svc.cluster.local valid=30s;
    set $target http://my-service.my-namespace.svc.cluster.local;
    proxy_pass $target;
}

参考

https://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

Views: 1,982 · Posted: 2024-01-23

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh