Site web sur Raspberry Pi, partie 3 : optimisations (cache)

Bien! Maintenant que nous avons un site qui tourne, nous allons passer par la case optimisation afin de nous accomoder des limitations de notre système.
Je tiens à préciser que j’ai suivi quelques tutos, dont majoritairement celui-ci, qui est le plus complet.
Comme je suis toujours en phase découverte, je ne sais sincèrement pas dire à quel point cela affecte les performances, surtout que ce n’est pas pour le nombre de visiteurs que j’ai.
Cependant, j’ai testé sur ce même Raspberry Pi 3 SANS optimisations, et je saurai bientôt si ça change quelque chose. En tout cas, en avant! Sortez votre terminal, SSH sur le Pi, et go!

nginx.conf

Dans un premier temps, nous allons éditer nginx.conf :

sudo nano /etc/nginx/nginx.conf
  • Tout en haut, trouvez la ligne worker_processes 2;
    Si vous avez un Pi 3, remplacez par :
worker_processes 4;

Histoire d’en avoir 1 par coeur (4 dans le cas d’un Pi 3, donc).
Pour connaître le nombre de coeurs, tapez la commande :

lscpu

Dans le résultat affiché, CPU(s) vous indique le nombre de coeurs.

  • Localisez ensuite la ligne worker_connections 768; dans le bloc events{}, et remplacez par :
worker_connections 1024;

Là, c’est en partant de ce tuto que l’on a la limite que l’on cherche, via la commande :

ulimit -n
  • Ceci fait, toujours dans le bloc events{}, nous allons laisser multi_accept à off, mais nous allons rajouter la ligne :
accept_mutex on;

Ceci vient d’un commentaire dans le tuto du début de l’article (celui-ci) qui indique qu’utiliser multi_accept au lieu de mutex est un gâchis de triggers (donc de ressources CPU); nous allons donc utiliser ça.

  • Un peu plus bas, dans le bloc http{}, trouvez la ligne keepalive_requests et modifiez-la en :
keepalive_requests 600;

Cette ligne change le délai de stockage des connexion inactives. Je ne sais en toute franchise pas ce que cela change pour l’utilisateur moyen, mais j’ai une pensée émue pour mes sites de banque qui te délogguent au bout de 5 minutes… Cependant, si vous mettez très haut (comme les 100 000 dont il est question dans le tuto), vous encombrerez allègrement votre serveur… Pour pas grand-chose. Personnellement, j’ai choisi 600 secondes, donc 10 minutes, ça laisse le temps de lire. Et si ça coince, eh bah… Baissez à 60, voire 10 s!

  • Enfin, nous allons nous placer sous la ligne :
include /etc/nginx/sites-enabled/*;

Et copier/coller la ligne suivante :

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:10m max_size=1000m inactive=60m;

Ce que l’on vient de faire est crucial pour la suite, car nous venons de déclarer à Nginx qu’il peut utiliser une certaine zone comme cache.
Quoi c’est la cache?
Une zone où seront stockés les résultats de certaines requêtes, tant qu’à faire les plus utilisées. Sauf que pour le moment, elle n’existe pas, cette zone. Nous allons donc devoir la créer avec les bons attributs. Mais d’abord, sauvegardez et quittez nano, nous en avons terminé pour ce fichier.
Puis, entrez les commandes :

sudo mkdir /var/cache/nginx && sudo chmod 770 /var/cache/nginx && sudo chown www-data /var/cache/nginx

(vous avez bien compris qu’on a créé le dossier, qu’on lui a donné les bons accès puis refilé à www-data qui fait tourner nginx, rien de sorcier)
N’oubliez pas de faire un petit :

sudo service nginx reload

Pour vous assurer que, jusqu’ici, tout va bien.
Pas de message d’erreur? Alors on continue!

Descripteur de site

Vous vous souvenez de /etc/nginx/sites-available/site? Aussi appelé le descripteur? C’est lui qui va prendre le plus cher. Tellement en fait que je vais vous copier ça comme une brute car il y a BEAUCOUP de modifs.
C’est parti.

server {
# BASE
    listen 80;
    listen [::]:80; #gestion IP V6, optionnel
    server_name site; #peut servir mais pas pour nous ici
    index index.php index.html;
    root /var/www/html;
    access_log /var/www/blog/logs/access.log;
    error_log  /var/www/blog/logs/error.log;
# OPTIMISATIONS CACHE
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
# QUAND UTILISER LA CACHE
    set $cache_uri $request_uri;
    if ($request_method = POST) {
        set $cache_uri 'null cache';
    }
    if ($query_string != "") {
        set $cache_uri 'null cache';
    }
    # Exclure certaines URL (orienté WordPress)
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-..php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(index)?.xml|[a-z0-9-]+-sitemap([0-9]+)?.xml)") {
        set $cache_uri 'null cache';
    }
    # Pas de cache pour les utilisateurs authentifiés & comm récents
    if ($http_cookie ~ "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
    }
    include /etc/nginx/fcgiwrap.conf;
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
# BLOC PHP
    location ~ .php$ {
        set $skip_cache 1;
        if ($cache_uri != "null cache") {
            add_header X-Cache-Debug "$cache_uri $cookie_nocache $arg_nocache$arg_comment $http_pragma $http_authorization";
            set $skip_cache 0;
        }
        fastcgi_cache_bypass $skip_cache;
        fastcgi_cache microcache;
        fastcgi_cache_key $scheme$host$request_uri$request_method;
        fastcgi_cache_valid any 8m;
        fastcgi_cache_use_stale updating;
        fastcgi_cache_bypass $http_pragma;
        fastcgi_cache_use_stale updating error timeout invalid_header http_500;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        fastcgi_read_timeout 300;
    }
}


Fiouh!
Loin de moi l’idée de vous dire précisément ce que fait chaque ligne : en vous y attardant un peu dessus, vous comprendrez dans les grandes lignes, le reste, c’est surtout de la doc Nginx (que je n’ai pas lue, c’est aussi à ça que ça sert, les tutos 😉 ) et si l’envie vous prend de la consulter, alors Google est votre ami; moi, j’ai appliqué et vous ai retranscrit surtout ce tuto.

Leave a Reply

Your email address will not be published. Required fields are marked *