nginx 找不到 /etc/letsencrypt/options-ssl-ngin.conf 文件

Mat*_*lis 5 nginx django docker lets-encrypt docker-compose

我正在尝试使用 linux 盒子(运行 ubuntu 18.04)和 nginx、gunincorn、letsencrypt 和 docker 来提供 python-django web 应用程序。在学习了许多在线教程之后,我按照本教程http://pawamoy.github.io/2018/02/01/docker-compose-django-postgres-nginx 成功通过端口 80 通过 http 提供了应用程序服务。 html

然而,我现在真的很难通过端口 443 通过 https 进行部署。我想也许我不理解基本的 docker 概念。我运行时遇到的错误sudo docker-compose up如下。

NGINX 错误

nginx_1 | nginx: [emerg] open() "/etc/letsencrypt/options-ssl-nginx.conf" failed (2: No such file or directory) in /etc/nginx/conf.d/local_ssl.conf:28

我相信这是因为我没有链接 docker-compose.yml 文件中的 options-ssl-nginx.conf 文件,也许是通过卷?我不知道这是否正确。我的 docker-compose.yml 文件和 nginx.conf 文件的相关部分如下:

docker-compose.yml

version: '3'

services:

  # database containers
  database1:
    ...

  # web container
  djangoapp:
    ...

  # reverse proxy container (nginx)
  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./config/nginx/conf_ssl.d/:/etc/nginx/conf.d
      - static:/opt/services/djangoapp/static
      - media:/opt/services/djangoapp/media
      - ~/nginxlogs:/var/log/nginx
      - /etc/letsencrypt
      - /var/www/certbot
/live/maps.critr.org.uk
    networks:
      - nginx_network
    depends_on:
      - djangoapp

  certbot:
    image: certbot/certbot
    restart: unless-stopped
    volumes:
      - /etc/letsencrypt
      - /var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

networks:
   ...

volumes:
   ...
Run Code Online (Sandbox Code Playgroud)

nginx.conf

upstream critr_server {
    server djangoapp:8000;
}

# divert all http traffic to https
server {
    listen 80; 
    server_name maps.critr.org.uk;
    return 301 https://maps.critr.org.uk;
}

server {

    listen 443 ssl;

    server_name maps.critr.org.uk;

    ssl_certificate /etc/letsencrypt/live/maps.critr.org.uk/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/maps.critr.org.uk/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers   HIGH:!aNULL:!MD5;


    include         /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam     /etc/letsencrypt/ssl-dhparams.pem;


    location /.well-known {
        root /opt/services/djangoapp/static/;
    }   

    location /static/ {
        alias /opt/services/djangoapp/static/;
    }   

    location /media/ {
        alias /opt/services/djangoapp/media/;
    }   

    location / { 
        proxy_pass https://critr_server;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }   
}

Run Code Online (Sandbox Code Playgroud)

我相信这是一个不理解 docker-compose 中的卷的问题?尽管我已经尝试解决这个问题近一周了,但一无所获。

小智 5

您似乎缺少/etc/letsencrypt/options-ssl-nginx.conf此文件,它是使用 certbot 安装程序的所有站点的默认配置。因此,该文件通常是在证书安装(或颁发和安装)期间创建的,这主要是由首次配置系统的人员手动进行的。

所以你可以:

  1. 从 GitHub 位置获取此文件的最新版本:https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf并将其放回原处它应该是
  2. 或者更改您的nginx.conf文件,并将出现错误的行(包含该文件的行)替换为您从 Github 获取的内容。