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. Allez donc voir sur cette page quelle est la dernière version, puis :
NPS_VER=1.12.34.2
Ensuite, on télécharge et on extrait les différents fichiers :
cd /opt wget https://github.com/pagespeed/ngx_pagespeed/archive/v${NPS_VER}-beta.zip unzip v${NPS_VER}-beta.zip rm v${NPS_VER}-beta.zip cd ngx_pagespeed-${NPS_VER}-beta psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz [ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL) wget ${psol_url} tar -xzvf $(basename ${psol_url}) rm ${NPS_VER}-x64.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 (version à vérifier) :
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 (version à vérifier) :
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
:
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
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 17 décembre 2017.
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
Merci !
Alors cette erreur est due au fait que tu avais surement un ancienne version de nginx installée. Les dossiers
/etc/nginx/modules-enabled/
et/etc/nginx/modules-available/
ne sont plus utiles/utilisées, tu peux donc les supprimer et éventuellement modifier tonnginx.conf
pour les enlever aussi 🙂Un grand merci pour ce script d’installation qui marche du feu de dieu !!
Ayant peu d’expérience sur nginx, j’ai pour ma part recréé les dossiers /etc/nginx/modules-enabled/ et /etc/nginx/modules-available/ pour définir mes VirtualHosts. Y’a t-il une autre façon de procéder car à te lire ils ne sont plus utilisés ? Merci pour le retour
Merci !
Je parlais des modules, pas des vhost.
Pour tes vhosts tu peux créer
/etc/nginx/sites-available
et/etc/nginx/sites-enabled
, et faire des liens symobliques entre les 2, et rajouter include/etc/nginx/sites-enabled/*;
dans/etc/nginx.conf
Tu as testé le module de compression brotli?
Si oui, ça fonctionne bien?
Oui 🙂
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.
J’étais déjà tombé dessus, c’est vrai que c’est sympa d’avoir un script pour tout installer. Je vais jeter un coup d’œil, merci 🙂
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
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
Yep.
Pas besoin de monter son dossier de cache en RAM, avec du bon SSD RAID 10 (cc VPSz) c’est top. Mais là c’est pas le même niveau d’optimisation.
Meme chez VPSz monter le dossier de cache en RAM augmente les perfs. Quelques millisecondes, négligeable mais intéressant quand meme 🙂
Ah sympa je savais pas ^^ Sinon, ce tuto fonctionne tout aussi bien avec Nginx 1.8 ! C’est juste que je trouve ça plus propre de compiler soi même en choisissant ses modules.