nginx ssl在docker中出现文件或目录不存在的错误

4
我使用docker compose设置了一个nginx容器,该容器使用在主机上生成的证书。但是当我运行它时,它告诉我找不到证书。
错误信息如下:
nginx | nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/letsnecrypt/live/example.com/privkey.key") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsnecrypt/live/example.com/privkey.key','r') error:20074002:BIO routines:file_ctrl:system lib error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib)
但是,当我使用“docker-compose run nginx /bin/bash”进入容器并转到证书文件夹时,它们确实存在。
那么为什么会出现这个错误呢?
我的nginx配置文件:
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;

}

docker-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

你的服务器实际的nginx.conf ssl_certificate_key行中,“letsencrypt”是否拼写错误,就像这里显示的一样(letsnecrypt)? - Anubisoft
更直接地说,在nginx.conf文件的“ssl_certificate_key”行中,您拼错了letsencrypt。当我的docker compose文件缺少卷条目时,我遇到了类似类型的错误。我的nginx.conf文件有单独的服务器条目用于子域名(*.foo.com)和基本域名(foo.com),作为解决方案,因为我无法弄清楚如何获得适用于两种情况的单个letsencrypt证书。 - Anubisoft
你找到这篇帖子的答案了吗?我也遇到了同样的问题,但是无法解决。 - motizukilucas
2个回答

13

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


简短(可能)的答案:

Certbot会在live目录下为每个文件创建一个软链接,指向archive/domain.com/目录下一个带编号的文件。

可能是当你执行docker-compose up时,软链接出现了某种问题。


说明

我在我的设置中遇到了类似的问题,我的docker-compose.yml配置如下:

services:
  web:
    image: nginx:alpine
    volumes:
      - ./letsencrypt/etc/live/${DOMAIN}/:/var/certs/:ro

./letsencrypt/etc/是Certbot放置生成证书的位置。

Certbot将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文件并返回几个目录。
services:
  web:
    image: nginx:alpine
    volumes:
      - ./letsencrypt/etc/${DOMAIN}/:/var/certs/:ro

一旦 nginx 配置匹配新位置,nginx 就能轻松找到证书。


这对我有用。我设置了卷:"/etc/letsencrypt/archive/:/etc/letsencrypt/live/" - Andy Jarrett

1

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

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

尝试在 nginx 文件夹下创建一个 Dockerfile,内容如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接