Docker Nginx:根据位置通过HTTPS传递到不同的目标

Docker Nginx:根据位置通过HTTPS传递到不同的目标,docker,nginx,https,nginx-reverse-proxy,Docker,Nginx,Https,Nginx Reverse Proxy,我完全不知道nginx反向代理,所以如果这个问题很愚蠢,请原谅我。我的情况是,我运行多个docker容器,这些容器本身管理HTTPS证书,我需要反向代理从浏览器访问它们。问题是需要从这些容器中管理证书,而不是从nginx反向代理管理证书 我在谷歌上搜索并尝试了很多方法,唯一有效的方法就是通过流直接到达容器的本地地址 events { } stream { server { listen 443; listen [::]:443; proxy_pass 10.0.0

我完全不知道nginx反向代理,所以如果这个问题很愚蠢,请原谅我。我的情况是,我运行多个docker容器,这些容器本身管理HTTPS证书,我需要反向代理从浏览器访问它们。问题是需要从这些容器中管理证书,而不是从nginx反向代理管理证书

我在谷歌上搜索并尝试了很多方法,唯一有效的方法就是通过流直接到达容器的本地地址

events { }

stream {
  server {
    listen 443;
    listen [::]:443;

    proxy_pass 10.0.0.1:443;  
  }
}
当我在处理流时,就我所知,这是这个过程所需要的,我不知道如何区分我试图到达的目的地

我需要能够执行以下操作的配置:

https://mail.example.com --> proxy_pass 10.0.0.1
https://mail.example.com --> proxy_pass 10.0.0.1
https://www.example.com --> proxy_pass 10.0.0.2 
https://foo.example.com --> proxy_pass 10.0.0.2

有什么方法可以做到这一点吗?

您想了解的是如何设置SSL直通代理TCP转发并使用SNI信息进行路由。我不确定您是否可以使用nginx进行连接,因为据我所知,在nginx中,无法使用SNI信息对连接进行管道连接

我试着用docker compose为此创建一个HAproxy配置,看起来它正按照您的需要工作。我使用docker compose在一个网络中运行所有应用程序,因此您可以根据docker compose中的名称访问其他服务

./docker-compose.yml

./haproxy/haproxy.cfg

然后您可以运行它:

$ docker-compose up
然后确保您的应用程序正常运行:

$ curl -k https://localhost:445
mail service
$ curl -k https://localhost:446
foo service
最后,我们可以测试我们的代理:

$ curl -k https://mail.example.com
mail service
$ curl -k https://foo.example.com
foo service
注意:为了使其正常工作,我在/etc/hosts中添加了mail.example.com和foo.example.com

127.0.0.1   mail.example.com
127.0.0.1   foo.example.com
另外,这是foo应用程序的Dockerfile,邮件的配置相同:

/Dockerfile

/ssl.conf

创建自签名证书:

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout certs/foo.example.com.key -out certs/foo.example.com.crt
$ openssl dhparam -out certs/dhparam.pem 2048
构建图像:

$ docker build -t foo .

我建议阅读位置和服务器块的文档。您要做的是在多个服务器块中包含server_name指令。没有绝对的解决方案,每个人都会向您展示不同的配置示例。您应该熟悉已有的配置示例和文档,以了解nginx的工作原理。我可以花时间为您编写一个可能的配置。因为这既不是计费的问题,也不是stackoverflow的问题,所以我建议按照我刚才的建议来寻找解决方案。这是微不足道的事情。
FROM nginx:latest
COPY ssl.conf                   /etc/nginx/conf.d/ssl.conf
COPY mail.html                  /usr/share/nginx/html/index.html
COPY certs/mail.example.com.crt /etc/nginx/certs/
COPY certs/mail.example.com.key /etc/nginx/certs/
COPY certs/dhparam.pem          /etc/nginx/certs/
server {
    listen 443 http2 ssl;

    ssl_certificate       /etc/nginx/certs/mail.example.com.crt;
    ssl_certificate_key   /etc/nginx/certs/mail.example.com.key;
    ssl_dhparam           /etc/nginx/certs/dhparam.pem;

    root /usr/share/nginx/html;

    location / {
    }
}
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout certs/foo.example.com.key -out certs/foo.example.com.crt
$ openssl dhparam -out certs/dhparam.pem 2048
$ docker build -t foo .