nginx启动错误: [emerg] host not found in upstream "<host>"

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx启动错误: [emerg] host not found in upstream "<host>"相关的知识,希望对你有一定的参考价值。

参考技术A nginx的错误日志里面:

就是说<myhost>不可达,解析不了;但我们实际上能ping通这个地址,说明地址是有效的。

nginx的配置例子:

Google了一下,看到这么个解释:
原文: https://stackoverflow.com/questions/17685674/nginx-proxy-pass-with-remote-addr

这正好是我的场景。

我们根据路径的serviceID路由到一个真正的swarm service上面去,这里正好使用了变量$1,表示service ID。举例来说,就是把nginx的请求:http://<nginx-host>:<nginx-port>/service/service1/api/v1/hello地址转发到swarm service: http://service1:8080/api/v1/hello

nginx启动的时候需要去解析upstream的DNS,如果解析失败就无法启动(这可能是nginx预留的问题)。

怎么办呢,最简单的办法是把机器名换成IP地址,这样虽然可以绕开问题,但是一般不会用IP地址吧,都是用的机器名域名。

如果proxy_pass的URL里面包含变量,那么nginx就使用内置的resolver,而这个内置的resolver无法解析docker swarm service的地址。

使用resolver指令,让它指向docker swarm的内置DNS地址,这样就可以解析swarm service的地址了。

127.0.0.11是docker swarm的内资DNS server,可以用来解析swarm service地址。
另外一般建议使用valid=30s,因为resolver缺省的刷新时间是5分钟,那是对普通静态DNS的,而对于docker swarm这种类型服务,由于swarm可能会不确定的重启,为降低service down的时间,可以把valid值缩短:

以上是关于nginx启动错误: [emerg] host not found in upstream "<host>"的主要内容,如果未能解决你的问题,请参考以下文章

nginx启动报错:host not found in upstream

带有Nginx 1.6.2的CentOS 6.6 - 突然无法重启nginx - nginx:[emerg] open()“/ usr / share / nginx / on”失败(13:权限被拒绝

LNMP环境搭建之Nginx服务启动失败

nginx启动提示nginx: [emerg] bind() to 0.0.0.0:8080 failed (98: Address already in use)

Nginx 启动提示 [emerg] 配置中没有“事件”部分

启动Nginx报错nginx: [emerg] getpwnam(