我正在玩“ 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'
任何想法都值得赞赏。干杯
答案 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
。
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 证书。