Vuoi imparare a sviluppare siti web oppure configurare in autonomia un server virtuale (VPS) per il tuo progetto Internet? Ebbene: il primo passo da compiere è l'installazione del server web, ovvero il programma che si occupa di servire le pagine web ai visitatori. In questa guida passo passo vedremo dunque proprio come installare Apache HTTP Server sul PC o server Linux con Ubuntu
Trattazione aggiornata per funzionare al meglio con Ubuntu 22.04
In questo articolo ci concentreremo, nello specifico, sull'installazione di Apache HTTP Server su Linux (Ubuntu o CentOS). Per la guida equivalente incentrata su Windows:
» Leggi: La Grande Guida ad Apache, MySQL, PHP
Nel resto dell'articolo ci riferiremo al programma "Apache HTTP Server" chiamandolo (impropriamente) solo "Apache", per brevità e per conformarci al nome usato nel quotidiano.
Una stesura precedente di questa guida (archiviata qui) trattava anche CentOS, mentre oggi è focalizzata unicamente su Ubuntu. La procedura è stata testata su Ubuntu 22.04 e 20.04 (sia "Desktop", sia "Server"), ma è analoga per tutte le distribuzioni derivate (fra le quali "Mint") e, presumibilmente, per le iterazioni successive.
Installare Apache su Linux Ubuntu: Aprire il Terminale
Se stai lavorando via SSH oppure su Ubuntu Server sei già davanti alla linea di comando, quindi prosegui oltre.
Se però ti trovi in un ambiente grafico, devi avviare il Terminale: il mio metodo preferito è tramite la combinazione da tastiera Ctrl+Alt+T
. In alternativa:
- clicca sul pulsante con i 3x3 punti in basso a sinistra
- digita
terminale
- clicca sul collegamento mostrato
» Leggi anche: Come aprire il terminale di Ubuntu
Installare Apache su Linux Ubuntu: Installazione completamente automatica
Da questa situazione, puoi installare Apache HTTP Server su Ubuntu in modo completamente automatico impartendo questo singolo comando:
sudo apt install curl -y && curl -s https://raw.githubusercontent.com/TurboLabIt/webstackup/master/script/apache-httpd/install.sh?$(date +%s) | sudo bash
In caso fosse richiesta la password, digita quella del tuo utente Linux (quella che usi per eseguire login al sistema)
Il comando appena impartito esegue uno script (visualizzabile qui) che svolge in sequenza tutte le tediose operazioni che, altrimenti, dovremmo impartire manualmente (vedi seguito dell'articolo).
Al termine, puoi lanciare in successione questi due comandi dallo stesso sistema sul quale hai appena installato Apache per tentare di connetterti:
curl http://127.0.0.1
curl -k https://127.0.0.1
Se, in risposta, viene visualizzato codice HTML, significa che l'installazione è riuscita
Tecnicamente, i messaggi di risposta che vedi sono errori, ma, in questo momento, non importa. Quello che conta è che il server web risponda, come effettivamente avviene!
Nei prossimi paragrafi vedremo la procedura alternativa per svolgere manualmente gli stessi passaggi che lo script ha eseguito automaticamente. Se hai usato lo script, puoi saltare tutto e riprendere dal Passo 14: Creare la cartella con i progetti web
.
Installare Apache su Linux Ubuntu, Passo 1: Diventare root
La procedura tramite script descritta ai paragrafi precedenti installa Apache HTTP Server automaticamente ed è la modalità che, personalmente, raccomando. Se però preferisci installare Apache manualmente, puoi ottenere un risultato analogo seguendo i passaggi forniti di seguito.
Per prima cosa, devi acquisire i privilegi massimi diventando root. Il comando è:
sudo -s
In caso ti fosse richiesta la password, digita quella del tuo utente Linux (quella che usi per eseguire login al PC)
» Leggi anche: Sudo senza password con Ubuntu: come disabilitare la richiesta di password quando si eseguono comandi come root (video)
Installare Apache su Linux Ubuntu, Passo 2: Disinstallare... Apache
Prima di proseguire, è opportuno verificare che Apache non sia già stato installato, magari per errore. Il modo più efficace di farlo è tramite il gestore dei pacchetti:
dpkg --list | grep apache2
Se il comando non mostra alcuna risposta, possiamo tranquillamente andare oltre perché Apache non è installato.
In caso contrario, è fondamentale disinstallare il pacchetto corrente:
apt purge --auto-remove apache2* -y
Raccomando caldamente anche di eliminare eventuali file di configurazione relativi alla precedente installazione, di modo da partire con una situazione pulita:
rm -rf /etc/apache2
Installare Apache su Linux Ubuntu, Passo 3: Installare i pre-requisiti
Apache richiede la presenza di alcuni pacchetti, che devono essere installati manualmente. Il comando per ottenerli tutti in un colpo solo, insieme anche ad altre utility che serviranno fra poco, è il seguente:
apt update && apt install software-properties-common curl gnupg2 ca-certificates lsb-release ubuntu-keyring openssl zip unzip nano -y
Installare Apache su Linux Ubuntu, Passo 4: Installazione del pacchetto
Procediamo ora materialmente ad installare Apache HTTP Server:
apt install apache2 -y
Installare Apache su Linux Ubuntu, Passo 5: Impostare la direttiva ServerName
L'operazione seguente non è strettamente necessaria, ma previene il fastidioso avviso AH00558: apache2: Could not reliably determine the server's fully qualified domain name
nei log e nel terminale. Personalmente, raccomando di svolgerla:
echo "ServerName $(hostname)" > /etc/apache2/conf-available/server-name.conf && a2enconf server-name
Installare Apache su Linux Ubuntu, Passo 6: Prima esecuzione
Apache è ora installato e dovrebbe già essersi avviato automaticamente. È comunque opportuno riavviare il servizio, di modo da verificare esplicitamente che sia tutto OK. Allo scopo, ti consiglio di usare SEMPRE questo specifico comando concatenato:
apachectl configtest && service apache2 restart
In questo modo, Apache verifica che la nuova configurazione sia corretta prima di avviare o riavviare il servizio. Se viene rilevato un problema:
- viene visualizzata una chiara indicazione di dove si trova l'errore
- Apache continua a funzionare comunque con la configurazione precedente
Questo è un piccolo ma importante "trucco" che fa la differenza, soprattutto quando si utilizza Apache su un server di produzione. Ricordalo!
Installare Apache su Linux Ubuntu, Passo 7: Test del servizio
Il web server è ora attivo e mostra una pagina di benvenuto "standard" a tutti i client che vi si colleghino. Se il computer sul quale è in esecuzione Apache è dotato di un browser web, puoi verificarlo aprendo http://localhost, ovvero facendo collegare il sistema... a se stesso
Se invece il sistema non ha il browser web, puoi simulare lo stesso comportamento impartendo questo comando:
curl http://localhost
Se la risposta è composta da una serie di tag HTML fra i quali si legge qualcosa di simile a <title>Apache2 Ubuntu Default Page: It works</title>
, tutto sta funzionando correttamente
Installare Apache su Linux Ubuntu, Passo 8: Attivazione della modalità "ad eventi"
Apache HTTP Server è dotato di molteplici MPM (Multi-Processing Modules). Possiamo pensare agli MPM come "motori" intercambiabili: tutti svolgono lo stesso compito (accettare e rispondere alle richieste dei browser web e degli altri client che si collegano), ma ognuno lo fa in modo diverso, con vantaggi e svantaggi.
Gli MPM disponibili ad Apache in ambiente Linux sono:
- prefork: Apache genera un elevato numero di processi all'avvio del servizio, e ogni processo risponde a una richiesta. È una modalità semplice, stabile e molto sicura, ma occupa tantissima RAM, limitando il numero di richieste alle quali il server è in grado di rispondere contemporaneamente
- worker: Apache genera un numero limitato di processi, e ogni processo utilizza molteplici thread (uno per ogni connessione). È una buona soluzione, che limita fortemente il consumo di memoria, ed è l'MPM "standard" con cui Apache è stato configurato nel recente passato
- event: è l'MPM più veloce e moderno. È simile a "worker", ma qui i thread che accettano le richieste le passano ad altri thread per l'elaborazione asincrona, riuscendo così ad accettare altre richieste in parallelo
Per maggiori informazioni, vedi la pagina "Module Index" della documentazione ufficiale.
Per quanto detto, la configurazione ottimale prevede l'uso di "event". Assicuriamoci dunque che sia attivo impartendo:
apachectl -M | grep 'mpm'
Se la risposta è simile a mpm_event_module (shared)
, il sistema sta già utilizzando l'MPM ottimale e possiamo andare oltre.
Se invece vengono citati gli altri MPM, è opportuno disattivarli in favore di "event". Il comando per farlo è il seguente:
a2dismod mpm_prefork mpm_worker && a2enmod mpm_event
Installare Apache su Linux Ubuntu, Passo 9: Attivare HTTPS, Rewrite, HTTP/2
Apache è dotato di una serie di funzionalità indispensabili per il web moderno, che, però, non sono attive di default. Per attivare il supporto ad HTTP/2, "URL rewrite" e HTTP, impartire il comando seguente:
a2enmod http2 rewrite ssl
Una nota per i più attenti: Apache parla di "SSL" per intendere la comunicazione HTTPS cifrata in generale che, sebbene una volta fosse crittografata proprio da SSL, oggi utilizza per lo più TLS. Apache supporta comunque nativamente TLS.
Installare Apache su Linux Ubuntu, Passo 10: Generare un certificato per attivare HTTPS
Il web moderno funziona via HTTPS (con la "s" finale), e quindi anche il nostro server deve fare lo stesso. Generiamo dunque un certificato HTTPS da utilizzare con tutti i siti erogati dal nostro server. Tale certificato, bene inteso, sarà di tipo "self-signed", ovvero "di test", e farà scattare un avviso nel browser web: ma è comunque meglio che non utilizzare HTTP "semplice", e sarà comunque facile sostituirlo in seguito con un certificato "reale" poco prima di andare in produzione.
Prima creiamo la cartella:
mkdir -p /usr/local/turbolab.it/webstackup/autogenerated
[ nota: in realtà, puoi scegliere un percorso qualsiasi per la cartella, ma nel seguito utilizzeremo quello indicato nell'esempio. Raccomando di non modificarlo, altrimenti diventa difficile seguire la guida ]
Poi generiamo una chiave crittografica:
openssl genrsa -out /usr/local/turbolab.it/webstackup/autogenerated/openssl-private-key.pem
Infine, usiamola per generare il certificato HTTPS vero e proprio:
openssl req -x509 -out /usr/local/turbolab.it/webstackup/autogenerated/https-localhost.crt -key /usr/local/turbolab.it/webstackup/autogenerated/openssl-private-key.pem -days 3650 -new -nodes -sha256 -subj "/CN=localhost"
Visualizziamo ora il contenuto della cartella:
ls -la /usr/local/turbolab.it/webstackup/autogenerated
Troverai due file:
https-localhost.crt
: è il certificato HTTPS vero e proprioopenssl-private-key.pem
: è la chiave crittografica utilizzata per generarlo
Ci serviranno entrambi più avanti.
Installare Apache su Linux Ubuntu, Passo 11: Redirect automatico da HTTP a HTTPS
Facciamo ora in modo che tutte le richieste in HTTP inviate al nostro server generino un redirect verso l'equivalente sito in HTTPS. Allo scopo, scarichiamo la configurazione già pronta all'uso (disponibile qui) direttamente nella cartella delle configurazioni di Apache tramite il seguente comando:
curl -Lo /etc/apache2/sites-available/00_global_https_upgrade_all.conf https://raw.githubusercontent.com/TurboLabIt/webstackup/master/config/apache-httpd/global_https_upgrade_all.conf
Il comando scarica il file in /etc/apache2/sites-available/00_global_https_upgrade_all.conf
.
Ora attiviamo la configurazione appena scaricata tramite il comando:
a2ensite 00_global_https_upgrade_all
Installare Apache su Linux Ubuntu, Passo 12: Disattivare il sito di default
La pagina di cortesia con il testo It works!
visualizzata in precedenza è comoda subito dopo l'installazione, per verificare che Apache funzioni, ma poi deve tassativamente essere rimossa. Il comando da impartire è:
a2dissite 000-default
Al suo posto, facciamo in modo che il server web ritorni un errore "sito non trovato" ogni volta in cui venga richiesto un dominio non esplicitamente configurato. Allo scopo, otteniamo la configurazione già pronta all'uso (disponibile qui) tramite il seguente comando:
curl -Lo /etc/apache2/sites-available/05_global_default_vhost_disable.conf https://raw.githubusercontent.com/TurboLabIt/webstackup/master/config/apache-httpd/global_default_vhost_disable.conf
Il comando scarica il file in /etc/apache2/sites-available/05_global_default_vhost_disable.conf
.
Ora attiviamo la configurazione appena scaricata tramite il comando:
a2ensite 05_global_default_vhost_disable
Installare Apache su Linux Ubuntu, Passo 13: Verificare la situazione
Arrivati a questo punto, è opportuno verificare che tutto funzioni ancora correttamente. Riavviamo il servizio per rendere effettive le ultime modifiche:
apachectl configtest && service apache2 restart
Aprendo ora http://localhost tramite browser web (vedi seguito se il sistema su cui hai installato Apache non ha l'interfaccia grafica e non puoi quindi usare il browser), notiamo che, anche se abbiamo richiesto il sito in HTTP, viene effettuato un redirect automatico verso lo stesso sito in HTTPS. È merito della configurazione tramite il file 00_global_https_upgrade_all.conf
che abbiamo scaricato poco fa!
Allo stesso tempo, poiché stiamo utilizzano un certificato HTTPS "self-signed" (vedi trattazione precedente) comparirà l'avviso di sicurezza La tua connessione non è privata
È dunque necessario cliccare sul pulsante Avanzate
e seguire il link Continua con
Compare così una pagina di errore con il messaggio 400 Bad Request
. Perfetto! È merito della configurazione svolta tramite il file 05_global_default_vhost_disable.conf
scaricato poco fa, che scatena questo errore in caso un client richiedesse un sito non debitamente configurato... cioè esattamente quello che stiamo tentando di fare qui
Niente paura: nei passi successivi configureremo esplicitamente il nostro sito.
Se invece il sistema sul quale hai appena installato Apache non ha l'interfaccia grafica e il browser web, puoi svolgere la medesima prova da linea di comando impartendo:
curl --head http://localhost
Il parametro fa in modo venga visualizzata l'intestazione (header) della risposta HTTP, dalla quale vediamo che il server web risponde ridirezionando la connessione verso l'equivalente pagina HTTPS (riga Location: https://localhost/
).
Impartendo dunque
curl -k https://localhost
Viene visualizzato lo stesso HTML che compone la pagina di errore visualizzata nel browser web poco più sopra
Installare Apache su Linux Ubuntu, Passo 14: Creare una nuova "home" per www-data
Per convenzione, che dovrebbe divenire legge di stato, i file che compongono i vari siti web erogati da Apache vanno salvati in una cartella dedicata sotto al percorso /var/www
. Ne parleremo fra un attimo.
Al momento, però, questo stesso percorso è anche la "home" dell'utente Linux www-data
. Ne consegue che, in seguito ad alcune azioni, potrebbero comparire qui dentro anche file temporanei e altre cartelle relative alle preferenze dell'utente. Non ci piace.
Per risolvere il problema, creiamo una cartella dedicata e impostiamola come home per l'utente www-data tramite questo lungo comando concatenato:
mkdir -p /home/www-data && chown www-data:www-data /home/www-data -R && chmod ug=rwx,o= /home/www-data -R && usermod -d /home/www-data www-data
Molto meglio!
Installare Apache su Linux Ubuntu, Passo 15: Creare la cartella con i progetti web
Come dicevamo, i file che compongono i vari siti web erogati vanno salvati in una sotto-cartella dedicata di /var/www
. Il sito che stai leggendo ora, ad esempio, è ospitato veramente sotto /var/www/turbolab_it
!
Creiamo dunque la cartella /var/www
, e una sotto-cartella chiamata local
che conterrà il nostro primo sito di test:
mkdir -p /var/www/local
Dobbiamo poi consentire l'accesso alla cartella all'utente Linux www-data e all'omonimo gruppo, ovvero quello che esegue il processo del server web:
chown www-data:www-data /var/www -R && chmod ug=rwX,o= /var/www -R
Come ultima "finezza", lanciamo il comando seguente:
chmod g+s /var/www
Fa in modo che tutti i nuovi file creati nella cartella vengano automaticamente assegnati al gruppo www-data
.
Installare Apache su Linux Ubuntu, Passo 16: Scaricare il sito web di test
Procedi scompattando nella cartella /var/www/local
un archivio zip che contiene alcuni file HTML di esempio che ho preparato. Il comando è il seguente:
curl -Lo /var/www/local/sito.zip https://turbolab.it/scarica/145 && unzip -o /var/www/local/sito.zip -d /var/www/local/ && rm -f /var/www/local/sito.zip
Installare Apache su Linux Ubuntu, Passo 17: Scaricare il file di configurazione
Ora scarica il file di configurazione semi-pronto che consente ad Apache di rispondere alle richieste erogando le pagine HTML del nostro sito di test:
curl -Lo /etc/apache2/sites-available/local.conf https://turbolab.it/scarica/175
Dopodiché, attiva la nuova configurazione:
a2ensite local
Installare Apache su Linux Ubuntu, Passo 18: Configurare un sito per localhost
Apri ora il file di configurazione appena scaricato:
nano /etc/apache2/sites-available/local.conf
All'interno, trovi varie direttive:
ServerName
: è il dominio gestito da questa specifica configurazione. Nel file che hai scaricato è impostato alocalhost
, poiché risponderà al sitohttps://localhost
. Se in futuro vorrai gestire un tuo dominio (mio-sito.com
, ad esempio) dovrai indicarlo quiDocumentRoot
: indica dove si trovano i file HTML, PHP, CSS, immagine ecc. che compongono il sito web. Nel file che hai scaricato è impostato a/var/www/local
<Directory>
: indica le opzioni da applicare al percorso indicato. Nel caso proposto nella configurazione di default, permette l'accesso alla "root" del sitoSSLCertificateFile
eSSLCertificateKeyFile
: fanno riferimento al certificato HTTPS e alla relativa chiave. Nel file che hai scaricato utilizziamo il certificato "self-signed" che abbiamo generato alcuni Passi fa
Per il nostro prossimo test non devi modificare nulla, quindi ti basta capire il significato dei parametri, poi battere la combinazione Ctrl+X
sulla tastiera per uscire.
Installare Apache su Linux Ubuntu, Passo 19: Riavviare il servizio
Ora che la configurazione è pronta, dobbiamo riavviare Apache per renderla effettiva. Come al solito, usa
apachectl configtest && service apache2 restart
In questo modo puoi visualizzare eventuali errori ed evitare di bloccare il servizio in caso qualcosa sia sbagliato.
Installare Apache su Linux Ubuntu, Passo 20: Visualizzare la pagina con il browser web
È tutto pronto: apri il browser web sullo stesso sistema sul quale hai installato Apache e visita https://localhost per visualizzare il sito che hai appena configurato (se si tratta di un server senza interfaccia grafica, usa il solito curl -k https://localhost
per visualizzare l'HTML a Terminale).
Se tutto funziona correttamente, vedrai la pagina di test
Prova ora a modificare, con l'editor da terminale, il file HTML che stai visualizzando:
nano /var/www/local/index.html
Fai qualche modifica, salva, poi ricarica la pagina nel browser per vedere le modifiche apportate - Ricorda che la sequenza di combinazioni da tastiera per salvare e uscire dall'editor sul terminale è Ctrl+O
, Invio
, Ctrl+X
.
Tanto per capire meglio come funziona l'installazione attuale, svolgi questo semplice esercizio:
- copia il file:
cp /var/www/local/index.html /var/www/local/pagina1.html
- usando l'editor di testi, apri la copia appena creata:
nano /var/www/local/pagina1.html
- scrivi qualcosa a piacere (anche solo
Ciao a tutti!
va benissimo) e poi salva le modifiche - da browser web, apri http://localhost/pagina1.html (oppure
curl -k https://localhost/pagina1.html
da terminale) - visualizzerai così il contenuto della nuova pagina
La situazione è dunque la seguente (la schermata è stata catturata da Windows, ma è analoga sotto Linux)
In definitiva: accodando il nome del file desiderato all'indirizzo http://localhost/
, il browser richiede detto file al server web. Se il file esiste nella cartella che abbiamo specificato come DocumentRoot
, Apache lo ritorna al browser, che lo interpreta e lo mostra.
Installare Apache su Linux Ubuntu, Passo 21: Erogare molteplici siti
La configurazione attuale funziona perché abbiamo configurato esplicitamente tutto quanto per rispondere a http://localhost. Proseguiamo ora facendo in modo che il servizio risponda anche ad altri domini: ad esempio, potremmo erogare i siti sito1.com
e sito2.com
dallo stesso PC/server.
Iniziamo aggiungendo queste righe al file hosts del sistema sul quale abbiamo installato Apache:
127.0.0.1 sito1.com www.sito1.com
127.0.0.1 sito2.com www.sito2.com
127.0.0.1 sito3.com www.sito3.com
Così facendo, ogni tentativo di contattare questi domini viene risolta sul sistema locale. Se si tratta di una connessione HTTP o HTTPS (come quella inviata del browser quando richiede una pagina web), risponderà il nostro Apache.
Creiamo le cartelle adibite ad erogare i primi due nuovi siti. Seguendo l'impostazione precedente, lanciamo:
mkdir /var/www/sito1
mkdir /var/www/sito2
Scompattiamo all'interno di entrambe le cartelle il pacchetto con i file di esempio già usato in precedenza. Per il primo sito:
curl -Lo /var/www/sito1/sito.zip https://turbolab.it/scarica/145 && unzip -o /var/www/sito1/sito.zip -d /var/www/sito1/ && rm -f /var/www/sito1/sito.zip
Per il secondo sito:
curl -Lo /var/www/sito2/sito.zip https://turbolab.it/scarica/145 && unzip -o /var/www/sito2/sito.zip -d /var/www/sito2/ && rm -f /var/www/sito2/sito.zip
Ora entriamo e modifichiamo le rispettive copie di index.html
per mostrare un messaggio che ci permetta poi di distinguere i due siti. Ad esempio:
nano /var/www/sito1/index.html
: scriviBenvenuto su sito1.com
nano /var/www/sito2/index.html
: scriviStai guardando sito2.com
Procediamo ora a duplicare il file di configurazione local.conf
(l'avevamo scaricato prima, ricordi?) creando un file di configurazione per sito1.com
:
cp /etc/apache2/sites-available/local.conf /etc/apache2/sites-available/sito1.conf
Attiviamo la configurazione:
a2ensite sito1
Apriamo il nuovo file:
nano /etc/apache2/sites-available/sito1.conf
Ora:
- valorizziamo
ServerName
di modo che corrisponda al dominio che vogliamo gestire (in questo caso:sito1.com
) - modifichiamo il percorso dopo la direttiva
DocumentRoot
per fare in modo che punti alla directory che contiene il nostro sito (in questo caso:/var/www/sito1
) - salva le modifiche al file e chiudi
Ripeti tutto per configurare sito2.com
, quindi riavvia il servizio:
apachectl configtest && service apache2 restart
Se tutto è filato liscio, torna al browser web e prova ad aprire http://sito1.com: superando l'avviso di sicurezza, dovresti vedere il messaggio personalizzato che avevi inserito nel relativo file index.html
. Aprendo http://sito2.com verrà visualizzata l'altra pagina
Aprendo http://sito3.com (il dominio che avevamo inserito nel file hosts ma non configurato in Apache) verrà mostrato un messaggio di errore, proprio perché non è stato configurato.
Cosa fare ora?
Arrivati a questo punto, il nostro Apache su Linux è perfettamente configurato e funzionante. Probabilmente, però, vorrai installare anche PHP e MySQL di modo da eseguire un gestore di contenuti (CMS) come WordPress e creare il tuo blog, oppure imparare a programmare. Per il resto della guida: