Introduzione
Lo stack "LAMP" è un insieme di software tipicamente installati insieme per consentire l'hosting di siti web scritti in PHP su un server. LAMP è un acronimo che rappresenta Linux, il sistema operativo con installato il server web Apache. I dati sono salvati in un database MySQL e le pagine web vengono gestite da PHP.
In questa guida vedremo come installare lo stack LAMP su Ubuntu con tutti i componenti dello stack LAMP, ovvero Linux, Apache, MySQL e PHP. In questo caso utilizzeremo la versione 20.04, ma i procedimenti si applicano anche ad altre versioni.
Prerequisiti
Per seguire questa guida avrai ovviamente bisogno di un server con installato Ubuntu e un utente non-root con i privilegi di amministratore attraverso il comando sudo. Inoltre è utile avere un firewall di base configurato. Puoi seguire la guida sul setup iniziale di un server Ubuntu per maggiori informazioni.
Installare Apache su Ubuntu
Apache è uno dei server web più utilizzati al mondo, ha una buona documentazione e viene utilizzato fin dagli albori del web. Questo lo rende un'ottima scelta per hostare un sito web.
Come prima cosa aggiorniamo la cache dei pacchetti:
sudo apt update
Poi installiamo subito Apache:
sudo apt install apache2
Per confermare l'installazione di Apache ti verrà chiesto di digitare Y (si) e poi di premere INVIO.
Configurazione del firewall
Una volta terminata l'installazione dobbiamo modificare la configurazione del firewall per consentire il traffico HTTP. Il firewall ufw ha vari profili predefiniti per l'applicazione Apache tra cui possiamo scegliere, vediamo tutti quelli disponibili:
sudo ufw app list
L'output sarà simile al seguente:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
Ci sono tre scelte disponibili per Apache, ecco il loro significato:
- Apache: questo profilo apre solamente la porta 80 per il normale traffico web non crittografato.
- Apache Full: questo profilo apre sia la porta 80 per il traffico normale non crittografato sia la porta 443 per il traffico crittografato con TLS/SSL.
- Apache Secure: questo profilo apre solamente la porta 443 per il traffico crittografato con TLS/SSL.
Allo stato attuale l'opzione migliore è di aprire solamente la porta 80, dato che questa è una nuova installazione di Apache non avremo ancora un certificato TLS/SSL configurato per consentire il traffico HTTPS.
Per consentire il traffico solamente sulla porta 80, utilizziamo il profilo Apache
:
sudo ufw allow in "Apache"
Assicuriamoci che il cambiamento sia andato a buon fine possiamo controllare lo stato del firewall:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
Adesso il traffico sulla porta 80 è consentito e possiamo controllare che tutto funzioni effettivamente semplicemente collegandoci tramite il nostro web browser all'indirizzo IP pubblico del nostro server:
http://ip_del_tuo_server
Una volta caricata la pagina dovreste vedere la pagina predefinita del server web Apache su Ubuntu, che ci informa sull'avvenuta installazione. Dovrebbe apparire così:
Se vedi questa pagina significa che il tuo server web è stato installato correttamente ed è accessibile attraverso il firewall.
Installare MySQL su Ubuntu
Ora che abbiamo un server web che funziona, è arrivato il momento per installare un database per salvare i dati del nostro sito. Un DBMS molto popolare, soprattutto per le applicazioni sviluppate in PHP, è MySQL, che ora andremo ad installare.
Utilizziamo apt
per scaricare ed installare il programma:
sudo apt install mysql-server
Per confermare l'installazione dovremo premere Y
(Yes) e poi Invio
.
Quando l'installazione di MySQL è terminata, è consigliabile eseguire uno script preinstallato con MySQL che si occupa di rimuovere alcune impostazioni predefinite non sicure e limita l'accesso al nostro database. Eseguiamo lo script con:
sudo mysql_secure_installation
Durante l'esecuzione ci verrà chiesto se abilitare il Validate Password Plugin.
Attenzione: abilitare questa funzione o meno è unicamente una tua scelta. Se la funzione verrà abilitata, tutte le password che non rispettano i criteri verranno rifiutate con un errore. È sicuro anche lasciare questa funzione disabilitata, l'importante è comunque utilizzare password sicure e non uguali ad altri servizi. Approfondiremo meglio questa questione più avanti nella guida.
Per non abilitare questa funzione digita N
per no e poi premi Invio
. Se invece vuoi abilitare il plugin digita Y
per si.
VALIDATE PASSWORD PLUGIN 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 plugin?
Press y|Y for Yes, any other key for No:
Se sceglierai di abilitare questa funzione dovrai selezionare il livello di sicurezza della password. Ricordati che se imposti il livello di sicurezza a 2 (il più forte), riceverai un errore ogni volta che proverai ad inserire una password che non contiene numeri, lettere maiuscole e minuscole e caratteri speciali oppure una password che si basa su normali parole.
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 dall'aver abilitato o meno il plugin per verificare le password, nello step successivo dovrete inserire e confermare una password per l'utente root di MySQL. L'utente root è l'account di amministrazione con tutti i privilegi sul DBMS. Anche se il metodo di autenticazione predefinito per l'utente root di MySQL consente di non utilizzare una password, anche quando ne è impostata una, si consiglia fortemente di inserire una password sicura per sicurezza.
Se hai abilitato il plugin per la verifica della password, a questo punto verrà visualizzato quanto sicura è la password che hai inserito per l'utente root. Se sei soddisfatto della password puoi scrivere Y
(yes) per confermare:
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 le restanti domande puoi tranquillamente dare sempre conferma inserendo Y
e poi premendo Invio
. Questi procedimenti rimuoveranno gli utenti anonimi e il database di prova, disabiliteranno l'accesso da remoto e caricheranno queste nuove regole in modo da applicare immediatamente i nostri cambiamento a MySQL.
Quando abbiamo finito, proviamo ad accedere alla console di MySQL scrivendo il comando:
sudo mysql
Con questo saremo connessi al server MySQL con l'utente amministratore root, che è stato dedotto dall'utilizzo di sudo
durante l'esecuzione del comando. L'output dovrebbe assomigliare al seguente:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 8.0.19-0ubuntu5 (Ubuntu)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
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>
Adesso che abbiamo verificato il funzionamento di tutto, possiamo uscire con questo comando:
mysql> exit
Come avrete sicuramente potuto notare, durante l'accesso all'account root non ci è stata chiesta nessuna password, anche se ne abbiamo impostata una durante la configurazione iniziale di MySQL. Questo è perché il metodo di autenticazione predefinito per l'utente di amministrazione di MySQL è unix_socket
invece di password
.
Anche se questo può sembrare un problema per la sicurezza del server, è in realtà un sistema molto sicuro dato che consente solamente agli utenti con i privilegi sudo di accedere all'account root di MySQL.
Sul lato pratico si traduce nell'impossibilità di connettersi all'account root di MySQL dalle applicazioni PHP.
La password che è stata impostata, quindi, serve solamente come misura di sicurezza nel caso il sistema di autenticazione venisse cambiato da unix_socket
a password
.
Per aumentare la sicurezza è consigliabile utilizzare account dedicati con solamente i privilegi indispensabili sui database a cui dovranno accedere.
Attenzione: attualmente la libreria mysqlnd di PHP per MySQL non supporta caching_sha2_authentication
, il metodo di autenticazione predefinito da MySQL 8. Per questo motivo, quando creiamo degli utenti su MySQL 8 da utilizzare con applicazioni PHP, dovremo importare il metodo di autenticazione a mysql_native_password
. Vedremo poi come fare.
Terminato questo step MySQL è stato installato correttamente sul nostro server. Possiamo quindi procedere con PHP, l'ultimo componente dello stack LAMP.
Installare PHP su Ubuntu
Adesso che abbiamo Apache e MySQL installati, possiamo procedere con PHP, che sarà responsabile di processare il codice e visualizzare il contenuto dinamico delle pagine web all'utente.
Oltre al pacchetto php
andremo ad installare php-mysql
, il modulo che consente a PHP di comunicare con i database MySQL. Installeremo anche libapache2-mod-php
per consentire ad Apache di gestire i file PHP. Tutti i pacchetti core di PHP saranno automaticamente scaricati ed installati come dipendenze.
Per installare i pacchetti utilizziamo:
sudo apt install php php-mysql libapache2-mod-php
Una volta che l'installazione sarà terminata, possiamo verificare la versione con il comando:
php -v
L'output dovrebbe assomigliare al seguente:
PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
A questo punto il nostro stack LAMP è stato completamente installato ed è funzionante, ma prima di iniziare a hostare i nostri siti in PHP è consigliabile configurare un Apache Virtual Host per i file del nostro sito. Vedremo come farlo nel prossimo passaggio della guida.
Creare un Virtual Host per il sito web
Avendo un server web con Apache, possiamo creare dei Virtual Host (host virtuali) per racchiudere tutti i dettagli della configurazione. Gli host virtuali ci consentono anche di hostare più di un dominio su un singolo server. Per il momento vedremo come configurare un dominio chiamato esempio.it, ma ovviamente dovreste sostituirlo con il vostro dominio!
Con Apache installato su Ubuntu 20.04 abbiamo a disposizione un host virtuale abilitato di default e configurato per fornire i documenti dalla directory /var/www/html
. Questo sistema funziona bene quando vogliamo hostare un sito web singolo, ma può diventare complesso hostare più siti web con domini diversi.
Invece di modificare la directory /var/www/html
andremo a creare una struttura all'interno di /var/www
per il sito web esempio.it, lasciando /var/www/html
come directory di default da servire ad un utente nel caso la sua richiesta non corrisponda a nessun altro sito.
Creiamo la cartella per il nostro dominio esempio.it:
sudo mkdir /var/www/esempio.it
Adesso andiamo ad assegnare la proprietà della cartella alla variabile d'ambiente $USER
, che fa riferimento al tuo utente attuale:
sudo chown -R $USER:$USER /var/www/esempio.it
Procediamo aprendo un nuovo file di configurazione all'interno della directory sites-available
di Apache utilizzando il nostro editor preferito, in questo caso nano
:
sudo nano /etc/apache2/sites-available/esempio.it.conf
Questo comando creerà un nuovo file vuoto, all'interno del quale andremo ad incollare questa configurazione di base:
<VirtualHost *:80>
ServerName dominio.it
ServerAlias www.dominio.it
ServerAdmin webmaster@localhost
DocumentRoot /var/www/dominio.it
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Dopo aver inserito il nostro dominio possiamo salvare il file e chiudere l'editor. Con nano basterà premere Ctrl + X
, poi premere Y
e infine Invio
.
Con questa configurazione dell'host virtuale stiamo dicendo ad Apache di rispondere alle richieste fatte a dominio.it utilizzando la cartella /var/www/dominio.it
come directory di root per il sito web.
Se vuoi verificare il funzionamento di Apache senza un dominio puoi rimuovere o commentare le linee con le opzioni ServerName
e ServerAlias
aggiungendo un #
all'inizio delle righe.
Ora abilitiamo il nuovo Virtual Host utilizzando a2ensite
:
sudo a2ensite dominio.it
Potresti voler disabilitare il sito web predefinito che è stato installato con Apache. Questo è necessario se non stai usando un dominio dato che la configurazione di Apache andrà a sovrascrivere comunque l'host virtuale. Per disabilitare il sito web predefinito di Apache digita:
sudo a2dissite 000-default
Per assicurarti che non ci sia nessun errore di sintassi nella configurazione:
sudo apache2ctl configtest
Infine ricarichiamo Apache per rendere effettivi i nostri cambiamenti:
sudo systemctl reload apache2
Il nostro sito web dominio.it è ora attivo, ma la directory /var/www/dominio.it
è vuota, di conseguenza non vedremo ancora nulla. Creiamo subito un nuovo file index.html all'interno della cartella in modo da poter verificare che i nostri virtual host funzioni correttamente:
nano /var/www/dominio.it/index.html
Scriviamo questo nel nostro file:
<!DOCTYPE html>
<html>
<head>
<title>Sito dominio.it</title>
</head>
<body>
<h1>Ciao Mondo!</h1>
<p>Questa è la pagina web di <b>dominio.it</b>.</p>
</body>
</html>
Adesso possiamo andare sul nostro browser e accedere al nostro server scrivendo il dominio a cui abbiamo associato il sito o l'IP pubblico del server:
http://dominio.it
Dovrebbe caricarsi questa pagina:
Se vediamo tutto correttamente significa che il nostro host virtuale Apache funziona correttamente.
Questa è la pagina che gli utenti vedranno quando visitano il nostro sito. Poi potremmo sostituirla con un file index.php
, e in quel momento ci ricorderemo di eliminare il file index.html
, dato che avrebbe la precedenza sul file php
, impedendo agli utenti di visualizzarlo.
Attenzione alla precedenza dei file!
Con le impostazioni predefinite di Apache, un file chiamato index.html
avrà sempre la precedenza su un file index.php
. Questo può essere molto utile nel caso volessimo mettere in manutenzione un sito web creando semplicemente un file index.html
che impedirà agli utenti di visualizzare il sito e da rimuovere poi a manutenzione finita.
Nel caso volessimo modificare questa impostazione, dovremo andare a modificare il file /etc/apache2/mods-enabled/dir.conf
con un editor di testo:
sudo nano /etc/apache2/mods-enabled/dir.conf
Modifichiamo a questo punto l'ordine in cui i file sono elencati in DirectoryIndex
:
<IfModule mod_dir.c>
DirectoryIndex index.html index.php index.cgi index.pl index.xhtml index.htm
</IfModule>
Dopo aver salvato e aver chiuso il file, possiamo ricaricare Apache per rendere effettivi i cambiamenti:
sudo systemctl reload apache2
Nel prossimo passaggio andremo a creare uno script PHP per verificare il funzionamento di PHP sul nostro server.
Verificare il funzionamento di PHP sul server web
Ora che abbiamo un posto per salvare i file del nostro sito web, andiamo a creare uno script PHP per verificare che Apache riesca a gestire e processare correttamente le richieste per i file PHP.
Creiamo un file chiamato info.php
all'interno della nostra directory:
nano /var/www/dominio.it/info.php
Questo ci aprirà un nuovo file vuoto. All'interno di esso andiamo ad inserire il seguente codice PHP:
<?php
phpinfo();
?>
Quando abbiamo terminato possiamo salvare e chidere il file.
Per verificare che lo script funzioni possiamo connetterci al nostro sito web e aggiungere il nome dello script (info.php
) dopo il dominio o l'indirizzo IP del server:
http://dominio.it/info.php
Dovreste vedere una pagina simile a questa:
Questa pagina ci consente di visualizzare varie informazioni sul nostro server riguardanti PHP. Può risultare molto utile durante in fase di debug e per controllare che eventuali modifiche alle impostazioni vengano applicate correttamente.
Se vediamo questa pagina nel nostro browser significa che PHP è stato installato e funziona correttamente.
Terminata la verifica possiamo rimuovere il file per evitare che un qualsiasi utente possa visualizzare informazioni sensibili sul nostro server:
sudo rm /var/www/dominio.it/info.php
Se in futuro avremo nuovamente bisogno di queste informazioni, possiamo in ogni momento creare nuovamente il file.
Conclusione
In questa guida abbiamo visto come configurare un server con Ubuntu per hostare siti web e applicazioni scritte in PHP con Apache per rispondere alle richieste degli utenti e con MySQL per salvare i dati su un database.
Come prossimo passo dopo aver seguito questa guida, per rendere più sicuro il server web appena configurato, è consigliabile configurare un certificato TLS/SSL per fornire la pagine con HTTPS.