IT-Freelancer // Android + Coding
HTTP/2 ist eine Weiterentwicklung des originalen HTTP-Protokolls von 1999 (RFC). Obgleich der Standard eine Verschlüsselung nicht vorschreibt, ist die Implementation in den am meisten genutzten Browsern HTTP/2 über TLS only. HTTP/2 entstand aus dem von Google entwickelten Protokoll SPDY und konnte bis 31. Mai 2016 auch unter Google Chrome mit NPN (Next Protocol Negotiation) genutzt werden. Seitdem jedoch ausschließlich über ALPN. Die Nutzung des ALPN Protokolls setzt jedoch zwingend OpenSSL 1.0.2 voraus.
Wie im verlinkten Artikel schnell deutlich wird, gibt es derzeit abgesehen von Ubuntu 16.04 LTS keine Distribution die OpenSSL >= 1.0.2 als stabiles Package beinhaltet.
Um nginx unter Debian Jessie 8.x mit HTTP/2 und ALPN nutzen zu können, müssen wir nginx also selbst kompilieren.
Zunächst brauchen wir den OpenSSL- und nginx-Sourcecode. Diesen laden wir in den Ordner /usr/local/src:
cd /usr/local/src
git clone https://github.com/openssl/openssl.git
curl -L --progress "http://nginx.org/download/nginx-1.13.4.tar.gz" | tar xz
Anschließend wechseln wir in das openssl-Verzeichnis und schauen uns den letzten Release aus dem 1.0.2-Branch von OpenSSL bei GitHub an und checken den letzten Commit aus:
Zum Zeitpuntk des Beitags ist dies OpenSSL 1.0.2l:
cd openssl
git checkout b3a3bab
./config
Sofern ihr bereits eine stabile nginx-Version installiert habt, solltet ihr diese nun deinstallieren:
apt-get remove nginx
Nun wechseln wir in das Verzeichnis /usr/local/src/nginx-1.13.4 und konfigurieren nginx:
cd /usr/local/src/nginx-1.13.4
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-openssl=/usr/local/src/openssl --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --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_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module
Wichtig ist vor allem das SSL- und HTTP2-Modul. Die anderen Module könnt bzw. müsst ihr an die eigenen Bedürfnisse anpassen. Weitere Informationen dazu findet ihr in der nginx Dokumentation.
Nun kompilieren wir nginx mittels
sudo make
Nachdem nginx kompiliert wurde (kann einige Zeit dauern), installieren wir nginx nun und erstellen das cache-Verzeichnis (sofern nicht vorhanden):
sudo make install
sudo mkdir /var/cache/nginx && sudo chown nginx:root /var/cache/nginx
Nun solltet ihr mit folgendem Kommando die aktuelle nginx-Version prüfen und im Idealfall sollte dort Version 1.11.13 mit eurer Konfiguration angezeigt werden:
nginx -V
Ausgabe:
nginx version: nginx/1.13.4
built by gcc 4.9.2 (Debian 4.9.2-10)
built with OpenSSL 1.0.2l 25 May 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-openssl=/usr/local/src/openssl --user=www-data --group=www-data --with-http_ssl_module --with-http_realip_module --with-http_addition_module --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_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module
Nun können wir nginx wieder starten (wenn bereits konfiguriert):
service nginx start
Anschließend sollte beim Aufruf einer entsprechenden Website folgendes in den DevTools (F12) erscheinen:
Unter Webserver sollte weiterhin nginx 1.13.4 (alter Screenshot, daher 1.13.2) auftauchen: