Я пытаюсь обслуживать python-django веб-приложение, используя linux box (работающий под управлением ubuntu 18.04) с nginx, gunincorn, letsencrypt и docker. После выполнения ряда онлайн-руководств мне удалось обслуживать приложение через http через порт 80, следуя этому руководствуhttp://pawamoy.github.io/2018/02/01/docker-compose-django-postgres-nginx.html.
Однако теперь у меня действительно проблемы с развертыванием через https через порт 443. Думаю, может быть, я не понимаю фундаментальную концепцию 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
Я полагаю, это потому, что я не связал файл options-ssl-nginx.conf в файле docker-compose.yml, может быть, через том? Я не знаю, правильно ли это. Соответствующие части моего файла 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/
Если вы хотите использовать nginx и letsencrypt в Docker, прочтите этот урок