Compiler et installer Nginx avec le module PageSpeed sous Debian 8

Ceux qui suivent un peu mon blog doivent savoir que j’ai déjà fait un article sur PageSpeed et Nginx, il y a quelques mois. Dans cet article, j’utilisais les sources des dépôts pour Debian afin d’arriver, au final, à un paquet .deb à installer.

Cette méthode est pratique puisque nginx est installé directement avec tout ce qu’il faut et est facilement désinstallable. Cependant, le désavantage principal c’est que c’est que du bidouillage pas super propre, et c’est très difficilement scriptable donc pas pratique à installer et mettre à jour.

Dans cet article, nous allons voir comment compiler et installer Nginx Mainline depuis les sources officielles de nginx.org, avec le module PageSpeed. En bonus, un script qui permet de la faire sans se fatiguer 🙂

Installation manuelle

Installation des dépendances

On commence par installer les paquets nécessaires à la compilation :

apt install build-essential ca-certificates zlib1g-dev libpcre3 libpcre3-dev tar unzip libssl-dev

On récupère le module et on le prépare. Tout d’abord on définit une variable avec la version, ce sera plus pratique. Vous pouvez soit regarder la version sur cette page et le faire manuellement :

NPS_VER=1.11.33.0

Soit on récupère la version depuis cette même page et on joue avec des commandes pour n’avoir que le numéro de version :

NPS_VER=$(curl -s https://developers.google.com/speed/pagespeed/module/build_ngx_pagespeed_from_source | grep NPS_VERSION= | cut -c13-22)

Ensuite, on télécharge et on extrait les différents fichiers :

cd /opt
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${NPS_VER}-beta.zip
unzip release-${NPS_VER}-beta.zip
rm release-${NPS_VER}-beta.zip
cd ngx_pagespeed-release-${NPS_VER}-beta
wget https://dl.google.com/dl/page-speed/psol/${NPS_VER}.tar.gz
tar -xzvf ${NPS_VER}.tar.gz
rm ${NPS_VER}.tar.gz

Le module est prêt ! On peut passer à Nginx.

Compilation et installation de Nginx

Comme précédemment, vous pouvez définir votre variable manuellement :

NGINX_VER=1.9.14

Ou via le site de Nginx :

NGINX_VER=$(curl -s http://nginx.org/en/CHANGES | awk 'NR==2' | awk '{print $4}')

Vous pouvez aussi utiliser la version stable :

NGINX_VER=1.8.1

Ensuite on télécharge le code source de Nginx :

cd /opt
wget -qO- http://nginx.org/download/nginx-${NGINX_VER}.tar.gz | tar zxf -

Puis on configure les paramètres et les modules. Il y a plein de combinaison de modules possible, voici celle que j’utilise. Faites ce que vous voulez avec 🙂

cd nginx-${NGINX_VER}
 ./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 \
 --user=nginx \
 --group=nginx \
 --without-http_ssi_module \
 --without-http_scgi_module \
 --without-http_uwsgi_module \
 --without-http_geo_module \
 --without-http_map_module \
 --without-http_split_clients_module \
 --without-http_memcached_module \
 --without-http_empty_gif_module \
 --without-http_browser_module \
 --with-threads \
 --with-file-aio \
 --with-http_ssl_module \
 --with-http_v2_module \
 --with-ipv6 \
 --with-http_mp4_module \
 --with-http_auth_request_module \
 --with-http_slice_module \
 --add-module=/opt/ngx_pagespeed-release-${NPS_VER}-beta

On voit qu’on a ajouté le chemin vers le module PageSpeed 🙂

Il ne nous reste plus qu’à compiler :

make -j $(nproc)

L’option -j $(nproc) permet de compiler en utilisant tous les coeurs disponibles sur le CPU, et ainsi accélérer la manoeuvre.

Et on installe :

make install

Voilà !

Il ne nous reste plus qu’à vérifier que le module est bien présent avec la commande nginx -V :

Compilier et installer Nginx avec le module PageSpeed sous Debian 8

Installation automatique grâce à nginx-autoinstall

Bon, maintenant, vous connaissez la marche à suivre et vous avez plus ou moins compris le fonctionnement. Même si cette méthode reste plus légère que celle que je vous avais présenté, il y a quand même quelques désavantages :

  • il faut le faire à la main
  • pas de script d’init pour Systemd
  • la conf de base marche pas…

C’est pour cela que j’ai créé un script qui permet de tout automatiser. Il vous permet d’installer plusieurs modules, dont PageSpeed.

Il est très pratique puisqu’il s’occupe d’absolument tout ! Lorsqu’une mise à jour d’un module ou de Nginx est dispo, il vous suffit de relancer le script. Lors de votre première installation, il s’occupera aussi de vous mettre une configuration fonctionnelle et un script Systemd. Ainsi, votre Nginx sera totalement fonctionnel.

On récupère le script :

wget --no-check-certificate https://bit.ly/nginx-autoinstall -O nginx-autoinstall.sh

On le rend exécutable :

chmod +x nginx-autoinstall.sh

Et on l’exécute !

./nginx-autoinstall.sh

Compilier et installer Nginx avec le module PageSpeed sous Debian 8

Je tiens à préciser que c’est un script perso et qu’il est possible qu’il ne convienne pas à tout le monde. Aussi, il ne fonctionne que sous Debian 8.

Configuration de PageSpeed

Maintenant que Nginx est installé avec PageSpeed, il va falloir le configurer. La doc du module l’explique très bien mais voici une base.

Activation

Dans votre nginx.conf (entre les balises http)

pagespeed off;
# Needs to exist and be writable by nginx.
# Use tmpfs for best performance.
pagespeed FileCachePath /var/ngx_pagespeed_cache;

On désactive PageSpeed de base, pour pouvoir l’activer dans un vhost précis. En ce qui concerne l’emplacement du cache, je vous conseille de lire mon article : Mettre le cache du module PageSpeed en RAM avec tmpfs.

Puis, rajouter ceci dans le vhost de votre choix (entre les balises server) :

pagespeed on;
# Don't show PageSpeed version in the header
pagespeed XHeaderValue "blablabla";
# Ensure requests for pagespeed optimized resources go to the pagespeed handler
# and no extraneous headers get set.
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
 add_header "" ""; }
location ~ "^/pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon$" { }

On active donc PageSpeed et on met les règles de bases. On modifie aussi la valeur du header pour éviter de montrer la version.

Les filtres

Actuellement PageSpeed ne fait rien. On va donc rajouter des filtres !

Pour ma part, j’utilise ceux-là (à rajouter dans le server block):

# Filters
pagespeed EnableCachePurge on;
pagespeed RewriteLevel PassThrough;
pagespeed EnableFilters remove_comments;
pagespeed EnableFilters collapse_whitespace;
pagespeed EnableFilters rewrite_images;
pagespeed EnableFilters rewrite_javascript;
pagespeed EnableFilters rewrite_css;

C’est ceux qui me paraissaient le plus pertinent. Il y en a plein d’autres, par exemple :

pagespeed EnableFilters move_css_above_scripts;
pagespeed EnableFilters insert_dns_prefetch;
pagespeed EnableFilters combine_javascript;
pagespeed EnableFilters defer_javascript;
pagespeed EnableFilters inline_javascript;
pagespeed EnableFilters outline_javascript;
pagespeed EnableFilters combine_css;
pagespeed EnableFilters inline_css;
pagespeed EnableFilters outline_css;
pagespeed EnableFilters inline_google_font_css;

À vous de les tester et de voir leur impact sur votre site. Tout est expliqué en détails concernant les filtres dans la doc.

Administration

L’administration permet de voir des statistiques et de gérer certaines choses, notamment la purge du cache.

Encore une fois, c’est expliqué dans la doc, mais elle n’est pas super claire donc voici :

Dans votre nginx.conf (entre les balises http)

 pagespeed StatisticsPath /ngx_pagespeed_statistics;
 pagespeed GlobalStatisticsPath /ngx_pagespeed_global_statistics;
 pagespeed MessagesPath /ngx_pagespeed_message;
 pagespeed ConsolePath /pagespeed_console;
 pagespeed AdminPath /pagespeed_admin;
 pagespeed GlobalAdminPath /pagespeed_global_admin;

Dans votre vhost :

# PageSpeed Admin
location /ngx_pagespeed_statistics { allow all; auth_basic "Denied"; auth_basic_user_file /srv/.htpasswd; }
location /ngx_pagespeed_global_statistics { allow all; auth_basic "Denied"; auth_basic_user_file /srv/.htpasswd; }
location /ngx_pagespeed_message { allow all; auth_basic "Denied"; auth_basic_user_file /srv/.htpasswd; }
location /pagespeed_console { allow all; auth_basic "Denied"; auth_basic_user_file /srv/.htpasswd; }
location ~ ^/pagespeed_admin { allow all; auth_basic "Denied"; auth_basic_user_file /srv/.htpasswd; }
location ~ ^/pagespeed_global_admin { allow all; auth_basic "Denied"; auth_basic_user_file /srv/.htpasswd; }

Ici, je bloque l’accès à l’admin avec un mot de passe, sinon c’est entrée libre. Il faudra donc générer un .htpasswd et modifier le chemin en conséquence. Vous pouvez utiliser cet outil.

PageSpeed c’est sympa, mais attention…

Vous êtes maintenant un pro du module PageSpeed. Mais faites attention, étant en beta, c’est un module assez instable, et d’une version à l’autre ça peut tout foutre en l’air. Utilisez le sur des petits sites, mais surtout pas sur de la grosse prod. Les filtres que vous utilisez peuvent aussi casser des choses (Piwik ne fonctionnera pas avec PageSpeed par exemple).

Petit exemple : hier je me prenais des erreurs 499 de Nginx dans l’admin WordPress. Après une demi-journée de recherche, j’ai finalement trouvé que ces erreurs donnaient parfois ERR_SPDY_PROTOCOL_ERROR dans le navigateur, et que c’était lié à ce bug… Du coup j’ai désactivé PageSpeed en attendant la prochaine version.

Pour résumer : PageSpeed c’est pratique pour optimiser un site web, mais :

  • L’optimisation ne se fait pas que à ce niveau
  • PageSpeed est instable et peut péter un truc d’une version à l’autre
  • Les filtres peuvent aussi causer des problèmes, donc vérifiez bien
  • PageSpeed fait consommer un peu plus de CPU à Nginx.

Ça reste un bon module, je l’utilise depuis plus d’un an ! Mais soyez sûr de bien le maîtriser pour éviter de tout casser 😉

Dernière modification le 27 octobre 2016.

Angristan

Stanislas - 17 ans - Lycéen passionné d'informatique, de technologie et de high-tech. Sysadmin junior, adepte des logiciels libres, de GNU/Linux et d'Android. Music addict.

Poster un Commentaire

13 Commentaires sur "Compiler et installer Nginx avec le module PageSpeed sous Debian 8"

avatar
Alan
Visiteur
Alan

Merci Angristan pour cet article et, plus généralement, pour ce blog enrichissant.
J’ai suivi les conseils concernant Https sur Nginx mais aujourd’hui je rencontre un souci avec le script « nginx-autoinstall » sous Debian 8, nginx ne redémarre pas :

nginx version: nginx/1.11.1
built by gcc 5.3.1 20160528 (Debian 5.3.1-21)
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled

nginx: [emerg] dlopen() « /etc/nginx/modules/ngx_http_auth_pam_module.so » failed (/etc/nginx/modules/ngx_http_auth_pam_module.so: cannot open shared object file: No such file or directory) in /etc/nginx/modules-enabled/50-mod-http-auth-pam.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed

A priori rien de bien grave, mais comment puis-je résoudre ce problème ?

Merci

Julien Doclot
Visiteur

Tu as testé le module de compression brotli?

Si oui, ça fonctionne bien?

Thomas
Visiteur
Thomas

Merci beaucoup pour l’article, très complet.
Une bonne alternative existe sous centos -> centminmod.com
Je l’ai découvert il y a peu de temps, et c’est un bon moyen pour mettre en place un stack LEMP rapidement. Après il faut se faire à Centos.

PPmarcel
Visiteur

Salut,

Si tu peux « te contenter » de la version stable (1.8.x), Guillaume Plessis package nginx-extras avec pagespeed justement, dans ses dépots dotdeb.

Il suit relativement bien les releases de nginx, ce qui offre une bonne alternative aussi

Novakin
Visiteur

Le probleme avec la version de dotdeb c’est qu’elle ne permet pas de mettre en place le protocole HTTP2 (NGinx 1.9.5 minimum)

Sinon je me suis débarrassé depuis PageSpeed depuis un moment. Si tu as une extensions de cache correcte et que tu montes son dossier en RAM les performances n’ont rien à envier à PageSpeed

wpDiscuz