我通过boot2docker
在osx上使用docker。
我有2个主机:site1.loc.test.com
和site2.loc.test.com
指向docker host的ip地址。
两者都应该通过80
和443
端口提供。
所以我使用jwilder/nginx-proxy
进行反向代理。
但事实上当我每次尝试通过docker-compose
端口打开时,我都会通过80
运行所有这些内容时,我会重定向到443
(301 Moved Permanently)
。
我可能错过了jwilder/nginx-proxy
配置中的内容吗?
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"
答案 0 :(得分:5)
为了使这个主题保持最新,jwilder / nginx-proxy同时为它引入了一个标志:HTTPS_METHOD=noredirect
;要设置为环境变量。
进一步阅读on github
答案 1 :(得分:4)
我认为您的配置应该是正确的,但似乎这是jwilder/nginx-proxy
的预期行为。请参阅文件nginx.tmpl
中的以下行:https://github.com/jwilder/nginx-proxy/blob/master/nginx.tmpl#L89-L94
似乎如果找到证书,您将始终被重定向到https。
编辑:我找到了确认in the documentation
暴露端口80和443时代理的行为是 如下:
- 如果容器具有可用的证书,则端口80将重定向到该容器的443,以便在可用时始终首选HTTPS。
您仍然可以使用custom configuration。您还可以尝试在新的Dockefile中覆盖文件nginx.tmpl
。
答案 2 :(得分:2)
要在没有重定向到SSL的情况下以SSL和非SSL模式提供流量,可以包含环境变量HTTPS_METHOD = noredirect(默认为HTTPS_METHOD = redirect)。
必须在要覆盖其默认行为的每个容器上指定HTTPS_METHOD。
这是一个示例Docker Compose文件:
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
。
参考:jwilder/nginx-proxy Docker映像的How SSL Support Works
部分。