HTTP2 pomocí Apache 2.4.17 na CentOS 7.x

Před několika měsíci jsem si řekl, že bych otestoval HTTP2. Dnes mne napadlo, že by se mohlo někomu hodit, když se podělím o zkušenosti.

Bohužel HTTP2 supportuje až Apache 2.4.17 a CentOS pro tuto verzi nemá binární rpm balíček. Protože jsem poměrně striktní v tom, že sw chci mít instalovaný z rpm balíčků, poněvadž člověk má pak lepší přehled o účelu jednotlivých souborů na fs, lépe se s nimi manipuluje při odinstalaci nebo upgrade a případně může využít kontrol integrity, které rpm nabízí, bude velká část návodu o buildu balíčků pro tento účel.
Proto tento návod (který má samozřejmě smysl zejména do doby, než CentOS bude obsahovat svůj balíček nativně) bude rozdělen do několika sekcí: příprava, build balíčků a jejich instalace a potom konfigurace.

Malá poznámka: nechtělo se mi vytvářet kompletní balíčky apache from scratch, protože chci dodržet určitou filosofii distribuce, kterou používám a proto jsem využil toho, že rawhide fedora, což je devel verze fedory, již Apache v požadované verzi má. Tudíž je potřeba (protože samotná instalace zde není dostačující) vzít z ní příslušné zdrojové balíčky, upravit je v pouze nejnutnější míře a vytvořit nové (čímž se zároveň člověk nepřipraví o případné patche, které jsou použity oproti variantě kompilace z tarballu vanilla zdrojáků).
Toto je samozřejmě spíše popis pro nadšence; ostatní si nejspíše počkají na oficiální build distribučních rpm. Stejně tak i proto, že je potřeba instalovat některé již hotové balíčky z fedory. Jakmile však budou k dispozici v CentOSu, tak je možné použít ty.

Poznámka pro rejpaly: ano, mohl bych nadefinovat další repozitář fedory rawhide pro yum a defaultně jej zakázat a řešit tak lépe updaty těchto konkrétních balíčků, ale v tomto případě to není tak nutné. To už je případně na vás.

Instalace prerequisit

Nejprve si nainstalujeme potřebné základní nástroje pro build balíčků, které v systému nejspíše v tuto chvíli nebudou: (příkazy provádíme jako root do odvolání)

yum install rpm-build cpp gcc

Spolu s nimi se nainstalují ještě další:

Installing for dependencies:
dwz elfutils gdb patch perl-Thread-Queue perl-srpm-macros redhat-rpm-config zip 
cpp libmpc mpfr glibc-devel glibc-headers

Potom budeme potřebovat ještě pár dalších balíčků potřebných pro kompilaci vlastního httpd:

yum install autoconf xmlto zlib-devel libselinux-devel lua-devel apr-devel apr-util-devel pcre-devel systemd-devel libnghttp2-devel openssl-devel libxml2-devel

a s nimi přicházejí:

Installing for dependencies:
 cyrus-sasl cyrus-sasl-devel docbook-dtds docbook-style-xsl expat-devel flex keyutils-libs-devel 
krb5-devel libcom_err-devel libdb-devel libnghttp2 libsepol-devel libverto-devel m4 
openldap-devel sgml-common xz-devel

Protože se nainstaloval balík apr-devel < 1.5, tak použijeme tentokrát přímo balík z fedory, což nám nijak nevadí:

rpm -Uvh http://ftp.fi.muni.cz/pub/linux/fedora/linux/development/rawhide/x86_64/os/Packages/a/apr-1.5.2-2.fc23.x86_64.rpm
rpm -Uvh http://ftp.fi.muni.cz/pub/linux/fedora/linux/development/rawhide/x86_64/os/Packages/a/apr-devel-1.5.2-2.fc23.x86_64.rpm

Dále budeme potřebovat novou verzi openssl:

rpm -Uvh http://ftp.fi.muni.cz/pub/linux/fedora/linux/releases/23/Everything/x86_64/os/Packages/o/openssl-1.0.2d-2.fc23.x86_64.rpm http://ftp.fi.muni.cz/pub/linux/fedora/linux/releases/23/Everything/x86_64/os/Packages/o/openssl-libs-1.0.2d-2.fc23.x86_64.rpm http://ftp.fi.muni.cz/pub/linux/fedora/linux/releases/23/Everything/x86_64/os/Packages/c/crypto-policies-20150518-3.gitffe885e.fc23.noarch.rpm http://ftp.fi.muni.cz/pub/linux/fedora/linux/releases/23/Everything/x86_64/os/Packages/o/openssl-devel-1.0.2d-2.fc23.x86_64.rpm

Stažení SRCRPM

Stáhneme a hned nainstalujeme src.rpm Apache z fedory:
(od této chvíle do odvolání provádíme vše jako neroot (běžný uživatel))

rpm -Uvh https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/source/SRPMS/h/httpd-2.4.17-4.fc24.src.rpm

Instalace tohoto balíku vytvoří v domovském adresáři uživatele, pod kterým jej instalujeme, adresář rpmbuild a v něm sadu dalších adresářů, které budou použity pro vytáření balíků, které nainstalujeme jako nový Apache.

Úprava .spec souboru

Spec soubor je umístěn v ~/rpmbuild/SPECS/httpd.spec a obsahuje informace potřebné k vytvoření cílových balíčků. Je potřeba jej upravit, neboť CentOS se přece jen od Fedory liší.
Zakomentujeme řádek Requires a vytvoříme nový:

#Requires: /etc/mime.types, system-logos-httpd
Requires: /etc/mime.types

(závislost na system-logos-httpd - balíku fedory - je nedůležitá a navíc je již prakticky uspokojena existujícím balíkem CentOSu, se kterým by balík fedory kolidoval)

Build

V tuto chvíli můžeme nechat vytvořit balíčky s novým Apachem:

cd ~/rpmbuild/SPECS
rpmbuild -ba httpd.spec

(toto je poslední činnost, kterou provádíme jako neroot uživatel a dále pokračujeme opět jako root nebo s příkazem sudo) Překlad ze zdrojových kódů a vlastní zabalení chvíli trvá.

Instalace

Vzniklé balíčky můžeme nainstalovat.
Nejprve zastavíme bežícího Apache:

systemctl stop httpd

a provedeme vlastní instalaci (user je jméno uživatele, pod kterým jsme balíky vytvářeli):

cd ~user/rpmbuild/RPMS/x86_64/
rpm -Uvh httpd-2.4.17-4.el7.centos.x86_64.rpm httpd-tools-2.4.17-4.el7.centos.x86_64.rpm mod_ssl-2.4.17-4.el7.centos.x86_64.rpm ../noarch/httpd-filesystem-2.4.17-4.el7.centos.noarch.rpm

a je nainstalováno.

Po instalaci je potřeba ještě před spuštěním httpd upravit konfiguraci. Upravíme jak konfiguraci pro ssl v souboru /etc/httpd/conf.d/ssl.conf: (uvádím pouze podstatné řádky)

SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost server.domain.cz:443>
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 +TLSv1.1 +TLSv1.2
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 +TLSv1.1 +TLSv1.2
SSLHonorCipherOrder on
SSLCompression off
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM
SSLCertificateFile /cesta/server.crt
SSLCertificateKeyFile /cesta/server.key
SSLCertificateChainFile /cesta/server-chain.pem
</VirtualHost>         

a samozřejmě můj oblíbený soubor /etc/httpd/conf.d/added.conf: (přidáme na začátek)

# Support for HTTP/2
<IfModule http2_module>
    LogLevel http2:info
</IfModule>
Protocols h2 http/1.1
Protocols h2c http/1.1
H2Direct on

v tomto souboru také smažeme řádku:

SSLStaplingResponseMaxAge 900

a zkontrolujeme, zda všechny soubory v /etc/httpd/conf.modules.d/ jsou aktuální.

Na závěr spustíme httpd:

systemctl start httpd

Určitě budeme chtít vědět, zda naše snažení mělo nějaký smysl. Proto použijeme browser a stránku, která umí otestovat HTTP2 support našeho webového serveru:

URL stránky je vidět pro rozklinutí obrázku. Případně: https://tools.keycdn.com/http2-test. Stejně tak můžeme provést kontrolu kvality TLS na stránkách Qualysu: https://www.ssllabs.com/ssltest/.

  • obsah/linux_obecne/centos_http2.txt
  • Last modified: 2018/10/18 22:15
  • by profors