HTTP / 2 è la nuova versione del protocollo HTTP / 1.1 ormai obsoleto che è stato standardizzato nel lontano 1999. Da allora sono cambiate molte cose sul web. Le nostre applicazioni sono più complesse di quanto non fossero in passato, quindi per far fronte a questo, era necessario modificare il protocollo di trasporto sottostante. La cosa più importante di HTTP / 2 è che renderà la tua pagina web più veloce per gli utenti finali.
In breve HTTP / 2 aggiunge 5 funzionalità chiave:
- Connessione singola e persistente
- multiplexing
- Compressione dell'intestazione
- Priorità delle risorse
- Protegge il livello di trasporto (valido solo per i browser)
Spiegare tutte queste funzionalità non rientra nell'ambito di questo tutorial, ma se si desidera approfondire questo argomento, posso raccomandare un estratto dal libro Networking Browser ad alte prestazioni - Estratto HTTP / 2 .
In questa guida installeremo l'ultima versione stabile di Nginx su Ubuntu 16.04 (Xenial), genereremo un certificato SSL autofirmato, abiliteremo il protocollo HTTP / 2 in Nginx e installeremo un browser basato su testo elinks
per agire come client HTTP.
Installa Nginx
Per installare l'ultima versione stabile di Nginx è necessario emettere alcuni comandi:
-
Dobbiamo scaricare la chiave PGP pubblica Nginx utilizzata per la firma di pacchetti e repository e aggiungerla nel keyring utilizzato dal gestore pacchetti per verificare l'autenticità dei pacchetti scaricati dal repository.
wget https://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
-
Elimina la chiave PGP dal file system:
rm nginx_signing.key
-
Aggiungi nuovo repository
printf "deb http://nginx.org/packages/ubuntu/ xenial nginx \ndeb-src http://nginx.org/packages/ubuntu/ xenial nginx \n" >> /etc/apt/sources.list.d/nginx.list
-
Aggiorna l'elenco dei pacchetti e installa Nginx:
apt update && apt install nginx -y
-
Per verificare la versione di Nginx possiamo usare quanto segue:
nginx -v
# nginx version: nginx/1.10.1
Se tutto va bene dovresti vedere un modello come 1.10.x
nell'output quando esegui il nginx -v
comando.
Certificato autofirmato e HTTP / 2
Sebbene le specifiche HTTP / 2 non impongano ai browser di implementare HTTP / 2 su TLS, tutti i principali browser hanno deciso di implementare solo HTTP / 2 su TLS, ma non qualsiasi versione TLS, solo TLS 1.2 o successive.
Creeremo certificati autofirmati per example.com
dominio fittizio , per la produzione è necessario un dominio valido e utilizzare CA di fiducia.
-
Genera chiave privata:
openssl genrsa -aes128 -out example.com.key 2048
Dopo aver eseguito questo comando dovrai inserire la passphrase 2 volte. Poiché le passphrase sono fastidiose, lo rimuoveremo.
-
Rimuovi passphrase dalla chiave privata:
openssl rsa -in example.com.key -out example.com.key
-
Genera richiesta di firma certificato (CSR):
openssl req -new -sha256 -key example.com.key -out cert-request.csr
Stiamo creando un certificato a dominio singolo, quindi dobbiamo impostare un campo con nome comune uguale al example.com
dominio
-
Crea certificato:
openssl x509 -req -days 365 -in cert-request.csr -signkey example.com.key -out example.com.crt
-
Ordina certificato e chiave privata:
mkdir -p /etc/ssl/testing/private && mkdir /etc/ssl/testing/certs
mv example.com.key /etc/ssl/testing/private && mv example.com.crt /etc/ssl/testing/certs
-
Crea directory host virtuali nginx
mkdir /etc/nginx/sites-available && mkdir /etc/nginx/sites-enabled
-
Quindi esegui nano /etc/nginx/nginx.conf
e trova una direttiva include /etc/nginx/conf.d/*.conf;
. Sotto questa direttiva aggiungi include /etc/nginx/sites-enabled/*;
Salva ( CTRL + O ) e poi esci ( CTRL + X ).
##
# Virtual Hosts
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
-
Crea un file chiamato example.com.conf
all'interno della /etc/nginx/sites-available
directory con questo comando nano /etc/nginx/sites-available/example.com.conf
e copia / incolla il seguente codice:
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
root /var/www/html;
index index.nginx-debian.html;
ssl_certificate /etc/ssl/testing/certs/example.com.crt;
ssl_certificate_key /etc/ssl/testing/private/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
}
Congratulazioni, ora hai un server Web abilitato HTTP / 2 . L'aggiunta di http2
parametri alla listen
direttiva all'interno dell'host virtuale HTTPS fornisce supporto HTTP / 2 .
-
Crea un collegamento simbolico per /etc/nginx/sites-available/example.com.conf
con questo comando:
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled
-
Testare la sintassi della configurazione
nginx -t
-
Riavvia Nginx per applicare le modifiche:
systemctl restart nginx
-
Aggiungi example.com
dominio al /etc/hosts
file
echo '127.0.0.1 example.com' >> /etc/hosts
Installa elinks
Per testare il tuo host virtuale abbiamo bisogno di un browser testuale - elink.
-
Per installare elinks usa il seguente comando:
apt install elinks
-
Per testare l' example.com
esecuzione dell'host virtuale:
elinks https://example.com
-
Per uscire dal browser elinks, premere q sulla tastiera, quindi Invio .
Test HTTP / 2
Per vedere quali protocolli server pubblicizza il modo più semplice è usare openssl
toolkit.
openssl s_client -connect example.com:443 -nextprotoneg ''
Nell'output di questo comando dovresti vedere qualcosa del genere:
CONNECTED(00000003)
Protocols advertised by server: h2, http/1.1
Per vedere HTTP / 2 in azione puoi usare gli strumenti per sviluppatori di browser. Il protocollo HTTP / 2 è indicato con h2
o con HTTP/2.0
identificatori. Apri il pannello di rete in dev-tools e aggiorna la tua pagina.
Conclusione
Ora dovresti essere consapevole di quanto "facile" sia abilitare HTTP / 2 nella configurazione di Nginx, ma questa non è l'intera parte del quadro generale. Per prima cosa dovresti pensare di abilitare TLS / SSL sul tuo server con suite di crittografia avanzate e assicurarti di non utilizzare le cifre nella lista nera . Solo dopo aver abilitato TLS / SSL forte sul tuo server, puoi iniziare a pensare di abilitare HTTP / 2 .