Ubuntu 18.04 Server: installare e configurare Nginx, PHP e MariaDB
Per usare insieme Nginx, PHP-FPM e MariaDB su Ubuntu 18.04, è necessario installare ogni pacchetto, passare le richieste PHP di Nginx al socket PHP-FPM e poi configurare il database con account separati. L'esempio seguente è una pratica locale che non modifica siti esistenti e non utilizza l'account root del database per applicazioni web.
Ambito della pratica e preparazione
Il supporto generale per la sicurezza di Ubuntu 18.04 è terminato. Controllare se è applicata la Manutenzione Estesa della Sicurezza (ESM) di Ubuntu Pro e l'intervallo di supporto per ciascun pacchetto in Programma di Manutenzione della Sicurezza di Ubuntu, ed è consigliato costruire nuovi ambienti operativi con versioni supportate. Questo articolo utilizza PHP 7.2 dal repository predefinito come esempio per comprendere un server 18.04 esistente.
Preparare un server di test separato con privilegi di amministratore e accesso al repository. Nginx gestisce le richieste web, PHP-FPM (FastCGI Process Manager) esegue il codice PHP e MariaDB memorizza i dati. Gli esempi sono ricevuti solo in 127.0.0.1:8080, quindi non è possibile accedervi direttamente dall'esterno del server. Per l'accesso pubblico a Internet, sono richiesti firewall separati, dominio, certificato TLS e revisione della sicurezza.
Sui server con servizi o dati esistenti, preparare procedure di backup e ripristino prima di apportare modifiche. Se i percorsi di pratica, gli account, i nomi dei database o la porta 8080 indicati di seguito sono già in uso, non procedere così com'è; utilizzare un ambiente di test separato. È possibile verificare l'uso della porta con il seguente comando. Se non viene restituito alcun output, non esiste un listener TCP per quella porta.
sudo ss -lntp | grep ':8080 '
Installazione del pacchetto e verifica del servizio
L’installazione dei pacchetti può avviare automaticamente il sito predefinito di Nginx, che può ascoltare sulla porta 80. Limitare il sito di prova alla porta locale 8080 non limita il sito predefinito. Isola il server di test con controlli di rete e firewall prima dell’installazione e verifica l’impatto sui servizi esistenti.
Dopo aver aggiornato l'elenco dei pacchetti, installare Nginx, PHP 7.2 FPM con il driver MySQL, il server MariaDB e curl per la verifica. Se i pacchetti non possono essere utilizzati a causa di problemi di repository o di supporto, risolvere gli errori prima di procedere.
sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl
Dopo l'installazione, controlla lo stato del servizio e il socket PHP-FPM usando i seguenti comandi. Se il servizio non è in esecuzione, identifica la causa e avvia il servizio. Se il percorso del socket è diverso, adatta la configurazione di Nginx qui sotto per corrispondere al percorso effettivo.
systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/
Verifica se ciascuno dei tre servizi è active. Se php7.2-fpm.sock non esiste, controlla la causa in systemctl status php7.2-fpm e nei log del servizio. Quando la versione di PHP è diversa, è necessario modificare sia il pacchetto sia il percorso del socket insieme.
Connessione tra Nginx e PHP-FPM
Crea una nuova directory di pratica e un file di configurazione. Non sovrascrivere /var/www/lnmp-demo, /etc/nginx/sites-available/lnmp-demo o /etc/nginx/sites-enabled/lnmp-demo se esistono già. Esegui i comandi di modifica riportati di seguito dopo aver confermato che non esiste un percorso su un server pulito.
sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo
Salva il seguente blocco server completo nell'editor. fastcgi_pass deve corrispondere al socket PHP-FPM confermato in precedenza. snippets/fastcgi-php.conf è uno snippet di configurazione dal pacchetto Nginx di Ubuntu; se il file non esiste, controlla le impostazioni FastCGI nella distribuzione.
server {
listen 127.0.0.1:8080;
server_name localhost;
root /var/www/lnmp-demo;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
Attivare e controllare il file di configurazione. Ricaricare solo se nginx -t ha successo. Se fallisce, controllare e correggere errori, porte e percorsi dei socket, quindi ricontrollare. Se si verifica un problema, rimuovere solo i collegamenti simbolici creati in questa pratica, quindi ricontrollare e ricaricare per mantenere la configurazione del sito esistente.
sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx
Le connessioni FastCGI di Nginx possono anche essere controllate in Guida ufficiale di Nginx.
Controllare l'esecuzione di PHP
Verificare che non ci sia alcun file nel percorso sottostante e crearne uno nuovo. Salvare il codice sottostante nel proprio editor.
sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";
Eseguire il seguente comando sullo stesso server. Se appaiono PHP is working e SAPI: fpm-fcgi, Nginx ha eseguito il codice tramite PHP-FPM. Se il codice PHP viene visualizzato così com'è, la configurazione non è stata applicata, quindi non esporre il file di test e controllare nuovamente le impostazioni di FastCGI.
curl http://127.0.0.1:8080/
Se si verifica un errore 502, controllare il servizio PHP-FPM, il percorso del socket e i permessi; se si verifica un errore 404, controllare la directory dei documenti e il percorso del file. Non esporre la pagina phpinfo() che rivela le impostazioni dettagliate del server.
Database MariaDB e Account Separato
L'autenticazione dell'amministratore MariaDB dipende dal metodo di installazione. Se è impostata l'autenticazione tramite socket locale, è possibile aprire la console di gestione con il seguente comando. Se fallisce, verificare il metodo di autenticazione dell'amministratore esistente. MYSQL_HISTFILE=/dev/null specifica che questa sessione client non deve lasciare un file di cronologia dei comandi.
sudo env MYSQL_HISTFILE=/dev/null mysql
Di seguito è riportato l'SQL per creare un nuovo database di esercitazione e un account locale. Se esiste già un nome uguale, non modificare la voce esistente; utilizzare un nome diverso. Prima dell'esecuzione, sostituire CHANGE_ME_STRONG_PASSWORD con una password lunga e unica, e assicurarsi che eventuali virgolette o barre inverse nella stringa SQL siano sottoposte correttamente a escape.
CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;
Questo account di esempio ha permessi di sola lettura sul database. Se un'applicazione reale richiede permessi di scrittura o modifiche allo schema, concedi solo i permessi necessari separatamente. Non modificare direttamente il plugin di autenticazione dell'account admin o dare privilegi root all'applicazione web. Per maggiori dettagli su account e autenticazione, consulta la documentazione di MariaDB CREATE USER.
Verifica che il nuovo account possa connettersi localmente. Non scrivere la password direttamente nella riga di comando; inseriscila al prompt. Dopo la connessione, eseguendo SELECT DATABASE(), CURRENT_USER(); verranno mostrati il database e gli account autenticati. Esci dalla console usando EXIT;.
mysql -u lnmp_demo -p lnmp_demo
Verifica la connessione al database in PHP
La seguente è una modalità di verifica temporanea utilizzando l'account creato sopra. Conserva le credenziali al di fuori della directory dei documenti web. Se /etc/lnmp-demo esiste già, non sovrascriverlo; utilizza invece un ambiente di test separato. Questo presuppone la configurazione predefinita in cui PHP-FPM funziona sotto il gruppo www-data.
sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php
Inserisci il seguente contenuto nel file e sostituisci la password con il valore impostato per l'account del database. Se ci sono virgolette o backslash nella stringa PHP, esegui correttamente l’escape. Poiché altre applicazioni che girano con gli stessi permessi www-data possono leggere il file, è necessaria un isolamento separato sui server condivisi.
<?php
return array(
'user' => 'lnmp_demo',
'password' => 'CHANGE_ME_STRONG_PASSWORD',
);
Assicurati che /var/www/lnmp-demo/db-check.php non esista e salva il seguente codice. Indica solo il successo o il fallimento per evitare di esporre messaggi di errore o password nella risposta web.
sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
$db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
$config['user'], $config['password'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
echo "Database connection OK\n";
} catch (PDOException $e) {
http_response_code(500);
echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php
Se HTTP 200 e Database connection OK appaiono, la connessione PHP a MariaDB è riuscita. Se fallisce, controlla l'estensione PHP MySQL, lo stato del servizio, l'autenticazione del socket e account/password. Dopo la verifica, rimuovi in sicurezza i file PHP temporanei e i file delle credenziali, e pulisci gli account di prova e i database che non sono più necessari, controllando sia gli obiettivi reali sia i backup.
Prima di applicare all'ambiente di produzione
La configurazione di pratica è per la verifica della connessione locale. Prima di rendere pubblici i servizi effettivi, migra a versioni supportate di OS e PHP e configura il nome del server Nginx e la root dei documenti, i certificati HTTPS, il firewall e le regole della rete cloud in base all'ambiente. Devi inoltre rivedere l'ambito di caricamento/esecuzione dei file PHP, la separazione degli utenti FPM, e l'accesso alla rete, il backup e il ripristino di MariaDB.
Lo strumento di configurazione della sicurezza di MariaDB è fornito come mysql_secure_installation o mariadb-secure-installation a seconda della versione installata. Poiché può influenzare i servizi esistenti, leggi ogni domanda e scegli in base al tuo ambiente. Gli elementi dettagliati possono essere trovati in Descrizione dello strumento di configurazione della sicurezza di MariaDB.




