Come configurare HTTP/2 su Virtualmin GPL con il repo CodeIT
Scopri come installare una versione recente di Apache con supporto HTTP/2 su Virtualmin GPL e CentOS 7.
HTTP/2 su Virtualmin: il problema
Virtualmin è un ottimo pannello di controllo hosting disponibile sia in version free con licenza GPL, sia in versione a pagamento. Anche se quest'ultima offre funzionalità aggiuntive, già la versione GPL è comunque un ottimo punto di partenza.
Quando si tratta di HTTP/2 però, la moderna versione del protocollo HTTP, Virtualmin su CentOS 7 ha una grossa limitazione. La versione di Apache inclusa nei repo Virtualmin infatti è la 2.4.6, che non include il supporto per HTTP/2.
Questo problema oggi è risolto con CentOS 8 che tra le altre cose include le versioni aggiornate dei principali software per hosting, ma nel momento in cui scrivo Virtualmin non supporta ancora CentOS 8.
Bisogna considerare anche altri fattori comunque: non tutti possono permettersi di passare a CentOS 8, soprattutto perché le applicazioni legacy costruite con vecchie versioni di PHP non troverebbero terreno per girare. Non è facile infatti installare PHP 5.x sulla nuova versione di CentOS.
(E' facile invece fare il contrario. CentOS 7 nasce con PHP 5.4.16 che può essere la base per le applicazioni più datate, mentre è possibile affiancare varie versioni di PHP 7.x con i repo Remi).
Per questo motivo quindi la scelta di usare CentOS 7 ha ancora molto senso. In questo post vedrai come installare una versione recente di Apache con supporto HTTP/2 su Virtualmin GPL e CentOS 7.
Leggi prima di proseguire!
Alla base del tutorial che stiamo per sviluppare c'è un repo di pacchetti RPM di terze parti, CodeIT. Il suggerimento in linea di massima è quello di non installare mai pacchetti provenienti da repo di terze parti non verificate.
Scegli quindi con giudizio l'opportunità di proseguire o meno. Altra nota importante: non lanciare i comandi che seguono su un sistema in produzione che ospita già siti.
Questo tutorial è inteso per sistemi vergini non ancora in produzione.
HTTP/2 su Virtualmin: installazione dei pacchetti
Come primo step dobbiamo installare Virtualmin sul sistema con lo script Virtualmin GPL, disponibile a questo link.
Dopo lo scaricamento basta lanciare l'eseguibile e seguire le istruzioni:
wget http://software.virtualmin.com/gpl/scripts/install.sh
sh install.sh
Al termine dell'installazione il sistema sarà quasi pronto per l'uso, ma prima di proseguire dobbiamo prepararlo all'installazione del repo CodeIT.
In particolare è necessario rimuovere i pacchetti "vecchi", httpd, httpd-tools e mod_ssl:
rpm -ev httpd httpd-tools mod_ssl --nodeps
Questo modo di rimuovere i pacchetti è un po' "sporco", e non lo raccomando sempre. --nodeps
fa sempre sudare freddo. Dopo aver rimosso i pacchetti dobbiamo anche fare in modo che eventuali update non reinstallino le versioni vecchie di httpd, httpd-tools e mod_ssl contenute nel repo virtualmin.
Apri il file /etc/yum.repos.d/virtualmin.repo
con un editor di testo ed escludi i pacchetti da yum:
[virtualmin]
# omesso per brevità
exclude=httpd mod_ssl httpd-tools
A questo punto siamo pronti per configurare il repo CodeIT con:
yum-config-manager --add-repo https://repo.codeit.guru/codeit.el7.repo
E finalmente possiamo installare i pacchetti:
yum install httpd mod_ssl
httpd, httpd-tools e mod_ssl verranno prelevati dal repo CodeIT (è molto importante non tralasciare mod_ssl) e ci ritroveremo con la versione 2.4.41 di Apache, compilata con HTTP/2. Per confermare lancia:
httpd -V
e dovresti vedere Server version: Apache/2.4.41 (codeit). Ora non dimentichiamo di attivare http al boot e di lanciarlo con:
systemctl enable httpd && systemctl start httpd
Dopo aver completato questi passaggi arriva ora il momento di configurare Virtualmin.
HTTP/2 su Virtualmin: configurare Virtualmin
La versione di Apache offerta da CodeIT ha un unico "problema": è compilata per usare /var/www
come base per suexec. Questo significa che la configurazione stock di Virtualmin che è impostata invece per creare i siti web in /home
non funzionerà più.
Fortunatamente è possibile aggirare il problema configurando Virtualmin per creare i virtual host in /var/www
. Dopo aver installato il pannello quindi visita https://your-server-host.com:10000
dove your-server-host.com deve essere il dominio o l'ip del tuo server.
All'interno del pannello Virtualmin vai su System settings -> Virtualmin configuration -> Defaults for new domains ed imposta Home directory base su /var/www
.
Questo passaggio è importante per evitare di dover ricompilare Apache. A questo punto puoi procedere lanciando il set up iniziale, e fatto questo proseguire con Re-check and refresh configuration.
A questo punto avrai un sistema pronto con Virtualmin ed HTTP/2.
Testare HTTP/2
Dopo la configurazione vorrai sicuramente testare la corretta configurazione di HTTP/2. Nota bene che è richiesto necessariamente un certificato SSL affinchè il sito possa operare in HTTP/2.
Il test HTTP/2 può essere lanciato velocemente anche da riga di comando con Curl. Esempio:
curl -I --http2 https://www.last-hop.it
La presenza della riga HTTP/2 200
nell'output della risposta (che mostra solo gli header grazie al flag -I
) è la garanzia che HTTP/2 sta funzionando correttamente:
HTTP/2 200
date: Sun, 15 Mar 2020 11:39:43 GMT
server: Apache/2.4.41 (codeit) OpenSSL/1.1.1d mod_fcgid/2.3.9
last-modified: Sun, 15 Mar 2020 11:39:40 GMT
etag: "e-5a0e328717fb0"
accept-ranges: bytes
content-length: 14
content-type: text/html; charset=UTF-8
E' possibile anche testare un sito in modalità "verbosa" con il flag v
di Curl:
curl -I -v --http2 https://www.your-website.com
Se nell'output vedi la seguente riga, anche questa è garanzia del corretto funzionamento di HTTP/2:
* ALPN, server accepted to use h2
Il seguente output invece significa che HTTP/2 non è attivo. Molto spesso questo è dovuto ad una scorretta configurazione di mod_ssl:
* ALPN, server did not agree to a protocol
Grazie per aver letto e rimani sintonizzato/a sul blog!