nginx ssl没有这样的文件或目录与docker

问题描述 投票:1回答:2

我有一个使用docker compose设置的nginx容器,它使用在主机上生成的证书。但是当我运行它时,它告诉我没有找到证书。

nginx | nginx:[emerg] SSL_CTX_use_PrivateKey_file(“/ etc / letsnecrypt / live / example.com / privkey.key”)失败(SSL:错误:02001002:系统库:fopen:没有这样的文件或目录:fopen('/ etc / letsnecrypt) /live/example.com/privkey.key','r')错误:20074002:BIO例程:file_ctrl:system lib错误:140B0002:SSL例程:SSL_CTX_use_PrivateKey_file:system lib)

但是当我使用docker-compose run nginx /bin/bash进入容器并转到cert文件夹时,它们确实存在。

那么为什么我会收到错误?

我的nginx conf:

server {
    listen *:443;
    server_name             example.com;

    ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key     /etc/letsnecrypt/live/example.com/privkey.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    access_log              /dev/stdout upstreamlog;
    error_log               /dev/stderr debug;

}

码头工人,compose.yml:

版本:'3.5'

services:
  nginx:
    container_name: nginx
    image: nginx
    restart: unless-stopped
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf
    - ./nginx.default:/etc/nginx/conf.d/default.conf
    - /etc/letsencrypt:/etc/letsencrypt
docker nginx docker-compose certbot
2个回答
1
投票

您遇到的问题是在nginx启动之前,nginx容器中不存在cert文件。

你应该在启动容器之前复制证书。

尝试在nginx文件夹下创建一个Dockfile,如下所示:

FROM nginx:1.12.1-alpine

COPY letsencrypt /etc/letsencrypt/ /** letsencrypt folder contains certificatefiles **/

你的docker-compose.yml应该是这样的:

services:
      nginx-server:
         build: ./nginx
         volumes:
           .......
         expose:
           - 80
           - 443
         ports:
           - "80:80"
           - "443:443"
         container_name: nginx-server

1
投票

我不确定这是否会回答这个问题,但这确实解决了我的问题,这与你的问题非常相似。


简短(可能)回答:

Certbot将live中每个文件的软链接返回到archive/domain.com/中的编号文件。

当你做qazxsw poi时,软链接可能会以某种方式破坏。


说明

我的设置有类似的问题,我的docker-compose up设置如下

docker-compose.yml

services: web: image: nginx:alpine volumes: - ./letsencrypt/etc/live/${DOMAIN}/:/var/certs/:ro 是Certbot提供证书的地方。

Certbot制作了从./letsencrypt/etc/live的软链接,所以当我使用../../archive/domain.com/查看文件系统时,我发现链接断了!

docker-compose run web /bin/sh

简单的解决方案是编辑/certs # ls -la total 12 drwxr-xr-x 2 root root 4096 Aug 31 17:25 . drwxr-xr-x 33 root root 4096 Aug 31 17:44 .. -rw-r--r-- 1 root root 682 Aug 31 17:25 README lrwxrwxrwx 1 root root 37 Aug 31 17:25 cert.pem -> ../../archive/domain.com/cert1.pem lrwxrwxrwx 1 root root 38 Aug 31 17:25 chain.pem -> ../../archive/domain.com/chain1.pem lrwxrwxrwx 1 root root 42 Aug 31 17:25 fullchain.pem -> ../../archive/domain.com/fullchain1.pem lrwxrwxrwx 1 root root 40 Aug 31 17:25 privkey.pem -> ../../archive/domain.com/privkey1.pem 文件以返回目录。

docker-compose.yml

一旦nginx配置与新位置匹配,nginx就会发现证书没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.