docker 和 jwilder/nginx-proxy http/https 问题
docker and jwilder/nginx-proxy http/https issue
我通过 boot2docker
在 osx 上使用 docker。
我有 2 台主机:site1.loc.test.com
和 site2.loc.test.com
指向 docker 主机的 IP 地址。
两者都应该可以通过 80
和 443
端口获得。
所以我使用 jwilder/nginx-proxy
进行反向代理。
但事实上,当我 运行 所有这些都通过 docker-compose
时,每次我尝试通过 80
端口打开时,我都会重定向到 443
(301 Moved Permanently)
.
可能是我在 jwilder/nginx-proxy
配置中遗漏了什么?
docker-compose.yml
proxy:
image: jwilder/nginx-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs
ports:
- "80:80"
- "443:443"
site1:
image: httpd:2.4
volumes:
- site1:/usr/local/apache2/htdocs
environment:
VIRTUAL_HOST: site1.loc.test.com
expose:
- "80"
site2:
image: httpd:2.4
volumes:
- site2:/usr/local/apache2/htdocs
environment:
VIRTUAL_HOST: site2.loc.test.com
expose:
- "80"
我认为您的配置应该是正确的,但这似乎是 jwilder/nginx-proxy
的预期行为。请参阅文件 nginx.tmpl
中的这些行:https://github.com/jwilder/nginx-proxy/blob/master/nginx.tmpl#L89-L94
似乎如果找到证书,您将始终被重定向到 https。
编辑:我找到了确认 in the documentation
The behavior for the proxy when port 80 and 443 are exposed is as
follows:
- If a container has a usable cert, port 80 will redirect to 443 for that container so that HTTPS is always preferred when available.
您仍然可以使用 custom configuration。您也可以尝试在新的 Dockefile 中覆盖文件 nginx.tmpl
.
为了使这个主题保持最新,jwilder/nginx-proxy 同时为此引入了一个标志:HTTPS_METHOD=noredirect
;设置为环境变量。
进一步阅读on github
要在 SSL 和非 SSL 模式下提供流量而不重定向到 SSL,您可以包含环境变量 HTTPS_METHOD=noredirect(默认为 HTTPS_METHOD=redirect)。
HTTPS_METHOD 必须在每个要覆盖其默认行为的容器上指定。
这是一个示例Docker 撰写文件:
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- '80:80'
- '443:443'
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./config/certs:/etc/nginx/certs
environment:
DEFAULT_HOST: my.example.com
app:
build:
context: .
dockerfile: ./Dockerfile
environment:
HTTPS_METHOD: noredirect
VIRTUAL_HOST: my.example.com
注意:在本例中,环境变量 HTTPS_METHOD
必须设置在 app
容器上,而不是 nginx-proxy
容器。
参考:How SSL Support Works
jwilder/nginx-proxy Docker 图片部分。
我通过 boot2docker
在 osx 上使用 docker。
我有 2 台主机:site1.loc.test.com
和 site2.loc.test.com
指向 docker 主机的 IP 地址。
两者都应该可以通过 80
和 443
端口获得。
所以我使用 jwilder/nginx-proxy
进行反向代理。
但事实上,当我 运行 所有这些都通过 docker-compose
时,每次我尝试通过 80
端口打开时,我都会重定向到 443
(301 Moved Permanently)
.
可能是我在 jwilder/nginx-proxy
配置中遗漏了什么?
docker-compose.yml
proxy:
image: jwilder/nginx-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs
ports:
- "80:80"
- "443:443"
site1:
image: httpd:2.4
volumes:
- site1:/usr/local/apache2/htdocs
environment:
VIRTUAL_HOST: site1.loc.test.com
expose:
- "80"
site2:
image: httpd:2.4
volumes:
- site2:/usr/local/apache2/htdocs
environment:
VIRTUAL_HOST: site2.loc.test.com
expose:
- "80"
我认为您的配置应该是正确的,但这似乎是 jwilder/nginx-proxy
的预期行为。请参阅文件 nginx.tmpl
中的这些行:https://github.com/jwilder/nginx-proxy/blob/master/nginx.tmpl#L89-L94
似乎如果找到证书,您将始终被重定向到 https。
编辑:我找到了确认 in the documentation
The behavior for the proxy when port 80 and 443 are exposed is as follows:
- If a container has a usable cert, port 80 will redirect to 443 for that container so that HTTPS is always preferred when available.
您仍然可以使用 custom configuration。您也可以尝试在新的 Dockefile 中覆盖文件 nginx.tmpl
.
为了使这个主题保持最新,jwilder/nginx-proxy 同时为此引入了一个标志:HTTPS_METHOD=noredirect
;设置为环境变量。
进一步阅读on github
要在 SSL 和非 SSL 模式下提供流量而不重定向到 SSL,您可以包含环境变量 HTTPS_METHOD=noredirect(默认为 HTTPS_METHOD=redirect)。
HTTPS_METHOD 必须在每个要覆盖其默认行为的容器上指定。
这是一个示例Docker 撰写文件:
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- '80:80'
- '443:443'
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./config/certs:/etc/nginx/certs
environment:
DEFAULT_HOST: my.example.com
app:
build:
context: .
dockerfile: ./Dockerfile
environment:
HTTPS_METHOD: noredirect
VIRTUAL_HOST: my.example.com
注意:在本例中,环境变量 HTTPS_METHOD
必须设置在 app
容器上,而不是 nginx-proxy
容器。
参考:How SSL Support Works
jwilder/nginx-proxy Docker 图片部分。