LEMP Stack · 14 min read · Oct 21, 2025

Come installare il LEMP Stack (Nginx, PHP e MariaDB) su Debian 12

Il stack LEMP di Linux è un pacchetto software popolare per lo sviluppo e l’hosting di applicazioni web. È composto da quattro componenti chiave: Linux, Nginx (pronunciato “Engine-X”), MySQL o MariaDB (un database relazionale) e PHP (un linguaggio di programmazione web popolare). In questa configurazione, Linux è il sistema operativo e Nginx è il server web che gestisce le richieste HTTP e serve contenuti statici come immagini e file .css. MySQL, o nel nostro caso, MariaDB è utilizzato come sistema di database. PHP è il linguaggio di scripting utilizzato per generare contenuti web e interagire dinamicamente con il database. Questi componenti formano un ambiente robusto e scalabile per costruire e distribuire siti web e applicazioni web.

Qu guida ti insegnerà a installare un LEMP Stack su un server Debian 12 (bookworm) rilasciato pochi giorni fa. Imparerai anche a installare applicazioni come phpMyAdmin.

Prerequisiti

  • Un server che esegue Debian 12.
  • Un utente non root con privilegi sudo.
  • Un nome di dominio completamente qualificato (FQDN) come example.com che punta al server.
  • Il firewall Uncomplicated Firewall (UFW) è abilitato e in esecuzione.
  • Tutto è aggiornato. $ sudo apt update && sudo apt upgrade
  • Alcuni pacchetti di cui il tuo sistema ha bisogno. $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y Alcuni di questi pacchetti potrebbero già essere installati sul tuo sistema.

Passo 1 - Configurare il Firewall

Il primo passo prima di installare qualsiasi pacchetto è configurare il firewall per consentire connessioni HTTP e HTTPS.

Controlla lo stato del firewall.

$ sudo ufw status

Dovresti vedere qualcosa di simile al seguente.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Consenti le porte HTTP e HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Controlla di nuovo lo stato per confermare.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Passo 2 - Installare PHP

Debian 12 include PHP 8.2 per impostazione predefinita. Puoi installarlo eseguendo il seguente comando.

$ sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd

Abbiamo installato le estensioni MySQL, CLI, GD, Mbstring e XML di PHP. Puoi installare qualsiasi estensione extra in base alle tue esigenze.

Per rimanere sempre sull’ultima versione di PHP o se desideri installare più versioni di PHP, aggiungi il repository PHP di Ondrej.

Prima, importa la chiave GPG del repo PHP di Sury.

$ sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

Aggiungi il repository PHP di Ondrej Sury.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

Aggiorna l’elenco dei repository di sistema.

$ sudo apt update   

Ora puoi installare qualsiasi versione di PHP.

$ sudo apt install php8.1-fpm php8.1-cli

Controlla la versione di PHP installata.

$ php --version
PHP 8.2.7 (cli) (built: Jun  9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies

Passo 3 - Installare MariaDB

Debian 12 non include MySQL per impostazione predefinita e non hanno ancora rilasciato un pacchetto ufficiale per esso. Pertanto, utilizzeremo MariaDB. Anche MariaDB non ha un pacchetto ufficiale per Debian 12, ma Debian lo include. Pertanto, installalo utilizzando il seguente comando.

$ sudo apt install mariadb-server

Controlla la versione di MySQL.

$ mysql --version
mysql  Ver 15.1 Distrib 10.11.3-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper

Esegui lo script di installazione sicura di MariaDB.

$ sudo mysql_secure_installation

Ti verrà chiesto di inserire la password di root. Premi Invio perché non abbiamo impostato alcuna password per essa.

NOTE: ESEGUIRE TUTTE LE PARTI DI QUESTO SCRIPT È RACCOMANDATO PER TUTTI I SERVER MariaDB
      IN USO IN PRODUZIONE!  PER FAVORE LEGGI OGNI PASSO ATTENTAMENTE!

Per accedere a MariaDB per metterlo in sicurezza, avremo bisogno della password attuale
per l'utente root. Se hai appena installato MariaDB e
non hai ancora impostato la password di root, dovresti semplicemente premere invio qui.

Inserisci la password attuale per root (premi per nessuna):

Successivamente, ti verrà chiesto se desideri passare al metodo di autenticazione Unix socket. Il plugin unix_socket ti consente di utilizzare le credenziali del tuo sistema operativo per connetterti al server MariaDB. Poiché hai già un account root protetto, inserisci n per procedere.

OK, password utilizzata con successo, procedendo...

Impostare la password di root o utilizzare il unix_socket garantisce che nessuno
può accedere all'utente root di MariaDB senza la corretta autorizzazione.

Hai già protetto il tuo account root, quindi puoi rispondere in sicurezza 'n'.

Passa all'autenticazione unix_socket [Y/n] n

Successivamente, ti verrà chiesto se desideri cambiare la tua password di root. Su Debian 12, la password di root è strettamente legata alla manutenzione automatizzata del sistema, quindi dovrebbe essere lasciata così com’è. Digita n per procedere.

 ... salto.

Hai già protetto il tuo account root, quindi puoi rispondere in sicurezza 'n'.

Cambia la password di root? [Y/n] n

Successivamente, ti verranno poste alcune domande per migliorare la sicurezza di MariaDB. Digita Y per rimuovere gli utenti anonimi, vietare gli accessi remoti all’utente root, rimuovere il database di test e ricaricare le tabelle dei privilegi.

 ... salto.

Per impostazione predefinita, un'installazione di MariaDB ha un utente anonimo, che consente a chiunque
accedere a MariaDB senza dover avere un account utente creato per
loro.  Questo è destinato solo per test e per rendere l'installazione
un po' più fluida.  Dovresti rimuoverli prima di passare a un
ambiente di produzione.

Rimuovere gli utenti anonimi? [Y/n] y
 ... Successo!

Normalmente, l'utente root dovrebbe essere autorizzato a connettersi solo da 'localhost'.  Questo
assicura che qualcuno non possa indovinare la password di root dalla rete.

Vietare l'accesso remoto all'utente root? [Y/n] y
 ... Successo!

Per impostazione predefinita, MariaDB viene fornito con un database chiamato 'test' a cui chiunque può
accedere.  Questo è anche destinato solo per test e dovrebbe essere rimosso
prima di passare a un ambiente di produzione.

Rimuovere il database di test e l'accesso ad esso? [Y/n] y
 - Eliminazione del database di test...
 ... Successo!
 - Rimozione dei privilegi sul database di test...
 ... Successo!

Ricaricare le tabelle dei privilegi garantirà che tutte le modifiche apportate finora
entreranno in vigore immediatamente.

Ricaricare le tabelle dei privilegi ora? [Y/n] y
 ... Successo!

Pulizia...

Tutto fatto!  Se hai completato tutti i passaggi sopra, la tua installazione di MariaDB
ora dovrebbe essere sicura.

Grazie per aver utilizzato MariaDB!

Puoi accedere alla shell di MariaDB digitando sudo mysql o sudo mariadb nella riga di comando.

Passo 4 - Configurare MariaDB

Accedi alla shell di MariaDB.

$ sudo mysql

Crea un database di esempio.

MariaDB> CREATE DATABASE exampledb;

Crea un account utente SQL.

MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';

Concedi tutti i privilegi sul database all’utente.

MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';

Poiché non stiamo modificando l’utente root, dovresti creare un altro utente SQL per eseguire compiti amministrativi che utilizzano l’autenticazione con password. Scegli una password forte per questo.

MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;

Flush dei privilegi utente.

MariaDB> FLUSH PRIVILEGES;

Esci dalla shell.

MariaDB> exit

Accediamo di nuovo alla shell di MySQL utilizzando il nuovo utente creato.

$ sudo mysql -u exampleuser -p

Crea una tabella di test.

MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );

Inserisci dati di test.

MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");

Ripeti il comando sopra più volte per aggiungere ulteriori voci. Esegui il seguente comando per controllare i contenuti della tabella.

MariaDB> SELECT * FROM exampledb.name_list;

Riceverai il seguente output.

+-----+---------+
| sno | content |
+-----+---------+
|   1 | Navjot  |
|   2 | Adam    |
|   3 | Josh    |
|   4 | Peter   |
+-----+---------+
4 rows in set (0.00 sec)

Esci dalla shell di MySQL.

MariaDB> exit

Passo 5 - Installare Nginx

Debian 12 include una versione più vecchia di Nginx. Per installare l’ultima versione, devi scaricare il repository ufficiale di Nginx.

Importa la chiave di firma di Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Aggiungi il repository per la versione stabile di Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Aggiorna i repository di sistema.

$ sudo apt update

Installa Nginx.

$ sudo apt install nginx

Verifica l’installazione. Su sistemi Debian, il seguente comando funzionerà solo con sudo.

$ sudo nginx -v
nginx version: nginx/1.24.0

Avvia Nginx.

$ sudo systemctl start nginx

Controlla lo stato del servizio.

$ sudo systemctl status nginx
? nginx.service - nginx - server web ad alte prestazioni
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Thu 2023-06-15 16:33:46 UTC; 1s ago
       Docs: https://nginx.org/en/docs/
    Process: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 2258 (nginx)
      Tasks: 2 (limit: 1108)
     Memory: 1.8M
        CPU: 6ms
     CGroup: /system.slice/nginx.service
             ??2258 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??2259 "nginx: worker process"

Passo 6 - Configurare PHP-FPM

Apri php.ini per la modifica.

$ sudo nano /etc/php/8.2/fpm/php.ini

Per impostare le dimensioni di caricamento dei file, modifica i valori delle variabili upload_max_filesize e post_max_size.

upload_max_filesize = 50M
...
post_max_size = 50M

Configura il limite di memoria di PHP in base alle risorse e ai requisiti del tuo server.

memory_limit = 256M

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Puoi anche utilizzare i seguenti comandi per apportare le modifiche senza dover aprire il file.

$ sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
$ sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini

Apri il file /etc/php/8.0/fpm/pool.d/www.conf.

$ sudo nano /etc/php/8.2/fpm/pool.d/www.conf

Dobbiamo impostare l’utente/gruppo Unix dei processi PHP su nginx. Trova le righe user=www-data e group=www-data nel file e cambiale in nginx.

...
; Unix user/group of processes
; Nota: L'utente è obbligatorio. Se il gruppo non è impostato, verrà utilizzato il gruppo dell'utente predefinito
;       sarà utilizzato.
user = nginx
group = nginx
...

Inoltre, trova le righe listen.owner=www-data e listen.group=www-data nel file e cambiale in nginx.

listen.owner = nginx
listen.group = nginx

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Riavvia il processo PHP-fpm.

$ sudo systemctl restart php8.2-fpm

Passo 7 - Installare phpMyAdmin

Scarica il file di archivio di phpMyAdmin per la lingua inglese. Prendi il link per l’ultima versione dalla pagina di download di phpMyAdmin.

$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz

Crea una directory pubblica per il sito.

$ sudo mkdir /var/www/html/example.com -p

Estrai l’archivio nella directory pubblica.

$ sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com

Passa alla directory pubblica.

$ cd /var/www/html/example.com

Rinomina la directory estratta in qualcosa di oscuro per migliorare la sicurezza.

$ sudo mv phpMyAdmin-5.2.1-english sm175

Passo 8 - Configurare phpMyAdmin

Copia il file di configurazione di esempio.

$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php

Apri il file di configurazione per la modifica.

$ sudo nano sm175/config.inc.php

Trova la riga $cfg['blowfish_secret'] = ''; e inserisci una stringa casuale di 32 caratteri per l’autenticazione basata su cookie.

Puoi utilizzare il generatore di blowfish online di phpSolved o farlo tramite la riga di comando.

Copia il valore e incollalo come mostrato.

$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Cambia la proprietà del sito e di phpMyAdmin al server Nginx.

$ sudo chown -R nginx:nginx /var/www/html/example.com

Elimina la directory di installazione di phpMyAdmin.

$ sudo rm -rf /var/www/html/example.com/sm175/setup

Passo 9 - Configurare Opcache

Opcache è il sistema di caching di PHP. Funziona salvando il bytecode degli script precompilati nella memoria, quindi ogni volta che un utente visita una pagina, si carica più velocemente. Opcache è installato per impostazione predefinita. Per verificarlo, controlla la versione di PHP.

$ php --version
PHP 8.2.7 (cli) (built: Jun  9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies

Questo ci dice che Opcache è installato e disponibile. Nel caso in cui non venga visualizzato qui, puoi installarlo manualmente eseguendo il seguente comando.

$ sudo apt install php-opcache

Per modificare le impostazioni di Opcache, apri il file /etc/php/8.2/fpm/conf.d/10-opcache.ini per la modifica.

$ sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini

Le seguenti impostazioni dovrebbero aiutarti a iniziare a utilizzare Opcache e sono generalmente raccomandate per buone prestazioni. Puoi abilitarlo aggiungendo le seguenti righe in fondo.

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Riavvia PHP-FPM.

$ sudo systemctl restart php8.2-fpm

Passo 10 - Installare Certbot per SSL

Dobbiamo installare Certbot per generare certificati SSL gratuiti offerti da Let’s Encrypt.

Puoi installare Certbot utilizzando il repository di Debian o scaricare l’ultima versione utilizzando lo strumento Snapd. Utilizzeremo la versione Snapd.

Debian 12 non viene fornito con Snapd installato. Installa il pacchetto Snapd.

$ sudo apt install snapd

Esegui i seguenti comandi per assicurarti che la tua versione di Snapd sia aggiornata.

$ sudo snap install core
$ sudo snap refresh core

Installa Certbot.

$ sudo snap install --classic certbot

Usa il seguente comando per assicurarti che il comando Certbot possa essere eseguito creando un collegamento simbolico alla directory /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifica se Certbot funziona correttamente.

$ certbot --version
certbot 2.6.0

Passo 11 - Testare un sito demo

Crea il sito

Crea e apri una pagina di test per la modifica.

$ sudo nano /var/www/html/example.com/index.php

Incolla il seguente codice in essa.

Members List
    "; foreach($db->query("SELECT content FROM $table") as $row) { echo "
  1. " . $row['content'] . "
  2. "; } echo "
"; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
"; die(); }

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Crea un certificato SSL

Esegui il seguente comando per generare un certificato SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com

Il comando sopra scaricherà un certificato nella directory /etc/letsencrypt/live/example.com sul tuo server.

Genera un certificato Diffie-Hellman group.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Controlla il servizio di pianificazione del rinnovo di Certbot.

$ sudo systemctl list-timers

Troverai snap.certbot.renew.service come uno dei servizi programmati per l’esecuzione.

NEXT                        LEFT          LAST                        PASSED        UNIT                      ACTIVATES
.....
Sun 2023-02-26 06:32:00 UTC 9h left       Sat 2023-02-25 18:04:05 UTC 2h 59min ago  snap.certbot.renew.timer  snap.certbot.renew.service
Sun 2023-02-26 06:43:20 UTC 9h left       Sat 2023-02-25 10:49:23 UTC 10h ago       apt-daily-upgrade.timer   apt-daily-upgrade.service
Sun 2023-02-26 09:00:06 UTC 11h left      Sat 2023-02-25 20:58:06 UTC 5min ago      apt-daily.timer           apt-daily.service

Fai un test di prova del processo per controllare se il rinnovo SSL funziona correttamente.

$ sudo certbot renew --dry-run

Se non vedi errori, sei a posto. Il tuo certificato si rinnoverà automaticamente.

Configura Nginx

Crea e apri il file /etc/nginx/conf.d/example.conf per la modifica.

$ sudo nano /etc/nginx/conf.d/example.conf

Incolla il seguente codice in esso.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  example.com;

    access_log  /var/log/nginx/example.com.access.log;
    error_log   /var/log/nginx/example.com.error.log;

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    root /var/www/html/example.com;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Passa gli script PHP al server FastCGI
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; #dipende dalle versioni di PHP
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

# imposta HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  example.com;
    return 301   https://$host$request_uri;
}

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Apri il file /etc/nginx/nginx.conf per la modifica.

$ sudo nano /etc/nginx/nginx.conf

Aggiungi la seguente riga prima della riga include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Verifica la tua configurazione Nginx.

$ sudo nginx -t

Se non vedi errori, significa che sei a posto. Avvia il server Nginx.

$ sudo systemctl start nginx

Carica il tuo sito visitando https://example.com nel tuo browser e vedrai la seguente pagina.

Output del sito di test LEMP

Puoi accedere alla tua installazione di phpMyAdmin visitando l’URL https://example.com/sm175 nel tuo browser. Puoi inserire il tuo utente amministrativo o l’utente creato in precedenza per accedere.

Conclusione

Questo conclude il nostro tutorial in cui hai imparato come impostare un stack LEMP su un server Debian 12 e creare un sito demo. Se hai domande, postale nei commenti qui sotto.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.