Estoy intentando servir una aplicación web python-django usando una caja de Linux (ejecutando ubuntu 18.04) con nginx, gunincorn, letsencrypt y docker. Después de seguir varios tutoriales en línea, logré servir la aplicación a través de http a través del puerto 80 siguiendo este tutorial.http://pawamoy.github.io/2018/02/01/docker-compose-django-postgres-nginx.html.
Sin embargo, ahora estoy teniendo muchas dificultades con la implementación a través de https a través del puerto 443. Creo que tal vez no entiendo un concepto fundamental de Docker. El error que recibo al ejecutar sudo docker-compose up
está a continuación.
ERROR DE 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
Creo que esto se debe a que no he vinculado el archivo options-ssl-nginx.conf en el archivo docker-compose.yml, ¿tal vez a través de un volumen? Aunque no sé si esto es correcto. Las partes relevantes de mi archivo docker-compose.yml y nginx.conf se encuentran a continuación:
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;
}
}
Creo que este es un problema por no entender los volúmenes en Docker-Compose. Aunque llevo casi una semana intentando resolver esto y no se me ocurre nada.
Respuesta1
Parece que le falta /etc/letsencrypt/options-ssl-nginx.conf
este archivo, es la configuración predeterminada para todos los sitios que utilizan un instalador de certbot. Por lo tanto, este archivo normalmente se crea durante la instalación del certificado (o emisión e instalación), lo que ocurre principalmente manualmente cuando alguien configura el sistema por primera vez.
Entonces puedes:
- Obtenga la última versión de este archivo desde su ubicación de GitHub enhttps://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.confy ponerlo de nuevo donde debería estar
- O cambie su
nginx.conf
archivo y reemplace la línea que da el error (la línea que incluye ese archivo) con el contenido que obtiene de Github.
Respuesta2
Puedes encontrar /etc/letsencrypt/options-ssl-nginx.conf
un archivo como este enCentOs.
sudo yum install yum-utils
repoquery --list python2-certbot-nginx
O así porubuntu.
dpkg -L python2-certbot-nginx
y copie el archivo al /etc/letsencrypt
directorio.
sudo cp /usr/lib/python2.7/site-packages/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf /etc/letsencrypt/
Si desea utilizar nginx y letsencrypt en Docker, lea este tutorial