Hoe Nginx opzetten met HTTP/2-ondersteuning op Ubuntu 22.04

A previous version of this tutorial was written by Sergey Zhukaev.

Introductie

Nginx is een snelle en betrouwbare open-source webserver. Het heeft zijn populariteit te danken aan zijn lage geheugenverbruik, hoge schaalbaarheid, eenvoudige configuratie en ondersteuning voor een breed scala aan protocollen.

HTTP/2 is een nieuwere versie van het Hypertext Transport Protocol, dat op het web wordt gebruikt om pagina’s van de server naar de browser te verzenden. HTTP/2 is de eerste grote update van HTTP in bijna twee decennia: HTTP1.1 werd geïntroduceerd bij het publiek in 1999 toen webpagina’s veel kleiner waren in omvang. Het internet is sindsdien drastisch veranderd, en we worden nu geconfronteerd met de beperkingen van HTTP 1.1. Het protocol beperkt de potentiële overdrachtssnelheden voor de meeste moderne websites omdat het delen van een pagina in een wachtrij downloadt – het vorige deel moet volledig worden gedownload voordat de download van het volgende deel begint – en een gemiddelde moderne webpagina tientallen individuele CSS-, javascript- en afbeeldingsbestanden downloadt.

HTTP/2 lost dit probleem op omdat het een paar fundamentele veranderingen met zich meebrengt:

  • Alle verzoeken worden parallel gedownload, niet in een wachtrij
  • HTTP-headers worden gecomprimeerd
  • Pagina’s worden overgedragen als een binair bestand, niet als een tekstbestand, wat efficiënter is
  • Servers kunnen gegevens “pushen” zelfs zonder het verzoek van de gebruiker, wat de snelheid verbetert voor gebruikers met een hoge latentie.

Hoewel HTTP/2 geen versleuteling vereist, hebben ontwikkelaars van de twee meest populaire browsers, Google Chrome en Mozilla Firefox, verklaard dat ze HTTP/2 alleen zullen ondersteunen voor HTTPS-verbindingen om veiligheidsredenen. Daarom, als je besluit servers met HTTP/2-ondersteuning op te zetten, moet je ze ook beveiligen met HTTPS.

Deze handleiding zal je helpen bij het opzetten van een snelle en beveiligde Nginx-server met HTTP/2-ondersteuning.

Vereisten

Voordat je begint, heb je een paar dingen nodig:

Stap 1 — Het inschakelen van HTTP/2-ondersteuning

Als u de serverblokinstallatiestap in de Nginx-installatietutorial heeft gevolgd, zou u een serverblok voor uw domein moeten hebben op /etc/nginx/sites-available/uw_domein met de juiste instelling voor de server_name-richtlijn. De eerste wijziging die we zullen aanbrengen, is om het serverblok van uw domein te wijzigen om HTTP/2 te gebruiken.

Open het configuratiebestand voor uw domein met nano of uw voorkeurseditor:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

Zoek in het bestand de listen-variabelen die zijn gekoppeld aan poort 443:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

De eerste is voor IPv6-verbindingen. De tweede is voor alle IPv4-verbindingen. We zullen HTTP/2 inschakelen voor beide.

Wijzig elke listen-instructie om http2 op te nemen:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Dit vertelt Nginx om HTTP/2 te gebruiken met ondersteunde browsers.

Sla het configuratiebestand op en verlaat de teksteditor. Als je nano gebruikt, druk dan op Ctrl+X, vervolgens, wanneer gevraagd, Y en dan Enter.

Telkens wanneer je wijzigingen aanbrengt in Nginx-configuratiebestanden, moet je de configuratie controleren op fouten, met behulp van de -t-vlag, die de ingebouwde syntaxiscontroleopdracht van Nginx uitvoert:

  1. sudo nginx -t

Als de syntaxis foutloos is, ontvang je output zoals het volgende:

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Vervolgens configureer je je Nginx-server om een meer restrictieve lijst van ciphers te gebruiken om de beveiliging van je server te verbeteren.

Stap 2 — Verwijderen van oude en onveilige cipher suites

HTTP/2 heeft een blokkeerlijst van oude en onveilige ciphers die vermeden moeten worden. Cipher suites zijn cryptografische algoritmen die beschrijven hoe de overgedragen gegevens moeten worden versleuteld.

De methode die je gebruikt om de ciphers te definiëren, is afhankelijk van hoe je je TLS/SSL-certificaten voor Nginx hebt geconfigureerd.

Als je Certbot hebt gebruikt om je certificaten te verkrijgen, heeft het ook het bestand /etc/letsencrypt/options-ssl-nginx.conf aangemaakt dat ciphers bevat die niet veilig genoeg zijn voor HTTP/2. Het aanpassen van dit bestand zal echter voorkomen dat Certbot in de toekomst updates toepast, dus we vertellen Nginx gewoon om dit bestand niet te gebruiken en we zullen onze eigen lijst met ciphers specificeren.

Open het serverblok configuratiebestand voor je domein:

sudo nano /etc/nginx/sites-enabled/your_domain

Zoek de regel die het bestand options-ssl-nginx.conf inclusief en commentaar het uit door een # karakter aan het begin van de regel toe te voegen:

/etc/nginx/sites-enabled/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

Voeg onder die regel deze regel toe om de toegestane ciphers te definiëren:

/etc/nginx/sites-enabled/your_domain

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Sla het bestand op en sluit de editor af.

Als je zelfondertekende certificaten hebt gebruikt of een certificaat van een derde partij hebt gebruikt en het volgens de vereisten hebt geconfigureerd, open dan het bestand /etc/nginx/snippets/ssl-params.conf in je teksteditor:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Zoek de volgende regel:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Wijzig het om de volgende lijst met ciphers te gebruiken:

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Sla het bestand op en sluit je editor af.

Controleer opnieuw de configuratie op syntaxfouten met het commando nginx -t:

  1. sudo nginx -t

Als je fouten tegenkomt, los ze dan op en test opnieuw.

Zodra je configuratie de syntaxiscontrole doorstaat, herstart Nginx met behulp van het systemctl commando:

  1. sudo systemctl reload nginx.service

Nadat de server opnieuw is opgestart, laten we controleren of alles werkt.

Stap 3 — Controleren of HTTP/2 is ingeschakeld

Laten we ervoor zorgen dat de server draait en werkt met HTTP/2.

Gebruik het curl-commando om een verzoek naar je site te maken en de headers te bekijken:

  1. curl -I -L --http2 https://your_domain

Je ontvangt output zoals het volgende:

HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes

Je kunt ook controleren of HTTP/2 wordt gebruikt in Google Chrome. Open Chrome en ga naar https://je_domein. Open de Chrome-ontwikkelaarstools (Weergave -> Ontwikkelaar -> Ontwikkelaarstools) en vernieuw de pagina (Weergave -> Deze pagina opnieuw laden). Ga naar het Netwerk-tabblad, klik met de rechtermuisknop op de tabelkoprij die begint met Naam en selecteer de Protocol-optie uit het popupmenu.

Je hebt nu een nieuwe Protocol-kolom die h2 bevat (wat staat voor HTTP/2), wat aangeeft dat HTTP/2 werkt.

Op dit punt ben je klaar om inhoud te serveren via het HTTP/2-protocol. Laten we de beveiliging en prestaties verbeteren door HSTS in te schakelen.

Stap 4 — Het inschakelen van HTTP Strict Transport Security (HSTS)

Zelfs als uw HTTP-verzoeken worden omgeleid naar HTTPS, kunt u HTTP Strict Transport Security (HSTS) inschakelen om te voorkomen dat u die omleidingen moet doen. Als de browser een HSTS-header vindt, zal deze gedurende een bepaalde periode niet proberen verbinding te maken met de server via regulier HTTP. Ongeacht wat, zal het gegevens uitwisselen met alleen versleutelde HTTPS-verbinding. Deze header beschermt ons ook tegen protocol downgrade-aanvallen.

Open opnieuw het serverblokconfiguratiebestand voor uw domein:

sudo nano /etc/nginx/your_domain

Voeg deze regel toe aan hetzelfde blok van het bestand dat de SSL-cijfers bevat om HSTS in te schakelen:

/etc/nginx/your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

De max-age is ingesteld in seconden. De waarde 15768000 komt overeen met 6 maanden.

Standaard wordt deze header niet toegevoegd aan subdomeinverzoeken. Als u subdomeinen heeft en wilt dat HSTS op allemaal van toepassing is, moet u de variabele includeSubDomains toevoegen aan het einde van de regel, zoals deze:

/etc/nginx/your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Sla het bestand op en sluit de editor af.

Controleer nogmaals de configuratie op syntaxisfouten:

  1. sudo nginx -t

Herstart tot slot de Nginx-server om de wijzigingen toe te passen.

  1. sudo systemctl reload nginx.service

Conclusie

Je Nginx-server serveert nu HTTP/2-pagina’s. Als je de sterkte van je SSL-verbinding wilt testen, bezoek dan Qualys SSL Lab en voer een test uit tegen je server. Als alles correct geconfigureerd is, zou je een A+ beoordeling voor beveiliging moeten krijgen.

Om meer te weten te komen over hoe Nginx serverblokregels analyseert en implementeert, probeer dan Understanding Nginx Server and Location Block Selection Algorithms te lezen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04