Ricerca nel sito web

Come installare Linux, Nginx, MySQL, PHP (stack LEMP) su Ubuntu


Introduzione

Lo stack software LEMP serve pagine web dinamiche e applicazioni web scritte in PHP. Si tratta di un acronimo che descrive un sistema operativo Linux, con un server web Nginx (pronunciato come «Engine-X»). I dati del backend vengono memorizzati nel database MySQL e l'elaborazione dinamica è gestita da PHP.

Questa guida mostra come installare uno stack LEMP su un server Ubuntu. Il sistema operativo Ubuntu si occupa della parte Linux dello stack. Descriveremo come far funzionare gli altri componenti.

Nota: Questo tutorial è principalmente rivolto a Ubuntu 22.04 LTS con PHP 8.1. Per gli utenti di Ubuntu 24.04 LTS, modificare i riferimenti alla versione PHP da php8.1-fpm a php8.3-fpm in tutti i comandi. Inoltre, assicurati di aggiornare eventuali percorsi dei socket PHP-FPM nella configurazione di Nginx (ad esempio, usa /run/php/php8.3-fpm.sock per Ubuntu 24.04).

Come installare Linux, Nginx, MySQL, PHP (stack LEMP) su Ubuntu

  1. Installare il server web Nginx
  2. Installare MySQL
  3. Installare PHP
  4. Configurare Nginx per usare il processore PHP
  5. Testare PHP con Nginx
  6. Test della connessione al database da PHP

Prerequisiti

Usa un utente sudo non root su Ubuntu con il firewall UFW abilitato. Segui la nostra guida di configurazione iniziale del server per Ubuntu per configurarlo.

Fase 1 – Installazione del server web Nginx

Per mostrare le pagine web ai visitatori del sito, utilizzerai Nginx, un server web ad alte prestazioni. Userai il gestore di pacchetti APT per ottenere questo software.

Aggiorna l'indice dei pacchetti del tuo server, poi installa Nginx:

sudo apt update

Successivamente, esegui apt install per installare Nginx:

sudo apt install nginx

Quando richiesto, premi Y e INVIO per confermare che vuoi installare Nginx. Una volta completata l'installazione, il server web Nginx sarà attivo e funzionante sul tuo server Ubuntu.

Verifica che Nginx sia in esecuzione:

sudo systemctl status nginx

Dovresti vedere un output che indica che Nginx è attivo:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since...

Su Ubuntu, Nginx è configurato per avviarsi automaticamente all'installazione.

Consenti il traffico HTTP attraverso il firewall ufw. Nginx registra diversi profili di applicazione UFW durante l'installazione. Controlla i profili disponibili:

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Abilita il profilo più restrittivo che consenta il traffico necessario. Poiché SSL non è ancora configurato, consenti solo il traffico HTTP sulla porta 80:

Attiva questo eseguendo quanto segue:

sudo ufw allow 'Nginx HTTP'

Verifica la modifica del firewall:

sudo ufw status

Questo output mostra che il traffico HTTP è ora consentito:

Status: active

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

Per testare la funzionalità del dominio del server Nginx, vai su http://your_domain utilizzando il browser web che preferisci.

Se non hai un nome di dominio puntato verso il tuo server e non conosci l'indirizzo IP pubblico del tuo server, puoi trovarlo eseguendo uno dei seguenti comandi:

ip addr show
hostname -I

Questo stamperà alcuni indirizzi IP. Puoi provare ciascuno di essi a turno nel tuo browser web.

In alternativa, puoi verificare quale indirizzo IP è accessibile, visto da altre posizioni su Internet:

curl -4 icanhazip.com

Scrivi l'indirizzo che ricevi nel tuo browser web e ti porterà alla pagina iniziale predefinita di Nginx:

http://<server_domain_or_IP>

Se visualizzi questa pagina, significa che hai installato correttamente Nginx e abilitato il traffico HTTP per il tuo server web.

Passo 2 — Installazione di MySQL

Installa MySQL per memorizzare e gestire i dati del sito. MySQL è il sistema di gestione di database standard per gli ambienti PHP.

Ancora una volta, usa apt per ottenere e installare questo software:

sudo apt install mysql-server

Quando richiesto, conferma l'installazione premendo Y, quindi INVIO.

Dopo l'installazione, esegui lo script di sicurezza per rimuovere le impostazioni predefinite non sicure e bloccare l'accesso al database:

sudo mysql_secure_installation

Ti verrà chiesto se desideri configurare il VALIDATE PASSWORD PLUGIN.

Nota: Abilitare questa funzione è in parte una questione di giudizio. Se abilitata, le password che non soddisfano i criteri specificati saranno rifiutate da MySQL con un errore. È sicuro lasciare la validazione disabilitata, ma dovresti sempre usare password forti e uniche per le credenziali del database.

Rispondi Y per sì, o qualsiasi altro tasto per continuare senza abilitare:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 

Se rispondi "sì", ti verrà chiesto di selezionare un livello di validazione della password. Tieni presente che se inserisci 2 per il livello più alto, riceverai errori quando tenterai di impostare qualsiasi password che non contenga numeri, lettere maiuscole e minuscole e caratteri speciali:

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Indipendentemente dal fatto che tu abbia deciso di configurare il VALIDATE PASSWORD PLUGIN, il tuo server ti chiederà di scegliere e confermare una password per l'utente MySQL root. Questo non va confuso con il root di sistema. L'utente root del database è un utente amministrativo con privilegi completi sul sistema del database. Anche se il metodo di autenticazione predefinito per l'utente root di MySQL non richiede l'uso di una password, anche quando ne viene impostata una, dovresti definire qui una password sicura come misura aggiuntiva di sicurezza. Ne parleremo tra un momento.

Se hai abilitato la convalida della password, ti verrà mostrata la forza della password per la password root che hai inserito e il tuo server ti chiederà se vuoi continuare con quella password. Se sei soddisfatto della tua password attuale, premi Y per "sì" al prompt:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Per il resto delle domande, premi Y e premi il tasto ENTER a ogni richiesta. Questo eliminerà alcuni utenti anonimi e il database di test, disabiliterà l'accesso remoto di root e caricherà queste nuove regole in modo che MySQL rispetti immediatamente le modifiche apportate.

Quando hai finito, verifica se riesci ad accedere alla console di MySQL:

sudo mysql

Questo si connetterà al server MySQL come utente amministrativo del database root, come indicato dall'uso di sudo durante l'esecuzione di questo comando. Dovresti ricevere il seguente output:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Per uscire dalla console MySQL, scrivi quanto segue:

exit

Nota che non era necessario fornire una password per connettersi come utente root, anche se ne hai definita una durante l'esecuzione dello script mysql_secure_installation. Questo perché, quando installato su Ubuntu, il metodo di autenticazione predefinito per l'utente amministrativo di MySQL è auth_socket, anziché un metodo basato su password. All'inizio questo potrebbe sembrare un problema di sicurezza, ma rende il server database più sicuro, poiché gli unici utenti autorizzati a effettuare il login come utente MySQL root sono gli utenti di sistema con privilegi sudo, collegandosi dalla console o tramite un'applicazione che abbia gli stessi privilegi. In termini pratici, questo significa che non potrai usare l'utente amministrativo del database root per connetterti dalla tua applicazione PHP.

Per una maggiore sicurezza, è meglio avere account utente dedicati con privilegi più limitati impostati per ogni database, soprattutto se prevedi di ospitare più database sul tuo server.

Nota: Alcune versioni più vecchie della libreria PHP nativa di MySQL mysqlnd non supportano caching_sha2_authentication, il metodo di autenticazione predefinito per gli utenti creati in MySQL 8. Per questo motivo, quando si creano utenti del database per applicazioni PHP su MySQL 8, potrebbe essere necessario assicurarsi che siano configurati per usare mysql_native_password invece. Mostreremo come fare ciò nel Passaggio 6.

Il tuo server MySQL è ora installato e protetto. Successivamente, installerai PHP, l'ultimo componente dello stack LEMP.

Passo 3 – Installazione di PHP

Installa PHP per elaborare il codice e generare contenuti dinamici. Nginx richiede un programma esterno per l'elaborazione di PHP.

PHP-FPM ("gestore dei processi fastCGI") gestisce l'elaborazione PHP in modo efficiente con funzionalità di sicurezza aggiuntive, offrendo migliori prestazioni per i siti web basati su PHP. Installa php-fpm per indirizzare le richieste PHP da Nginx e php-mysql per abilitare la comunicazione tra PHP e MySQL. I pacchetti principali di PHP vengono installati automaticamente come dipendenze.

Per installare i pacchetti php8.1-fpm e php-mysql, esegui:

sudo apt install php8.1-fpm php-mysql

Quando richiesto, premi Y e INVIO per confermare l'installazione.

Verifica che PHP-FPM sia in esecuzione:

sudo systemctl status php8.1-fpm

Dovresti vedere un output che mostra che PHP-FPM è attivo:

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded
     Active: active (running)

Puoi anche controllare la versione di PHP:

php -v
PHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.x

Configura Nginx per usare questi componenti PHP.

Passo 4 — Configurare Nginx per utilizzare il processore PHP

Crea i server block di Nginx (simili agli host virtuali di Apache) per racchiudere la configurazione e ospitare più domini su un solo server. Questa guida utilizza your_domain come nome di dominio di esempio.

Info: Per saperne di più su come configurare un nome dominio con Linux-Console.net, leggi la nostra introduzione al DNS di Linux-Console.net.

Su Ubuntu 22.04, Nginx attiva un blocco server predefinito che serve documenti da /var/www/html. Per più siti, crea una struttura di directory all'interno di /var/www per tuo_dominio, lasciando /var/www/html come directory predefinita di fallback.

Crea la directory web principale per your_domain come segue:

sudo mkdir /var/www/your_domain

Successivamente, assegna la proprietà della directory utilizzando la variabile d'ambiente $USER, che farà riferimento all'utente attuale del sistema:

sudo chown -R $USER:$USER /var/www/your_domain

Quindi, apri un nuovo file di configurazione nella directory sites-available di Nginx utilizzando il tuo editor da riga di comando preferito. Qui useremo nano:

sudo nano /etc/nginx/sites-available/your_domain

Questo creerà un nuovo file vuoto. Inserisci la seguente configurazione essenziale:

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

    index index.html index.htm index.php;

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

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

    location ~ /\.ht {
        deny all;
    }

}

Ecco cosa fanno ciascuna di queste direttive e dei blocchi di posizione:

  • listen — Definisce su quale porta Nginx ascolterà. In questo caso, ascolterà sulla porta 80, la porta predefinita per HTTP.
  • root — Definisce la radice del documento dove sono memorizzati i file serviti da questo sito web.
  • index — Definisce in quale ordine Nginx prioritizzerà i file index per questo sito web. È una pratica comune elencare i file index.html con maggiore precedenza rispetto ai file index.php per consentire di configurare rapidamente una pagina di manutenzione nelle applicazioni PHP. Puoi modificare queste impostazioni per adattarle meglio alle esigenze della tua applicazione.
  • server_name — Definisce a quali nomi di dominio e/o indirizzi IP questo blocco del server deve rispondere. Indica in questa direttiva il nome di dominio del tuo server o l’indirizzo IP pubblico.
  • location / — Il primo blocco di location include una direttiva try_files, che verifica l'esistenza di file o directory corrispondenti a una richiesta URL. Se Nginx non riesce a trovare la risorsa appropriata, restituirà un errore 404.
  • location ~ \.php$ — Questo blocco di location gestisce l'elaborazione effettiva dei file PHP indirizzando Nginx al file di configurazione fastcgi-php.conf e al file php8.1-fpm.sock, che dichiara quale socket è associato a php8.1-fpm.
  • location ~ /\.ht — L'ultimo blocco di location gestisce i file .htaccess, che Nginx non elabora. Aggiungendo la direttiva deny all, se per caso dei file .htaccess finissero nella directory principale dei documenti, non verranno forniti ai visitatori.

Quando hai finito di modificare, salva e chiudi il file. Se stai usando nano, puoi farlo premendo CTRL+X e poi Y e INVIO per confermare.

Attiva la tua configurazione collegandola al file di configurazione dalla directory sites-enabled di Nginx:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Quindi, scollega il file di configurazione predefinito dalla directory /sites-enabled/:

sudo unlink /etc/nginx/sites-enabled/default

Nota: Se mai avessi bisogno di ripristinare la configurazione predefinita, puoi farlo ricreando il collegamento simbolico, come segue:

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Questo dirà a Nginx di utilizzare la configurazione alla prossima ricarica. Puoi testare la tua configurazione per errori di sintassi eseguendo quanto segue:

sudo nginx -t

Se vengono segnalati errori, torna al tuo file di configurazione per rivederne il contenuto prima di continuare.

Quando sei pronto, ricarica Nginx per applicare le modifiche:

sudo systemctl reload nginx

Il tuo nuovo sito web è ora attivo, ma la root web /var/www/your_domain è ancora vuota. Crea un file index.html in quella posizione in modo da poter testare che il tuo nuovo blocco server funzioni come previsto:

nano /var/www/your_domain/index.html

Includi il seguente contenuto in questo file:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Ora vai nel tuo browser e accedi al nome di dominio o all'indirizzo IP del tuo server, come indicato nella direttiva server_name nel file di configurazione del blocco del server:

http://server_domain_or_IP

Riceverai una pagina come la seguente:

Se ricevi questa pagina, significa che il tuo blocco server Nginx funziona come previsto.

Puoi lasciare questo file al suo posto come pagina di atterraggio temporanea per la tua applicazione fino a quando non configurerai un file index.php per sostituirlo.

Avviso: Dopo aver aggiunto il tuo file index.php, assicurati di rimuovere o rinominare il file index.html dalla tua root dei documenti. Se entrambi i file esistono, Nginx servirà index.html per impostazione predefinita e la tua pagina PHP non verrà visualizzata—questa è una fonte comune di confusione per i nuovi utenti.

Il tuo stack LEMP è ora completamente configurato. Nel passaggio successivo, creerai uno script PHP per verificare che Nginx sia effettivamente in grado di gestire i file .php all'interno del tuo sito web appena configurato.

Passo 5 –Testare PHP con Nginx

Il tuo stack LEMP dovrebbe ora essere completamente configurato. Puoi testarlo per verificare che Nginx possa correttamente passare i file .php al tuo processore PHP.

Puoi farlo creando un file PHP di test nella root dei tuoi documenti. Apri un nuovo file chiamato info.php nella root dei tuoi documenti con il tuo editor di testo preferito:

nano /var/www/your_domain/info.php

Aggiungi le seguenti righe nel nuovo file. Questo è codice PHP valido che restituirà informazioni sul tuo server:

<?php
phpinfo();

Quando hai finito, salva e chiudi il file.

Ora puoi accedere a questa pagina nel tuo browser web visitando il nome di dominio o l'indirizzo IP pubblico che hai configurato nel file di configurazione di Nginx, seguito da /info.php:

http://server_domain_or_IP/info.php

Riceverai una pagina web contenente informazioni dettagliate sul tuo server:

Dopo aver controllato le informazioni rilevanti sul tuo server PHP tramite quella pagina, è consigliabile rimuovere il file che hai creato in quanto contiene informazioni sensibili sul tuo ambiente PHP e sul tuo server Ubuntu. Puoi usare rm per rimuovere quel file:

sudo rm /var/www/your_domain/info.php

Puoi sempre rigenerare questo file se ne avrai bisogno più tardi.

Passo 6 — Testare la connessione al database da PHP (Opzionale)

Se vuoi verificare se PHP è in grado di connettersi a MySQL ed eseguire query sul database, puoi creare una tabella di prova con dati fittizi e interrogare il suo contenuto da uno script PHP. Prima di farlo, devi creare un database di prova e un nuovo utente MySQL correttamente configurato per accedervi.

Nota: Alcune versioni più vecchie della libreria PHP nativa di MySQL mysqlnd non supportano caching_sha2_authentication, il metodo di autenticazione predefinito per MySQL 8; potresti dover assicurarti che siano configurate per usare mysql_native_password invece.

Creeremo un database chiamato example_database e un utente chiamato example_user, ma puoi sostituire questi nomi con valori diversi.

Per prima cosa, connettiti alla console di MySQL utilizzando l'account root:

sudo mysql

Per creare un nuovo database, esegui il seguente comando dalla console di MySQL:

CREATE DATABASE example_database;

Ora puoi creare un nuovo utente e concedergli tutti i privilegi sul database personalizzato che hai creato.

Il comando seguente crea un nuovo utente chiamato example_user, utilizzando mysql_native_password come metodo di autenticazione predefinito. Stiamo definendo la password di questo utente come password, ma dovresti sostituire questo valore con una password sicura a tua scelta.

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Ora dobbiamo dare a questo utente il permesso sul database example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

Questo darà all'utente example_user pieni privilegi sul database example_database, impedendo al contempo a questo utente di creare o modificare altri database sul tuo server.

Ora esci dalla shell di MySQL con il seguente comando:

exit

Puoi verificare se il nuovo utente ha i permessi appropriati effettuando nuovamente l'accesso alla console MySQL, questa volta utilizzando le credenziali dell'utente personalizzato. Nota il flag -p in questo comando, che ti chiederà la password utilizzata durante la creazione dell'utente example_user:

mysql -u example_user -p

Dopo aver effettuato l'accesso alla console MySQL, conferma di avere accesso al database example_database:

SHOW DATABASES;

Questo restituirà il seguente output:

+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Successivamente, creeremo una tabella di test chiamata todo_list. Dalla console di MySQL, esegui la seguente istruzione:

CREATE TABLE example_database.todo_list (

 item_id INT AUTO_INCREMENT,

 content VARCHAR(255),

 PRIMARY KEY(item_id)

);

Inserisci alcune righe di contenuto nella tabella di test. Potresti voler ripetere il comando successivo più volte, usando valori diversi:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Per confermare che i dati siano stati salvati correttamente nella tua tabella, esegui:

SELECT * FROM example_database.todo_list;

Il tuo output dovrebbe essere visualizzato come segue:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Dopo aver confermato di avere dati validi nella tua tabella di test, puoi uscire dalla console MySQL:

exit

Ora puoi creare lo script PHP che si connetterà a MySQL e interrogherà i tuoi contenuti. Crea un nuovo file PHP nella tua directory web personalizzata utilizzando il tuo editor preferito. Useremo nano per questo:

nano /var/www/your_domain/todo_list.php

Lo script PHP seguente si collega al database MySQL e interroga il contenuto della tabella todo_list, mostrando i risultati in un elenco. Se c'è un problema con la connessione al database, genererà un'eccezione.

Aggiungi il seguente contenuto al tuo script todo_list.php:

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>"; 
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Salva e chiudi il file quando hai finito di modificare.

Ora puoi accedere a questa pagina nel tuo browser web visitando il nome di dominio o l'indirizzo IP pubblico configurato per il tuo sito web, seguito da /todo_list.php:

http://server_domain_or_IP/todo_list.php

Dovresti ricevere una pagina simile alla seguente, che mostra il contenuto che hai inserito nella tua tabella di prova:

Ciò significa che il tuo ambiente PHP è pronto per connettersi e interagire con il tuo server MySQL.

Domande Frequenti

A cosa serve lo stack LEMP?

Lo stack LEMP ospita siti web e applicazioni dinamiche basate su PHP, inclusi WordPress, Laravel, Magento, Drupal e progetti PHP personalizzati. È particolarmente efficace per siti ad alto traffico che richiedono una gestione efficiente delle connessioni concorrenti.

Qual è la differenza tra i stack LEMP e LAMP?

LEMP utilizza Nginx, che gestisce le connessioni in modo asincrono con un'architettura basata sugli eventi—efficiente per utenti simultanei. LAMP utilizza Apache, che tradizionalmente crea un thread per ogni richiesta (anche se le versioni moderne di Apache supportano modalità basate sugli eventi). LEMP generalmente offre prestazioni migliori per contenuti statici e scenari ad alta concorrenza, mentre LAMP fornisce una configurazione più semplice di .htaccess e un supporto modulare più ampio.

Quale versione di Ubuntu dovrei usare per LEMP?

Ubuntu 22.04 LTS è il principale obiettivo di questa guida, con PHP 8.1, MySQL 8.0 e Nginx con supporto a lungo termine. Ubuntu 24.04 LTS (ultima versione) include PHP 8.3 di default e funziona con questa guida regolando di conseguenza i percorsi dei socket di PHP-FPM e i numeri di versione.

Come posso installare lo stack LEMP su Ubuntu 24.04?

Segui questi passaggi fondamentali:

  1. Installa Nginx: sudo apt install nginx
  2. Installa MySQL: sudo apt install mysql-server
  3. Esegui lo script di sicurezza di MySQL: sudo mysql_secure_installation
  4. Installa PHP-FPM: sudo apt install php-fpm php-mysql
  5. Configurare un blocco server Nginx con integrazione PHP-FPM
  6. Test con info.php e connessione al database

Vedi la guida completa nei passaggi 1-6 riportati sopra.

Quale versione di PHP dovrei installare con Nginx e MySQL?

Usa la versione predefinita di PHP del tuo Ubuntu per la migliore compatibilità:

  • Ubuntu 22.04: PHP 8.1 (installato tramite php8.1-fpm)
  • Ubuntu 24.04: PHP 8.3 (adatta i comandi a php8.3-fpm per questa versione)

Entrambe le versioni funzionano egregiamente con Nginx e MySQL 8.0, supportano i framework moderni e ricevono aggiornamenti di sicurezza attivi.

Come faccio a configurare Nginx per elaborare i file PHP?

Aggiungi un blocco location ~ \.php$ alla configurazione del tuo server Nginx che instradi le richieste PHP a PHP-FPM tramite socket Unix:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Regola il percorso del socket in base alla versione di PHP, testa con sudo nginx -t e ricarica con sudo systemctl reload nginx.

Perché ricevo un errore “502 Bad Gateway” dopo aver installato PHP-FPM?

Gli errori 502 indicano che Nginx non può comunicare con PHP-FPM. Cause comuni:

  1. PHP-FPM non in esecuzione: Controlla con sudo systemctl status php8.1-fpm e avvialo se necessario
  2. Percorso della socket errato: Verifica che /run/php/php8.1-fpm.sock esista e corrisponda alla tua configurazione di Nginx
  3. Problema di permessi: Assicurati che l'utente di Nginx (www-data) possa accedere al socket
  4. Errore di configurazione PHP-FPM: Controlla i log su /var/log/php8.1-fpm.log

Soluzione: Riavvia entrambi i servizi:

sudo systemctl restart php8.1-fpm nginx

Come posso proteggere MySQL dopo l'installazione?

Esegui lo script di sicurezza integrato:

sudo mysql_secure_installation

Segui le istruzioni per:

  • Abilita il plugin di convalida della password
  • Imposta una password root robusta
  • Rimuovere utenti anonimi
  • Disabilita l'accesso root remoto
  • Rimuovere il database di test
  • Ricarica privilegi

Per i database delle applicazioni, crea utenti dedicati con privilegi limitati invece di usare l'account root.

Posso gestire più siti web su un unico server LEMP?

Sì, crea blocchi server Nginx separati per ogni dominio:

  1. Crea la directory: sudo mkdir -p /var/www/second_domain
  2. Crea il blocco server: sudo nano /etc/nginx/sites-available/second_domain
  3. Configura con direttive server_name e root uniche
  4. Abilita: sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/
  5. Testa e ricarica: sudo nginx -t && sudo systemctl reload nginx

Ogni sito può avere impostazioni PHP e utenti del database separati.

Come faccio ad aggiornare PHP a una versione più recente?

Gli aggiornamenti dei pacchetti di Ubuntu gestiscono automaticamente le versioni minori. Per gli aggiornamenti di versione maggiore:

  1. Aggiungi PHP PPA di Ondřej (repository affidabile di terze parti):

    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
  2. Installa nuova versione di PHP-FPM:

    sudo apt install php8.3-fpm php8.3-mysql -y
  3. Aggiorna il percorso del socket nella configurazione di Nginx a /run/php/php8.3-fpm.sock

  4. Testa e ricarica Nginx

  5. Facoltativamente rimuovere la vecchia versione: sudo apt purge php8.1-fpm

Testa sempre in ambiente di staging prima di aggiornare i sistemi di produzione.

Risoluzione dei problemi comuni

Errore 502 Bad Gateway

Il problema più comune dello stack LEMP si verifica quando Nginx non riesce a comunicare con PHP-FPM:

Controlla lo stato di PHP-FPM:

sudo systemctl status php8.1-fpm

Verifica il percorso del socket:

ls -la /run/php/

L'output previsto dovrebbe mostrare il file php8.1-fpm.sock.

Correzioni comuni:

  1. Riavvia PHP-FPM: sudo systemctl restart php8.1-fpm
  2. Verifica che il percorso del socket del blocco server Nginx corrisponda al socket effettivo di PHP-FPM
  3. Verifica i permessi del file: sudo chown www-data:www-data /run/php/php8.1-fpm.sock

Errori di permesso negato

Correggi i permessi della directory web:

sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain

Problemi di connessione a MySQL

Reimposta la password root di MySQL:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

Controlla il servizio MySQL:

sudo systemctl status mysql

PHP non elabora

Verifica i moduli PHP:

php -m | grep -E 'mysql|fpm'

Controlla la configurazione di PHP-FPM:

sudo nginx -t
sudo php-fpm8.1 -t

Debug degli errori 404:

  • Verifica che index.php sia elencato nella direttiva index di Nginx
  • Verifica se il file esiste: ls -la /var/www/your_domain/
  • Controlla i log degli errori di Nginx: sudo tail -f /var/log/nginx/error.log

Conclusione

In questa guida, hai costruito una base flessibile per servire siti web e applicazioni PHP ai tuoi visitatori, usando Nginx come server web e MySQL come sistema di database. Puoi farlo anche con un server web Apache; dai un’occhiata al nostro tutorial su Come Installare lo stack Linux, Apache, MySQL, PHP (LAMP) su Ubuntu. Puoi anche proteggere il tuo sito con Let’s Encrypt, che fornisce certificati gratuiti e affidabili. Scopri come farlo con la nostra guida su Let’s Encrypt per Apache.

Grazie per aver imparato con la community di Linux-Console.net.