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
,需要指定Kubernetes
的CoreDNS
地址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;
}
补充
Kubernetes
中Service
的地址可能会漂移,可以缩短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,371 · Posted: 2024-01-23
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...