我正在嘗試使用 linux 盒子(運行 ubuntu 18.04)和 nginx、gunincorn、letsencrypt 和 docker 來提供 python-django web 應用程式。在學習了許多線上教學後,我按照本教學成功透過連接埠 80 透過 http 提供了應用程式服務http://pawamoy.github.io/2018/02/01/docker-compose-django-postgres-nginx.html。
然而,我現在真的很難透過連接埠 443 透過 https 進行部署。我運行時遇到的錯誤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:
...
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;
}
}
我相信這是一個不理解 docker-compose 中的捲的問題?儘管我已經嘗試解決這個問題近一周了,但一無所獲。
答案1
您似乎缺少/etc/letsencrypt/options-ssl-nginx.conf
此文件,它是使用 certbot 安裝程式的所有網站的預設配置。因此,該文件通常是在證書安裝(或頒發和安裝)期間創建的,這主要是由首次配置系統的人員手動進行的。
所以你可以:
- 從其 GitHub 位置取得該檔案的最新版本:https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf並把它放回它應該在的地方
- 或更改您的
nginx.conf
文件,並將出現錯誤的行(包含該文件的行)替換為您從 Github 獲取的內容。
答案2
您可以/etc/letsencrypt/options-ssl-nginx.conf
在以下位置找到這樣的文件CentOs。
sudo yum install yum-utils
repoquery --list python2-certbot-nginx
或者像這樣烏班圖。
dpkg -L python2-certbot-nginx
並將檔案複製到/etc/letsencrypt
目錄。
sudo cp /usr/lib/python2.7/site-packages/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf /etc/letsencrypt/
如果你想在 Docker 中使用 nginx 和 LetsEncrypt,請閱讀 本教程