Configurazione di LEMP Stack con Docker e Certificati SSL


Questo tutorial ti guida passo dopo passo nella configurazione di uno stack LEMP con Docker e Docker Compose, integrando la protezione SSL tramite Let’s Encrypt.

Prerequisiti

  • Un server Ubuntu con un utente non root abilitato a sudo e un firewall attivo.
  • Docker e Docker Compose installati.
  • Un dominio registrato con i record DNS configurati (A e www).

Fase 1: Configurazione del Server Web

Crea la directory di configurazione del progetto e il file nginx.conf:


mkdir -p webserver_www/nginx-conf
nano webserver_www/nginx-conf/nginx.conf

            

Inserisci il seguente blocco di configurazione:


server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/html;

    location ~ /.well-known/acme-challenge {
        allow all;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php_fpm:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

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

            

Nota: Ricordati di sostituire your_domain con il tuo dominio effettivo.

Fase 2: Definizione delle Variabili Ambientali

Crea un file .env per definire variabili sensibili:


nano webserver_www/.env

            

Inserisci i seguenti valori:


MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_php_fpm_user
MYSQL_PASSWORD=your_php_fpm_password
MYSQL_DATABASE=your_database

            

Fase 3: Configurazione di Docker Compose

Crea il file docker-compose.yml per definire i servizi:


version: '3'
services:
  db:
    image: mysql:8.0
    env_file: .env
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network

  php_fpm:
    image: php:8.2-fpm
    volumes:
      - php_fpm:/var/www/html
    networks:
      - app-network

  nginx:
    image: nginx:1.21-alpine
    ports:
      - "80:80"
    volumes:
      - php_fpm:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
    networks:
      - app-network

  certbot:
    image: certbot/certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - php_fpm:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email you@example.com --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

volumes:
  dbdata:
  php_fpm:
  certbot-etc:

networks:
  app-network:
    driver: bridge

            

Fase 4: Configurazione Certificati SSL

Esegui il comando per ottenere i certificati:


docker-compose up -d certbot

            

Verifica la presenza dei certificati con:


docker-compose exec nginx ls -la /etc/letsencrypt/live

            

Fase 5: Modifica della Configurazione Nginx

Modifica nginx.conf per abilitare HTTPS:


server {
    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
}

            

Fase 6: Rinnovo Automatico dei Certificati

Crea uno script di rinnovo:


#!/bin/bash
docker-compose run certbot renew && docker-compose kill -s SIGHUP nginx

            

Configura un cron job:


crontab -e
# Aggiungi la seguente riga
0 12 * * * /path/to/ssl_renew.sh >> /var/log/cron.log 2>&1

            

Installazione dello stack LEMP dockerizzato con Docker Compose


Questa guida fornisce le istruzioni necessarie ad installare lo stack LEMP utilizzando Docker Compose e a deployare un’applicazione PHP. Verrà creata una semplice applicazione per visualizzare una lista di articoli di un e-commerce.

Prerequisiti

Configurazione dello stack LEMP

Iniziare creando un file docker-compose.yml nella directory del progetto:


services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./app:/var/www/html
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - php
      - mysql

  php:
    image: php:8.2-fpm
    container_name: php
    volumes:
      - ./app:/var/www/html

  mysql:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: ecommerce
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

Creare i file e le directory necessari:


mkdir -p app config/nginx
touch config/nginx/default.conf

Configurare Nginx creando un file default.conf nella directory config/nginx:


server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Avvio dei container

Eseguire il comando per avviare i servizi:


docker-compose up -d

Verificare che tutti i container siano in esecuzione:


docker-compose ps

Creazione dell’applicazione PHP

Creare un file index.php nella directory app con il seguente contenuto:


<?php
$articoli = [
    ['id' => 1, 'nome' => 'Articolo 1', 'prezzo' => 10.99],
    ['id' => 2, 'nome' => 'Articolo 2', 'prezzo' => 15.99],
    ['id' => 3, 'nome' => 'Articolo 3', 'prezzo' => 8.99],
];

echo "<h1>Lista di articoli</h1>";
echo "<ul>";
foreach ($articoli as $articolo) {
    echo "<li>" . htmlspecialchars($articolo['nome']) . " - $" . number_format($articolo['prezzo'], 2) . "</li>";
}
echo "</ul>";
?>

Test dell’applicazione

Aprire il browser e navigare all’indirizzo http://localhost. Verrà visualizzata la lista degli articoli del nostro e-commerce.

Riferimenti

Installare Certificati SSL Let’s Encrypt su uno Stack LEMP

Questa guida approfondisce l’installazione di certificati SSL gratuiti forniti da Let’s Encrypt utilizzando Certbot e configurandoli su uno stack LEMP (Linux, Nginx, MySQL, PHP) in un server Ubuntu.

Prerequisiti

  • Un server Ubuntu configurato seguendo la guida di configurazione iniziale (documentazione ufficiale).
  • Un nome di dominio registrato con i record DNS correttamente configurati (A record per il dominio principale e il sottodominio www).
  • Nginx installato e configurato con blocchi server per il dominio.

Passaggi

1. Installare Certbot

Certbot può essere installato tramite Snap. Aggiorna Snap core ed elimina versioni precedenti di Certbot se necessario:


sudo snap install core; sudo snap refresh core
sudo apt remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

2. Configurare Nginx

Assicurati che Nginx sia configurato con il corretto blocco server, includendo la direttiva server_name:


server {
    server_name example.com www.example.com;
    ...
}

3. Configurare il Firewall

Permetti il traffico HTTPS tramite il profilo Nginx Full:


sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

4. Ottenere un Certificato SSL

Esegui Certbot per ottenere e configurare automaticamente il certificato:


sudo certbot --nginx -d example.com -d www.example.com

5. Verificare il Rinnovo Automatico

Certbot configura automaticamente un timer per il rinnovo dei certificati. Verifica lo stato del timer:


sudo systemctl status snap.certbot.renew.service

Simula un rinnovo per verificare la configurazione:


sudo certbot renew --dry-run

Riferimenti