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.comche 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 -yAlcuni 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 "- " . $row['content'] . "
";
}
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.

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.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.