Brotli und Pagespeed Modul in nginx aktivieren

Can I use Brotli?

Brotli ist eine neue Kompression, die von Google entwickelt worden ist. Sie ist primär für die Kommunikation zwischen Webbrowser und Webserver gedacht ist. Die Browser Unterstützung ist mit Microsoft Edge, Google Chrome, Android, Opera und ab Herbst Apple Safari auf macOS und iOS recht hoch.

Für meinen privaten Server habe ich das nginx brotli Modul integriert und wird auf dieser Seite aktiv benutzt.

Leider funktioniert das verwenden von neuen nginx Modulen nicht ohne kompilieren. Das ist aktuell auch bei der brotli Unterstützung in Apache2 der Fall.

Der Vorteil gegenüber der gzip Kompression ist, das diese noch einmal 10-30% des Datenvolumens reduzieren kann. Wichtig ist, das brotli und gzip parallel laufen sollten.

brotli over gzip benefits

Basierend auf einen komplett neuen Ubuntu 16.04 (inklusive Plesk Onyx) Server4you Image, habe ich einen nginx mit brotli-support und google pagespeed kompiliert.

Wir befinden uns auf einer komplett neuen Ubuntu 16.04 LTS installation, daher aktualisieren wir das System als erstes.
apt-get update
apt-get upgrade

Wenn es sich bei den Server um eine Plesk installation handelt, dann sollte vorher nginx über das Plesk Panel installiert werden.

Vorbereitungen für die nginx-brotli Installation

Nun benötigen wir einige Ubuntu Softwarepakete um nginx kompilieren zu können.

apt-get install --no-install-recommends -qy \
gem \
ruby \
ruby-dev \
build-essential \
zlib1g-dev \
libpcre3 \
libpcre3-dev \
libssl-dev \
libcurl4-openssl-dev \
libxml-libxml-perl \
libxml2-dev \
libxml2-utils \
python-libxml2 \
libxslt1.1 \
libxslt1-dev \
python-libxslt1 \
libxml-filter-xslt-perl \
libxml-libxslt-perl \
libgd-dev \
libgd-perl \
libgd-text-perl \
python-gd \
libgoogle-perftools4 \
libgoogle-perftools-dev \
unzip \
tar \
gzip \
brotli \
make \
git \
wget

Herunterladen von nginx und brotli Quelltext

nginx herunterladen
Als nächstes suchen wir uns die gewünschte Version von der nginx.org Webseite aus. Plesk Onyx verwendet die Version 1.11.10. Ich habe mich jedoch für die aktuellste Version entschlossen.

cd /usr/local/src/
wget http://nginx.org/download/nginx-1.13.2.tar.gz
tar -xzf nginx-1.13.2.tar.gz
rm nginx-1.13.2.tar.gz

brotli nginx Module
Bei brotli laden wir uns mittels git, die neueste Version aus der Versionsverwaltung.

cd /usr/local/src/
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli/
git submodule update --init --recursive

Google Pagespeed nginx-Modul
Von Google laden wir uns die letzte stable Version herunter.

cd /usr/local/src/
wget https://github.com/pagespeed/ngx_pagespeed/archive/latest-stable.tar.gz
tar -xzf latest-stable.tar.gz
rm latest-stable.tar.gz
cd /usr/local/src/ngx_pagespeed-latest-stable
wget https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
tar -xzvf 1.12.34.2-x64.tar.gz
rm 1.12.34.2-x64.tar.gz

Passenger nginx-Modul
Dieses Modul wird von plesk u.a. für nodejs und ruby verwendet. Dies habe ich nur auf meinen Testserver kompiliert und verwende es nicht produktiv.
cd /usr/local/src/
mkdir -p /usr/local/src/passenger-gem
gem install --install-dir /usr/local/src/passenger-gem/ passenger --no-rdoc --no-ri

nginx mit brotli und pagespeed kompilieren

Aktuelle nginx Konfiguration ausgeben
Wir können uns bei nginx die vorherigen configure Optionen ansehen und alles was wir benötigen kopieren. Das –with-ipv6 ist in neueren Versionen Standard und sollte nicht mehr mitgegeben werden.

plesktest:~# nginx -V
nginx version: nginx/1.11.10
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/usr/share --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --modules-path=/usr/share/nginx/modules --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --user=nginx --group=nginx --with-ipv6 --with-file-aio --with-http_v2_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_dav_module --with-http_gzip_static_module --with-http_stub_status_module --add-dynamic-module=/usr/share/passenger/ngx_http_passenger_module

Configure – Vorbereitungen und Tests

Der nächste schritt ist das ./configure . Hier geben wir mit wie nginx kompiliert werden soll und was integriert werden soll. Ich habe meine Änderungen zu der obigen Ausgabe markiert. Die Option –with-ipv6 habe ich entfernt.

cd /usr/local/src/nginx-1.13.2/
./configure \
--prefix=/usr/share \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--modules-path=/usr/share/nginx/modules \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-scgi-temp-path=/var/lib/nginx/scgi \
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--add-module=/usr/local/src/ngx_pagespeed-latest-stable \
--add-module=/usr/local/src/ngx_brotli \
--add-dynamic-module=/usr/local/src/passenger-gem/gems/passenger-5.1.5/src/nginx_module

Kompilierung und Installation von nginx

Sofern das ./configure ohne Probleme durchlief, sollte das eigentlich kompilieren unproblematisch verlaufen.

make
service nginx stop

make install
nginx -t
service nginx restart

Der nginx-Server sollte nun wie gewohnt funktionieren.

Plesk – Anpassungen für nginx mit Brotli

Falls wir uns auf einen Plesk Server befinden, sollten wir das Plesk nginx Paket blockieren. Ansonsten wird dies bei einen nächsten Plesk update unser nginx überschreiben.

echo "sw-nginx hold" | dpkg --set-selections

Im Webinterface von Plesk können wir die nginx Einstellungen nun in der jeweiligen Domain aktivieren.

Analog zu den gzip-Einstellungen, können wir diese nun der Konfiguration unserer Domain hinzufügen.

PleskOnyx nginx enable brotli compression

brotli on;
brotli_static on;
brotli_types text/html text/plain text/css application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/vnd.microsoft.icon image/bmp image/svg+xml;
brotli_comp_level 8;

Analog kann hier auch Google PageSpeed aktiviert werden. Hier sollte jedoch vorsichtig mit den jeweiligen Optionen experimentiert werden. Je nach verwendeter Web-Anwendung, kann es zu Fehlern kommen oder die Webseite langsamer werden.

pagespeed on;
pagespeed LowercaseHtmlNames on;
pagespeed XHeaderValue "Powered By ngx_pagespeed";
pagespeed StaticAssetPrefix /static/;
pagespeed PreserveUrlRelativity on;
pagespeed EnableFilters combine_css, rewrite_css, move_css_above_scripts, combine_javascript, rewrite_javascript, lazyload_images, inline_preview_images, resize_mobile_images, inline_google_font_css;
pagespeed FileCachePath /var/ngx_pagespeed_cache;

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.