Crear una imagen personalizada con Nginx y PHP

La imagen oficial de NGINX no incluye PHP por defecto, ya que se centra únicamente en el servidor web NGINX. Si deseas ejecutar PHP en el mismo contenedor que NGINX, necesitarás configurar un entorno adecuado para ello.Puedes crear una imagen personalizada basada en NGINX que incluya PHP. Para ello, crearás un archivo Dockerfile que combine NGINX y PHP-FPM (que es el manejador de PHP recomendado para NGINX). Aquí te dejo un ejemplo de un Dockerfile que agrega PHP a la imagen de NGINX:

# Usa la imagen oficial de NGINX como base
FROM nginx:latest

# Instala PHP y PHP-FPM
RUN apt-get update && \
    apt-get install -y php-fpm php-mysql

# Copia un archivo de configuración personalizado para NGINX
COPY default.conf /etc/nginx/conf.d/

# Exponer el puerto 80
EXPOSE 80

# Inicia PHP-FPM y NGINX cuando se inicie el contenedor
CMD service php7.4-fpm start && nginx -g 'daemon off;'

FROM nginx: Usamos la imagen base de NGINX.

apt-get install -y php-fpm php-mysql: Instalamos PHP-FPM y extensiones de PHP necesarias como php-mysql para poder conectar a bases de datos MySQL, entre otros.

COPY default.conf: Esto asume que tienes un archivo de configuración para NGINX que define cómo manejar las solicitudes PHP (lo veremos más adelante).

CMD: Se usa para iniciar tanto PHP-FPM como NGINX al mismo tiempo. php-fpm procesa las solicitudes PHP, y NGINX sirve las páginas.

Ejemplo de de archivo default.conf

server {
    listen 80;
    server_name localhost;

    root /usr/share/nginx/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Activar ssl en nginx con certificado autofirmado

Para las pruebas se utilizo una maquina Ubuntu 12.04 LTS.

si no se tiene instalado nginx se puede hacer facilmente desde consola con el comando:

sudo apt-get install nginx

El algoritmo de generacion es:

  • Generar una llave
  • Crear CSR (Certificate Signing Request)
  • Firmar certificado usando la llave privada y el  CSR

Crear un directorio para ssl

 cd /etc/nginx/
 mkdir ssl
 cd ssl

Creacion de la llave

openssl genrsa -out server.key 2048

Creacion de CSR

$ openssl req -new -key server.key -out server.csr

Finalmente firmarlo

$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Aqui se firmo el certificado con una duracion de 1 año

Ahora queda configurar el nginx copia el fichero de default para crear uno nuevo

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/ejemplo

luego se edita este archivo con los parametros que hemos puesto principalmente como se llama el dominio y las rutas de ssl

nano /etc/nginx/sites-available/ejemplo

Se puede dejar para que quede habilidado el puerto 80 y el 443

  # HTTPS server
#
server {
        listen 443;
        server_name example.com;

        root /usr/share/nginx/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        ssl_session_timeout 5m;

        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
        ssl_prefer_server_ciphers on;

        location / {
listen 443;
        server_name example.com;

        root /usr/share/nginx/www;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        ssl_session_timeout 5m;

        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
        ssl_prefer_server_ciphers on;

        location / {
                try_files $uri $uri/ /index.html;
        }
}

Configuracion HTTPS de ejemplo, luego se reinicia nginx

service restart nginx