jwilder/nginx-proxy:无法将 ssl 与 Nginx 集成

Arv*_*ngh 6 ssl proxy docker jwilder-nginx-proxy

我们正在努力通过 SSL 设置使用单端口和 jwilder/nginx-proxy 的多个网站托管,我们能够在没有 ssl 的情况下部署该解决方案,并且它工作正常,但当我们尝试使用 SSL 时,它在 HTTPs 调用上失败。我们的 docker-compose 文件如下:

docker-compose.yml

site1:
  build: site1
  environment:
    VIRTUAL_HOST: site1.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

site2:
  build: site2
  environment:
    VIRTUAL_HOST: site2.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

site3:
  build: site3
  environment:
    VIRTUAL_HOST: site3.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

nginx-proxy:
  image: jwilder/nginx-proxy:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - certs:/etc/nginx/certs:ro

  restart: always
  privileged: true
Run Code Online (Sandbox Code Playgroud)

PS:“certs”文件夹与 docker-compose 文件保存在同一文件夹中。

使用 openssl 使用自签名证书

文件夹结构如下:

Main_folder-|
            |- docker-compose.yml
            |
            |- certs/.csr and .key files
            |
            |- site1/Dockerfile + Nodejs
            |- site2/Dockerfile + Nodejs
            |- site3/Dockerfile + Nodejs
Run Code Online (Sandbox Code Playgroud)

请建议问题的可能原因和解决方案。

docker ps 的输出:

site1:
  build: site1
  environment:
    VIRTUAL_HOST: site1.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

site2:
  build: site2
  environment:
    VIRTUAL_HOST: site2.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

site3:
  build: site3
  environment:
    VIRTUAL_HOST: site3.domainlocal.com
    VIRTUAL_PROTO: https
  restart: always

nginx-proxy:
  image: jwilder/nginx-proxy:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - certs:/etc/nginx/certs:ro

  restart: always
  privileged: true
Run Code Online (Sandbox Code Playgroud)

Arv*_*ngh 6

因此,在花了这么多时间之后,我终于能够解决这个问题。因此,对于与 jwilder/nginx-proxy 的 ssl 集成,没有强制要求以域名命名证书和密钥,而是可以是任何名称,只需在 docker-compose 文件中提及证书名称即可(我发现了这种方法)通过只是打击和审判)。所以你的 docker compose 文件应该如下所示:

site1:
  build: site1
  environment:
    VIRTUAL_HOST: site1.domainlocal.com
    CERT_NAME: mycertificate
  volumes:
    - /etc/ssl/certs:/etc/ssl/certs:ro
  restart: always

site2:
  build: site2
  environment:
    VIRTUAL_HOST: site2.domainlocal.com
    CERT_NAME: mycertificate
  volumes:
    - /etc/ssl/certs:/etc/ssl/certs:ro
  restart: always

site3:
  build: site3
  environment:
    VIRTUAL_HOST: site3.domainlocal.com
    CERT_NAME: mycertificate
  volumes:
    - /etc/ssl/certs:/etc/ssl/certs:ro
  restart: always

nginx-proxy:
  image: jwilder/nginx-proxy:alpine
  ports:
    - "80:80"
    - "443:443"
  environment:
    DEFAULT_HOST: domainlocal.com #default host
    CERT_NAME: mycertificate # Wildcard Certificate name without extension  
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /etc/ssl/certs:/etc/nginx/certs  #certificate path in docker container

  restart: always
  privileged: true
Run Code Online (Sandbox Code Playgroud)

只需使用“docker-compose up --build”构建并运行组合即可,恭喜您现在位于安全层上。


小智 1

您的证书应以“.crt”扩展名结尾,而不是“.csr”。还要确保它的命名适合域,与 VIRTUAL_HOST 变量匹配。根据文档

证书和密钥应以虚拟主机命名,并带有 .crt 和 .key 扩展名。例如,VIRTUAL_HOST=foo.bar.com 的容器的 certs 目录中应该有 foo.bar.com.crt 和 foo.bar.com.key 文件。