我有一个docker-compose文件,现在运行两个容器:
version: '3'
services:
nginx-certbot-container:
build: nginx-certbot
restart: always
links:
- ghost-container:ghost-container
ports:
- 80:80
- 443:443
tty: true
ghost-container:
image: ghost
restart: always
ports:
- 2368:2368
我有四个网站,l.com,t1.l.com,t2.l.com,t3.l.com,都是由letsencrypt完成的ssl证书,并在URL上工作我可以看到绿色锁等...
对于t2.l.com,我希望这是一个来自ghost的博客,但是有以下nginx conf,
upstream ghost-container {
server ghost-container:2368;
}
server {
server_name t2.l.com;
location / {
proxy_pass https://ghost-container;
proxy_ssl_certificate /etc/letsencrypt/live/l.com/fullchain.pem;
proxy_ssl_certificate_key /etc/letsencrypt/live/l.com/privkey.pem;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers "ECDHE-ECD ... BC3-SHA:!DSS";
proxy_ssl_session_reuse on;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/l.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/l.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
}
server {
listen 80;
listen [::]:80;
server_name t2.l.com;
include /etc/nginx/snippets/letsencrypt.conf;
location / {
return 301 https://t2.l.com$request_uri;
#proxy_pass http://ghost-container;
}
}
如果我注释掉了返回301,并且只保留了proxy_pass,我被重定向到ghost博客没有问题,除了它不是通过ssl,但如果我注释掉代理传递,如上所述,并返回301,服务器返回502坏网关。
有什么我想念的吗?从其他人的代码来看,似乎只有代理证书就足够了......
好吧,我刚刚做了一些我确定不会工作的东西,并将ssl部分中的代理传递设置为http:而不是https:,这一切都运行正常,所以如果有人能够解释背后的机制或逻辑为什么会这样,我会非常感兴趣,它在我的脑海里没有意义。
答案 0 :(得分:0)
您必须区分从客户端到nginx(此处为反向代理)的连接以及从nginx到ghost容器的连接。
从客户端到nginx服务器的连接可以加密(https,端口443)或未加密(http,80)。在配置文件中,每个都有一个apache\bin\
块。如果客户端通过https连接(重定向或直接连接),nginx将使用server
处的密钥加密此连接的内容。内容可以从/etc/letsencrypt/live/l.com/*
容器内的文件系统或上游服务器(因此反向代理)提供。
对于nginx-certbot-container
,您希望使用上游服务器。 Nginx将打开与上游服务器的连接。这取决于在t2.l.com
内运行的服务器是否需要端口2368上的http或https连接。根据您提供的信息,我推断它接受http连接。否则,您还需要为ghost容器提供SSL证书,或创建自签名证书并使nginx信任自签名上游连接。这意味着您的ghost-container
应该使用http。由于此连接的包永远不会离开您的计算机,我认为在这种情况下使用http作为上游服务器是相当安全的。
(如果这不是你想要的,你也可以在ghost容器中创建SSL端点。在这种情况下,nginx必须使用SNI来确定目标主机,因为它只能看到加密包。搜索 nginx反向代理ssl 左右。)
注意:请注意proxy_pass
属性。上面的docker-compose文件发布端口2368.因此可以通过ports
访问ghost服务器。为避免这种情况,请将其替换为http://t2.l.com:2368
。