MDXDave.de

Informatikstudent der TH Köln // Android + Coding

Laden...

nginx mit H2/ALPN auf Debian Jessie

veröffentlicht vor 10 Monaten, am 25. Dezember 2016  |  nginx    PHP      |  0 Kommentare

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.

1. Vorbereitung für nginx mit H2 und ALPN

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

2. OpenSSL-Version

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

3. nginx konfigurieren

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.

4. nginx kompilieren und installieren

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

5. Fertig

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: