无法启动错误为“ /etc/nginx/conf.d/default.conf的内容未更改”的Nginx代理docker映像

时间:2018-07-18 04:24:04

标签: docker nginx

我正在玩“ nginx-proxy”,将图像“ jwilder / nginx-proxy:latest”拖到我的本地主机上,尝试启动它,但出现此错误“ / etc / nginx / conf的内容.d / default.conf保持不变。跳过通知'nginx -s reload'”,当我尝试通过端口80访问服务器时,它返回503 Bad Gateway:

这是我的docker-compose文件:

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"

还有我遇到的错误

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'

任何想法都值得赞赏。干杯

3 个答案:

答案 0 :(得分:1)

这是此图片的默认行为,您可以看到/etc/nginx/conf.d/default.conf

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

因此,当您访问时,它会给503错误。

这是一项服务发现服务,因此您需要使用它。

请参阅官方示例:

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

如果您使用docker-compose up启动它,然后再次查看/etc/nginx/conf.d/default.conf,则会看到:

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;
    }
}

在这里,jwilder/nginx-proxy观察docker的事件,并将代理添加到nginx反向设置。

因此,如果在主机上执行curl -H "Host: whoami.local" localhost,它将打印I'm 5b129ab83266

nginx设置中的

server 172.20.0.2是应用程序容器的ip,每次启动新容器时都会更改,因此使用此方法,您可以自由地知道应用程序容器的ip,只需使用{{1} }。

许多服务,例如inverse proxy from nginx,它是marathon-lb的组成部分,被称为mesos框架,也可以提供这种功能,也许marathon也可以提供这种功能?无论如何,您需要了解此图像的原理,这是一个有用的文档,供您参考:http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

答案 1 :(得分:0)

Hung Vu,这是您的整个docker-compose文件,还是jwilder / nginx-proxy的一部分?我问是因为在为Nginx代理添加服务定义后,我只是忘记为其他服务添加“ virtual_host”环境变量而遇到了此错误。 h! :-)在此处查看其文档或atline的示例。

答案 2 :(得分:0)

我在 2021 年遇到了这个问题,但我能够解决它。记录下来,因为此线程位于 Google 搜索的顶部。

tl;dr:至少运行一次没有自定义 NGINX 配置的容器

这发生在我从一个主机迁移到另一个主机时。我迁移了所有文件,然后开始一个一个地运行我的容器。

对我来说,我有一个自定义的 NGINX 配置文件,它代理了一个尚未创建的单独 docker 容器的路径。

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

在这个挂载中,我有一个包含以下内容的 mydomain.conm 配置文件

# 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;
}

此无效引用阻止 NGINX 代理我的应用,从而阻止颁发 SSL 证书。