Hogyan engedélyezzük a HTTP/2 protokoll használatát Apache rendszerű webszerverünkön

botond küldte be 2022. 12. 20., k – 02:50 időpontban

Tartalom

 

Bevezető

A HTTP/2 protokoll gyorsabb webkiszolgálást tesz lehetővé kevesebb adatforgalom mellett. A 2015-ben megalkotott protokoll ugyan már jó pár éve elterjedt, azonban a webkiszolgálók többségében alapértelmezetten nincs bekapcsolva kompatibilitási okok miatt. Többek között nem támogatja a már elavult mod_php Apache modult, ami viszont még sok régi weboldalt működtet, ezért ennek a bekapcsolása, engedélyezése a rendszergazdákra van bízva. Ebben a rövid leírásban megnézzük, hogyan engedélyezhetjük a HTTP/2 protokoll használatát olyan Apache rendszerű webkiszolgálókon, ahol még a régi, HTTP/1.1 protokoll működik.

 

 

Alapfeltételek

A HTTP/2 támogatás az Apache 2.4.17-es verziójában került be 2015 októberében, ami a Debian disztribúció esetében a Debian 9 (Stretch) változatban volt először elérhető az Apache 2.4.25-ös verziójában.

Ebben a leírásban elsősorban az ISPConfig-os szervereken történő beállítást nézzük át, mivel ezeken a szervereken már néhány alapfeltétel teljesül. A HTTP/2 protokoll esetén alapkövetelmény a HTTPS kapcsolat használata, ezért a HTTP/2 protokoll LAMP szervereken történő beállításhoz kell még egy köztes lépés, amiben beállítunk egy SSL tanúsítványt, ami ez lehet egy CA (Certificate Authority) által hitelesített példány vagy akár egy "házilag" legenerált (self-signed) tanúsítvány is. Az SSL beállítása nem része ennek a leírásnak, ezt egy külön útmutatóban tekintjük át (ha elkészül ez a leírás, ide fogom majd belinkelni). Azonban ha olyan LAMP szerverrel rendelkezünk, amelyen már be van állítva egy SSL tanúsítvány, akkor azzal is haladhatunk tovább.

Létezik még egy "köztes" h2c szabvány is, ami a HTTP/1.1 kapcsolaton keresztül épül fel HTTP/2-re és nem szükséges neki az SSL titkosítás, viszont ezt ritkán használják, mivel nem biztonságos, és nem is minden eszköz támogatja. Így ezzel itt nem foglalkozunk.

Az előzőeknek megfelelően tehát az alábbi szerverek szolgálhatnak alapjául ennek a leírásnak:

Ezt a leírást a Debian 11 (Bullseye) v1.0 változatán végzem el.

 

A HTTP/2 protokoll meglétének ellenőrzése

Mielőtt nekiállnánk bármilyen beállítgatásnak, első körben célszerű ellenőrizni, hogy valóban nincs-e már engedélyezve Apache webkiszolgálónkban a HTTP/2, mert előfordulhat, hogy egy újabb Operációs rendszer vagy ISPConfig telepítése során már aktiválásra került, aminek az idő előrehaladtával nő az esélye.

Az ellenőrzéshez nyissunk meg egy weboldalt, vagy bármilyen webes felületet, ami a szerveren fut. Én ehhez a Chrome böngészőt használom, valamint az ISPConfig és phpMyAdmin felületeket, mivel ezen a szerveren nincs egyéb weboldal.

Ha betöltődött a felület, akkor jobb egérgombbal kattintsunk bárhol az oldalon, amire előjön egy menü. Itt válasszuk a legalsó "Vizsgálat" menüpontot (más böngészőkben természetesen más helyeken lehet ez a menüpont). Ekkor a képernyő jobb széléhez, vagy az aljához (beállítástól függően) tapadva előjönnek a webfejlesztő eszközök. Itt van egy vízszintes menüsor, ezen kattintsunk a "Hálózat" menüre. Ekkor bejön egy üres oldal, ahol írja, hogy a Ctrl + R billentyűkkel végezzünk egy lapfrissítést, hogy gyűjthesse az újabb adatokat. Frissítsük tehát az oldalt, de ezt akár szimplán az F5 billentyűvel is kezdeményezhetjük. Ekkor az alábbihoz hasonló felületet láthatunk:

HTTP1.1 protokoll ellenőrzése

HTTP1.1 protokoll ellenőrzése

Ha még nem használtuk ezt a részt, akkor előfordulhat, hogy alapból nem jelenik meg a listában a "Protokoll" oszlop. Ehhez a fejléc során kattintsunk jobb egérgombbal és pipáljuk be a Protokoll hasábot, mire az megjelenik a listában.

A Protokoll hasáb mutatja nekünk, hogy milyen HTTP protokollal működik az adott webhely, amit éppen vizsgálunk. Itt láthatunk ilyeneket:

  • http/1.1: Ez a régi, HTTP/1.1-es protokoll. Ha a saját erőforrásaink (pl JS, CSS fájlok) mellett ilyet látunk, akkor szükséges ennek a leírásnak a végrehajtása
  • h2: Ez a HTTP/2 protokoll, ezt fogjuk engedélyezni, amennyiben még nem ilyeneket látunk itt.
  • h2c: A fentebb már említett h2c protokoll szabvány, ami nem követeli meg az SSL titkosítást, azonban használata ritka.
  • h3: HTTP/3 protokoll, ez még nagyon új szabvány (2022-es), egyelőre a Google, Facebook meg esetleg pár nagyobb cég használja őket (ezért az ezekről a helyekről betöltődő erőforrások ezzel a protokollal is betöltődhetnek), valamint a böngészők nagy része is támogatja már, ezért jelenhet meg ebben a mezőben, de itt most ezzel nem foglalkozunk.
  • chrome-extension: Chrome bővítmény, ez máshogy kerül betöltésre.
  • data: Szintén más módon (nem HTTP protokollokkal) betöltődő erőforrás, pl böngésző cache, stb.
  • stb...

Amennyiben tehát itt túlnyomó részt http/1.1 állapotokat látunk, akkor folytathatjuk a következő fejezettel.

A "túlnyomó részt" kifejezés alatt itt azt értem, hogy mivel egy weboldalon sok egyéb külső erőforrás is betöltődhet, ezért a más helyekről betöltött dolgok érkezhetnek más protokollokon keresztül is. Például egy másik szerverről betöltött CSS vagy JS fájl  vagy egyéb erőforrás is be tud töltődni a sajátunktól eltérő protokollal, tehát itt ha legörgetünk az aljára, akkor jó esély van rá, hogy vegyesen láthatunk többféle protokollt. Ezért itt a sorok között figyeljük a saját kiszolgálónkról betöltődött dolgokat. Pl. saját JS, CSS fájlok, képek, stb.

 

 

A HTTP/2 protokoll engedélyezése

Az Apache webkiszolgáló jelenleg háromféle MPM-et (Multi Processing Module) tartalmaz (prefork, worker, event), amelyek nem mindegyike támogatja a HTTP/2 protokollt. Ezért első körben ellenőrizzük, hogy éppen melyik MPM aktív a rendszerben. Ezt az alábbi paranccsal tehetjük meg:

apache2ctl -V | grep -i "mpm"

Prefork MPM ellenőrzése

Alapértelmezetten a "prefork" MPM az aktív, ami a három közül a legelavultabb, ebből következően nem támogatja a HTTP/2-t, mivel egyszerre csak egy szálon tud kéréseket fogadni és feldolgozni, míg a HTTP/2 protokollnak éppen ez az egyik nagy előnye, hogy egyszerre több szálon képes kapcsolódni, egyetlen azonosítási kereten (SSL handshake) belül.

Az MPM modul átváltásához ki kell kapcsolni más Apache modul(okat), valamint bekapcsolni másikakat,  és utána válthatunk át a leghatékonyabb MPM-re az event-re.

Először engedélyezzük magát a http2 Apache modult. Ez néhány Linux változatban már be lehet kapcsolva, de azért futtassuk a bekapcsolását. A továbbiakban root-ként haladjunk tovább.

A http2 modul bekapcsolásához tehát adjuk ki az alábbi parancsot.

a2enmod http2
Érdekességképpen, ha belenézünk a http2 Apache modul konfigurációs fájljának (/etc/apache/mods-available/http2.conf) elejébe, akkor az így kezdődik:
1
2
3
4
5
6
7
8
9
# mod_http2 doesn't work with mpm_prefork
<IfModule !mpm_prefork>
    Protocols h2 h2c http/1.1
 
    # # HTTP/2 push configuration
    #
    # H2Push          on
 
[...]

Itt két hasznos információt is magunkévá tehetünk:

  • Az egyik, hogy a http2 modul nem működik a prefork MPM modullal együtt (ezt le is írja, valamint a konfigurációs blokk feltételben is ki van kötve), tehát kizárják egymást.
  • A másik pedig a Protocols sor, amiben a konfiguráció meghatározza a protokollok prioritását. Ebben az esetben tehát az elsődleges prioritás a h2, azaz a HTTP/2 protokoll használata. Amennyiben a kliens program (webböngésző) nem támogatja azt, akkor a h2c, amennyiben ezt sem támogatja, akkor a "fallback" opció a hagyományos HTTP/1.1 szabvány használata. Ezt ugye minden támogatja, ami képes a webre csatlakozni.
    Ez a rész azért is fontos, mert az Apache webkiszolgálónknak ez az a pontja, ami meghatározza, hogy használatba is kerüljön a protokoll, ne csak telepítve legyen. Enélkül a kliensek saját házirendjei, beállításai szabják meg, hogy mit használnak. Így ha abban sincs prioritásra emelve a HTTP/2, akkor nem ezen fog megtörténni a kapcsolódás.

Ezután ha van modulként futó PHP példányunk, akkor azt is kapcsoljuk ki. Ezt a PHP verziójának megfelelő modulnévvel tehetjük meg. 7.4-es PHP esetén például:

a2dismod php7.4
Modulként akkor fut a PHP, ha a PHP telepítése során felraktuk a libapache2-mod-php7.4 csomagot (például a Debian 11 alapértelmezett 7.4-es PHP verziója esetén) és nem váltottunk át PHP-FPM-re. Ha viszont csak PHP-FPM csomagokat telepítettünk fel a különböző PHP verziókhoz, akkor természetesen ilyenkor nincs mit kikapcsolnunk.
De ha itt nem tudjuk melyik verziót kell kikapcsolnunk, akkor az apache2ctl -M paranccsal lekérdezhetjük a bekapcsolt modulok listáját, vagy tovább is léphetünk, mert a modulok be- és kikapcsolgatása során a rendszer úgy is jelzi, hogy ha valamilyen modul ütközik egy másikkal, és azt ki kellene kapcsolni.
A fentiek ismeretében tehát célszerű észben tartani, hogy a PHP modulként történő futtatása, valamint a HTTP/2 protokoll használata - ahogy már fentebb is esett róla szó - kizárják egymást. Így ha valamilyen kompatibilitási okok miatt szükségünk van a PHP Apache modulként történő futtatására, akkor ne hajtsuk végre ezt a leírást.
Természetesen ez nem egy visszafordíthatatlan művelet, hanem bármikor visszaállíthatjuk rendszerünket a korábbi állapotába.

A következő lépésben kapcsoljuk ki a prefork MPM modult:

a2dismod mpm_prefork

Majd kapcsoljuk be az event MPM modult:

a2enmod mpm_event

Ezután kapcsoljuk be a proxy_fcgi modult:

a2enmod proxy_fcgi

Ha már használunk PHP-FPM-et, akkor ez a modul már be van kapcsolva, mert ez ahhoz is kell. Tehát itt a szituációnktól függően már be lehet kapcsolva ez a modul.

Végül indítsuk újra az Apache-ot:

systemctl restart apache2

Egyben az egész tehát így néz ki:

HTTP/2.0 protokoll engedélyezése

Ezután ellenőrizhetjük újra az MPM modulunkat:

apache2ctl -V | grep -i "mpm"

Event MPM ellenőrzése

Itt már az event MPM modul az aktív.

 

 

A HTTP/2 protokoll ellenőrzése

Ha elvégeztük a beállításokat, akkor ismét ellenőrizzük weboldalainkat vagy egyéb webes felületeinket a már ismert módon:

HTTP/2.0 protokoll ellenőrzése

HTTP/2.0 protokoll ellenőrzése

Ha mindent jól csináltunk, akkor a Protokoll oszlopában a h2 jelzések jelennek meg.

Egy másik módja, hogy ellenőrizzük egy weboldal HTTP protokollját, a curl parancs használata:

curl -I --http2 -s <webcím> | grep HTTP

Ahol a kapcsolók az alábbiak:

  • -I: HEAD lekérést hajt végre, tehát a lekért weboldalnak csak a fejlécét kéri le.
  • --http2: HTTP/2 protokollt használjon
  • -s: Silent mód, nem rak ki mindenféle adatforgalmi statisztikákat.

A HTTP/2 protokoll ellenőrzése a curl parancs használatával

A parancs visszaadja a protokollt, és a kiszolgálótól kapott válaszkódot.

 

 

Konklúzió

A HTTP/2 protokoll modernebb, hatékonyabb és gyorsabb webkiszolgálást biztosít, mint elődje, ezért erre a szabványra érdemes átváltani, amennyiben rendszerünk megfelel a HTTP/2 követelményeinek. A beállítása nem bonyolult, és a használata során szerver és hálózati erőforrásokat spórolhatunk meg.