Nginx con HTTPs
En este post mostraremos como montar un servidor HTTP/HTTPS con NginX.
Usaremos un fichero “Dockerfile” basado en la imágen oficial de Nginx adaptada a nuestras necesidades, los certificados son creados y autofirmados.
Aunque los navegadores den un error, la información viaja de una manera segura, pero no hay entidad certificadora que los haya re-certificado, pienso que los navegadores deberían informar esto de otra manera. (no es lo mismo autofirmado, que sin seguridad)
Se podría crear un script con “CertBot” para poder usar LetsEncrypt y actualizar el certificado trimestralmente (Lo haremos en otro post).
En Nginx definimos la misma carpeta para HTTP y HTTPS, intentamos simplificar la configuración al mínimo y crear scripts para creación de imágen y de contenedor.
Creamos primero nuestra clave y certificado (autofirmado).
openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout ser.key -out ser.pem
Ahora creamos el fichero “Dockerfile” para generar una imágen adaptada a nuestras necesidades, usaremos una imágen descargada de HUB, creamos carpeta para ficheros html, usamos el “certificado y clave”, copiaremos los ficheros en la imágen que estamos creando, conectamos los puertos 80 y 443, definimos el comando a usar (nginx) y guardamos.
FROM nginx
RUN rm -f /etc/nginx/conf.d/default.conf
WORKDIR /var/www/html
COPY index.html /var/www/html
RUN chmod 755 /var/www/html/index.html
COPY nginx.conf /etc/nginx/conf.d/
COPY ser.key /etc/nginx/
COPY ser.pem /etc/nginx/
COPY nginx.conf /etc/nginx/
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
COPY entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
En la carpeta “html” solo creamos un fichero “home” simple (index.html).
<html>
<body>
DockerTips.com
</body>
</html>
Ahora creamos un fichero con la configuración de “nginx.conf”, 20 procesos máximos, servidor WEB en puertos 80 y 443, usando los ficheros de clave y certificado.
user nginx;
worker_processes 20;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 443 ssl;
server_name dockertips;
ssl_certificate ser.pem;
ssl_certificate_key ser.key;
location / {
root /var/www/html;
}
}
server {
listen 80 default_server;
server_name dockertips;
include /etc/nginx/mime.types;
default_type application/octet-stream;
location / {
root /var/www/html;
}
}
}
Creamos el script “build.sh” para crear todo el entorno y otro script para limpiar la imágen y el contenedor denerados.
build.sh
#!/bin/bash
./drop.sh
docker build -t httpd .
docker run --name web1 -p 80:80 -p 443:443 -d httpd
# -v /local:/container
nmap 127.0.0.1
# EOF
drop.sh
docker stop web1
docker rm web1
docker rmi httpd --force
Ahora para poner en funcionamiento todo:
./build.sh
Desde nuestro navegador podremos ver el web con/sin https.