Wel, ik wou al een tijd geleden overschakelen naar http/2. Maar dit kon niet, want al mijn webservers draaien op CentOS 7.
Waarom ik dit wou? De score in Google (of andere zoek indexen) is enorm belangrijk. Content is nog altijd King. Maar daarnaast is er wel de technologie. En daar kan ik wel mijn steentje in bijdragen.
Met http/2 is het verkeer tussen de webserver en de webbrowser, de gebruiker, efficiënter. De meeste browsers ondersteunen ook sinds eind 2015 dit protocol. Maar geen nood als je browser dit niet ondersteund, uiteraard heb ik ervoor gezorgd dat de website nog gewoon op http/1.1 kan verder blijven werken.
En terwijl ik dan toch de aanpassing heb gemaakt heb ik er gelijk voor gezorgd dat de website over een beveilgd kanaal wordt verstuurd. Het https protocol, of zoals sommigen het beter kennen: de websites met het groene icoontje.
Tot zover de chitchat. Hoe zit dit nu technich in elkaar?
Op zich is het niet zo moeilijk om http/2 te activeren
Installeer Nginx als proxy server, voor de apache webserver en maak gebruik van Let's Encrypt om de https certificaten te activeren.
Maar dan strand je op half werk. Want je site zal nog steeds via http/1.1 communiceren. Het zal werken met het SPDY protocol. Dit is al een verbetering, maar het kan beter.
Waarom is het nog niet volledig http/2? Wel op CentOS 7 zit je voorlopig vast op OpenSSL 1.0.1(e). OpenSSL zorgt voor de versleuteling van de communicatie. Alhoewel, een encryptie, eigenlijk niet hoeft, eisen de meeste clients (Firefox,[ Chrome, Safari, Opera, IE, Edge) dit wel.
Vandaar dat https zo belangrijk is.
Twee taken:
- OpenSSL op versie 1.0.2
- Nginx deze OpenSSL versie laten gebruiken
Install OpenSSL
We kunnen geen gebruik maken van yum, want de repositories van RedHat of CentOS blijven doelbewust op OpenSSL 1.0.1 (wegen compatibliteit met andere sofwares). Mijn Linux (bakjes) waar websites op staan doen alleen maar webhosting, dus hier is het geen probleem om die upgrade te doen. Maar als je onderstaande methode volgt ben je ook zekerder van werking, omdat de originele OpenSSL behouden blijft.
Vooraleer de installatie start haal ik nog enkele tools binnen, om de software te kunnen compileren
yum -y groupinstall 'Development Tools' yum -y install gcc gcc-c++ make zlib-devel pcre-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel google-perftools-devel
OpenSSL 1.0.2
OPENSSL="openssl-1.0.2k" cd /usr/local/src wget https://www.openssl.org/source/$OPENSSL.tar.gz tar -zxf $OPENSSL.tar.gz cd $OPENSSL ./config make make test make install /usr/local/ssl/bin/openssl version
Verander de variabele OPENSSL naar de meest recente versie
De laatste instructie laat zien welke versie er is geïnstalleerd.
Nginx op CentOS 7
We gaan Nginx compileren met de OpenSSL die we juist hebben geïnstalleerd (eigenlijk was het binnenhalen van de source al genoeg)
NGINX="1.10.3" cd /usr/local/src wget http://nginx.org/download/nginx-$NGINX.tar.gz tar xfz nginx-$NGINX.tar.gz cd nginx-$NGINX/ ./configure --with-openssl=/usr/local/src/$OPENSSL --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' make make install
Wederom, verander de NGINX variabele naar de meest recente 'stabiele'-versie. Je kan ook kiezen voor de 'mainline'-versie, maar in een productie-omgeving zou ik dit niet doen.
Let op de extra parameter bij de configure: --with-openssl=/usr/local/src/$OPENSSL
Deze zal ervoor zorgen dat Nginx wordt gecompileerd met de 1.0.2 versie ipv de standaard 1.0.1 die RedHat/CentOS ondersteund.
Resultaten
Needles to say.. je moet nginx herstarten en dan kan je zien dat je content zal aangeleverd worden via 'h2'.
Je kan de test doen via bv: https://tools.keycdn.com/http2-test
Of je kan in Chrome in developers mode, bij netwerk de colom met Protocol activeren.
Hiervoor doen we het uiteindelijk
Google hecht veel belang aan https en de TTFB tijd.
https is niet zo moeilijk om op te zetten, en dit zou je voor alle sites moeten doen. Maar de Time To First Byte (TTFB) is puur performance, en met http/2 is dit nu nog een stuk beter geworden.
Met deze waardes zit je echt wel goed!