Search code examples
nginxdnsconsul

Nginx failing to resolve upstream with custom DNS resolver


docker run --rm --net=host -v $PWD/default.conf:/etc/nginx/conf.d/default.conf nginx
2019/05/12 17:02:49 [emerg] 1#1: host not found in upstream "tickethub.service.consul" in /etc/nginx/conf.d/default.conf:10
nginx: [emerg] host not found in upstream "tickethub.service.consul" in /etc/nginx/conf.d/default.conf:10

While dig shows the DNS record correctly:

dig @127.0.0.1 -p 8600 tickethub.service.consul

; <<>> DiG 9.12.3-P1 <<>> @127.0.0.1 -p 8600 tickethub.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57394
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tickethub.service.consul.  IN  A

;; ANSWER SECTION:
tickethub.service.consul. 0 IN  A   172.23.0.6
tickethub.service.consul. 0 IN  A   172.23.0.5
tickethub.service.consul. 0 IN  A   172.23.0.7

;; ADDITIONAL SECTION:
tickethub.service.consul. 0 IN  TXT "consul-network-segment="
tickethub.service.consul. 0 IN  TXT "consul-network-segment="
tickethub.service.consul. 0 IN  TXT "consul-network-segment="

;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Sun May 12 16:58:54 GMT 2019
;; MSG SIZE  rcvd: 209

And my nginx config:

server {
    listen       80;
    server_name  localhost;

    location / {
        resolver 127.0.0.1:8600;
        proxy_pass   http://tickethub.service.consul;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

What may be the issue?


Solution

  • mic drop

    It worked when I set the proxy_pass using a variable:

    location / {
        resolver consul;
        set $endpoint tickethub.service.consul;
        proxy_pass http://$endpoint/;
    }