Hung Vu
Hung Vu

Reputation: 5934

Couldn't start nginx-proxy docker image with error "Contents of /etc/nginx/conf.d/default.conf did not change"

I am playing with "nginx-proxy", pulled the image "jwilder/nginx-proxy:latest" to my local host, tried to start it but got this error "Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload'", and when I tried to go to the server at port 80: it returned 503 Bad Gateway:

Here is my docker-compose file:

version: '3.0' services: proxy: image: jwilder/nginx-proxy:latest container_name: nginx-proxy ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - /etc/nginx/vhost.d - /usr/share/nginx/html - /docker/certs:/etc/nginx/certs:ro network_mode: "bridge"

and the error I've got

WARNING: /etc/nginx/dhparam/dhparam.pem was not found. A pre-generated dhparam.pem will be used for now while a new one is being generated in the background.Once the new dhparam.pem is in place, nginx will be reloaded. forego | starting dockergen.1 on port 5000 forego | starting nginx.1 on port 5100 dockergen.1 | 2018/07/18 04:14:14 Generated '/etc/nginx/conf.d/default.conf' from 1 containers dockergen.1 | 2018/07/18 04:14:14 Running 'nginx -s reload' dockergen.1 | 2018/07/18 04:14:14 Watching docker events dockergen.1 | 2018/07/18 04:14:14 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload'

Any idea is much appreciated. Cheers

Upvotes: 2

Views: 4124

Answers (3)

Jonathan
Jonathan

Reputation: 11

I ran into this issue in 2021, but I was able to resolve it. Documenting as this thread is at the top of Google searches.

tl;dr: Run the containers without a custom NGINX config at least once

This happened to me as I was migrating from one host to another. I migrated all of my files over and then started running my containers one by one.

For me, I had a custom NGINX config file that proxied a path to a separate docker container that was not created yet.

  - "~/gotti/volumes/nginx-configs:/etc/nginx/vhost.d"

in this mount, I had a mydomain.conm config file with the following contents

# reverse proxy
location /help {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_pass http://ghost:2368; <----- Problem: This container didn't exist yet.
    proxy_redirect off;
}

This invalid reference prevented NGINX from proxying my app and thus prevented a SSL cert from being issued.

Upvotes: 0

charlie arehart
charlie arehart

Reputation: 6894

Hung Vu, was that the entirety of your docker-compose file, or just the section for jwilder/nginx-proxy? I ask because I experienced this error when I had simply forgotten to add the "virtual_host" environment variable for my other services, after dropping in that service definition for the nginx-proxy. Doh! :-) See its docs, or atline's example here.

Upvotes: 0

atline
atline

Reputation: 31654

It's default behavior for this image, you can see /etc/nginx/conf.d/default.conf:

server {
    server_name _;
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    return 503;
}

So when your visit, it will give 503 error.

This is a service discovery service, so you need to use it.

See the official example:

docker-compose.yaml

version: '2'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  whoami:
    image: jwilder/whoami
    environment:
      - VIRTUAL_HOST=whoami.local

If you use docker-compose up to start it, then have a look at /etc/nginx/conf.d/default.conf again, you will see:

server {
    server_name _;
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    return 503;
}
# whoami.local
upstream whoami.local {
    ## Can be connected with "a_default" network
    # a_whoami_1
    server 172.20.0.2:8000;
}
server {
    server_name whoami.local;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
            proxy_pass http://whoami.local;
    }
}

Here, jwilder/nginx-proxy watch the events of docker, and add a proxy to nginx reverse settings.

So if execute curl -H "Host: whoami.local" localhost on your host machine, it will print I'm 5b129ab83266.

server 172.20.0.2 in nginx settings is your application container's ip, it will changes everytime you start a new container, so with this method, you can free to know the ip of your application container, just use inverse proxy from nginx.

Many service such as marathon-lb which is a component of marathon who known as a mesos framework also could afford such function, maybe k8s also? Anyway, you need to know principle of this image, a useful doc for your reference: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

Upvotes: 3

Related Questions