{"id":45,"date":"2020-01-03T17:29:07","date_gmt":"2020-01-03T16:29:07","guid":{"rendered":"http:\/\/192.168.0.10\/?p=45"},"modified":"2020-01-03T17:29:07","modified_gmt":"2020-01-03T16:29:07","slug":"site-web-sur-raspberry-pi-partie-3-optimisations-cache","status":"publish","type":"post","link":"https:\/\/blog.nibelheim.fr\/?p=45","title":{"rendered":"Site web sur Raspberry Pi, partie 3 : optimisations (cache)"},"content":{"rendered":"\n<p>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\u00e8me.<br \/>Je tiens \u00e0 pr\u00e9ciser que j&#8217;ai suivi quelques tutos, dont majoritairement <a href=\"https:\/\/seravo.fi\/2013\/optimizing-web-server-performance-with-nginx-and-php\">celui-ci<\/a>, qui est le plus complet.<br \/>Comme je suis toujours en phase d\u00e9couverte, je ne sais sinc\u00e8rement pas dire \u00e0 quel point cela affecte les performances, surtout que ce n&#8217;est pas pour le nombre de visiteurs que j&#8217;ai.<br \/>Cependant, j&#8217;ai test\u00e9 sur ce m\u00eame Raspberry Pi 3 SANS optimisations, et je saurai bient\u00f4t si \u00e7a change quelque chose. En tout cas, en avant! Sortez votre terminal, SSH sur le Pi, et go!<\/p>\n\n\n<h3 class=\"wp-block-heading\">nginx.conf<\/h3>\n\n\n<p>Dans un premier temps, nous allons \u00e9diter nginx.conf :<\/p>\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/nginx\/nginx.conf<\/pre>\n\n\n<ul class=\"wp-block-list\"><li>Tout en haut, trouvez la ligne <strong><em>worker_processes 2;<\/em><\/strong><br \/>Si vous avez un Pi 3, remplacez par :<\/li><\/ul>\n\n\n<pre class=\"wp-block-preformatted\">worker_processes 4;<\/pre>\n\n\n<p>Histoire d&#8217;en avoir 1 par coeur (4 dans le cas d&#8217;un Pi 3, donc).<br \/>Pour conna\u00eetre le nombre de coeurs, tapez la commande :<\/p>\n\n\n<pre class=\"wp-block-preformatted\">lscpu<\/pre>\n\n\n<p>Dans le r\u00e9sultat affich\u00e9, <strong>CPU(s)<\/strong> vous indique le nombre de coeurs.<\/p>\n\n\n<ul class=\"wp-block-list\"><li>Localisez ensuite la ligne <strong><em>worker_connections 768;<\/em><\/strong> dans le bloc events{}, et remplacez par :<\/li><\/ul>\n\n\n<pre class=\"wp-block-preformatted\">worker_connections 1024;<\/pre>\n\n\n<p>L\u00e0, c&#8217;est en partant de <a href=\"https:\/\/buzut.net\/optimiser-nginx\/#Les-workers\">ce tuto<\/a> que l&#8217;on a la limite que l&#8217;on cherche, via la commande :<\/p>\n\n\n<pre class=\"wp-block-preformatted\">ulimit -n<\/pre>\n\n\n<ul class=\"wp-block-list\"><li>Ceci fait, <strong>toujours dans le bloc events{}<\/strong>, nous allons laisser <strong><em>multi_accept<\/em><\/strong> \u00e0 <strong>off<\/strong>, mais nous allons rajouter la ligne :<\/li><\/ul>\n\n\n<pre class=\"wp-block-preformatted\">accept_mutex on;<\/pre>\n\n\n<p>Ceci vient d&#8217;un commentaire dans le tuto du d\u00e9but de l&#8217;article (<a href=\"https:\/\/seravo.fi\/2013\/optimizing-web-server-performance-with-nginx-and-php\">celui-ci<\/a>) qui indique qu&#8217;utiliser <em><strong>multi_accept <\/strong><\/em>au lieu de <strong><em>mutex <\/em><\/strong>est un g\u00e2chis de triggers (donc de ressources CPU); nous allons donc utiliser \u00e7a.<\/p>\n\n\n<ul class=\"wp-block-list\"><li>Un peu plus bas, dans le bloc http{}, trouvez la ligne <strong>keepalive_requests <\/strong>et modifiez-la en :<\/li><\/ul>\n\n\n<pre class=\"wp-block-preformatted\">keepalive_requests 600;<\/pre>\n\n\n<p>Cette ligne change le d\u00e9lai de stockage des connexion inactives. Je ne sais en toute franchise pas ce que cela change pour l&#8217;utilisateur moyen, mais j&#8217;ai une pens\u00e9e \u00e9mue pour mes sites de banque qui te d\u00e9logguent au bout de 5 minutes&#8230; Cependant, si vous mettez tr\u00e8s haut (comme les 100 000 dont il est question dans le tuto), vous encombrerez all\u00e8grement votre serveur&#8230; Pour pas grand-chose. Personnellement, j&#8217;ai choisi 600 secondes, donc 10 minutes, \u00e7a laisse le temps de lire. Et si \u00e7a coince, eh bah&#8230; Baissez \u00e0 60, voire 10 s!<\/p>\n\n\n<ul class=\"wp-block-list\"><li>Enfin, nous allons nous placer sous la ligne :<\/li><\/ul>\n\n\n<pre class=\"wp-block-preformatted\">include \/etc\/nginx\/sites-enabled\/*;<\/pre>\n\n\n<p>Et copier\/coller la ligne suivante :<\/p>\n\n\n<pre class=\"wp-block-preformatted\">fastcgi_cache_path \/var\/cache\/nginx levels=1:2 keys_zone=microcache:10m max_size=1000m inactive=60m;<\/pre>\n\n\n<p>Ce que l&#8217;on vient de faire est crucial pour la suite, car nous venons de d\u00e9clarer \u00e0 Nginx qu&#8217;il peut utiliser une certaine zone comme cache.<br \/>Quoi c&#8217;est la cache?<br \/>Une zone o\u00f9 seront stock\u00e9s les r\u00e9sultats de certaines requ\u00eates, tant qu&#8217;\u00e0 faire les plus utilis\u00e9es. Sauf que pour le moment, elle n&#8217;existe pas, cette zone. Nous allons donc devoir la cr\u00e9er avec les bons attributs. Mais d&#8217;abord, sauvegardez et quittez nano, nous en avons termin\u00e9 pour ce fichier.<br \/>Puis, entrez les commandes :<\/p>\n\n\n<pre class=\"wp-block-preformatted\">sudo mkdir \/var\/cache\/nginx &amp;&amp; sudo chmod 770 \/var\/cache\/nginx &amp;&amp; sudo chown www-data \/var\/cache\/nginx<\/pre>\n\n\n<p><em>(vous avez bien compris qu&#8217;on a cr\u00e9\u00e9 le dossier, qu&#8217;on lui a donn\u00e9 les bons acc\u00e8s puis refil\u00e9 \u00e0 www-data qui fait tourner nginx, rien de sorcier)<\/em><br \/>N&#8217;oubliez pas de faire un petit :<\/p>\n\n\n<pre class=\"wp-block-preformatted\">sudo service nginx reload<\/pre>\n\n\n<p>Pour vous assurer que, jusqu&#8217;ici, tout va bien.<br \/>Pas de message d&#8217;erreur? Alors on continue!<\/p>\n\n\n<h3 class=\"wp-block-heading\">Descripteur de site<\/h3>\n\n\n<p>Vous vous souvenez de <strong>\/etc\/nginx\/sites-available\/site<\/strong>? Aussi appel\u00e9 le descripteur? C&#8217;est lui qui va prendre le plus cher. Tellement en fait que je vais vous copier \u00e7a comme une brute car il y a BEAUCOUP de modifs.<br \/>C&#8217;est parti.<\/p>\n\n\n<pre class=\"wp-block-preformatted\">server {\n# BASE\n    listen 80;\n    listen [::]:80; #gestion IP V6, optionnel\n    server_name site; #peut servir mais pas pour nous ici\n    index index.php index.html;\n    root \/var\/www\/html;\n    access_log \/var\/www\/blog\/logs\/access.log;\n    error_log  \/var\/www\/blog\/logs\/error.log;\n# OPTIMISATIONS CACHE\n    open_file_cache max=1000 inactive=20s;\n    open_file_cache_valid 30s;\n    open_file_cache_min_uses 2;\n    open_file_cache_errors on;\n# QUAND UTILISER LA CACHE\n    set $cache_uri $request_uri;\n    if ($request_method = POST) {\n        set $cache_uri 'null cache';\n    }\n    if ($query_string != \"\") {\n        set $cache_uri 'null cache';\n    }\n    # Exclure certaines URL (orient\u00e9 WordPress)\n    if ($request_uri ~* \"(\/wp-admin\/|\/xmlrpc.php|\/wp-(app|cron|login|register|mail).php|wp-.<em>.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)\") {\n        set $cache_uri 'null cache';\n    }\n    # Pas de cache pour les utilisateurs authentifi\u00e9s &amp; comm r\u00e9cents\n    if ($http_cookie ~<\/em> \"comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in\") {\n        set $cache_uri 'null cache';\n    }\n    include \/etc\/nginx\/fcgiwrap.conf;\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n    }\n# BLOC PHP\n    location ~ .php$ {\n        set $skip_cache 1;\n        if ($cache_uri != \"null cache\") {\n            add_header X-Cache-Debug \"$cache_uri $cookie_nocache $arg_nocache$arg_comment $http_pragma $http_authorization\";\n            set $skip_cache 0;\n        }\n        fastcgi_cache_bypass $skip_cache;\n        fastcgi_cache microcache;\n        fastcgi_cache_key $scheme$host$request_uri$request_method;\n        fastcgi_cache_valid any 8m;\n        fastcgi_cache_use_stale updating;\n        fastcgi_cache_bypass $http_pragma;\n        fastcgi_cache_use_stale updating error timeout invalid_header http_500;\n        fastcgi_pass unix:\/var\/run\/php\/php7.0-fpm.sock;\n        fastcgi_split_path_info ^(.+.php)(\/.+)$;\n        fastcgi_index index.php;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $document_root\/$fastcgi_script_name;\n        fastcgi_read_timeout 300;\n    }\n}<\/pre>\n\n\n<p><br \/>Fiouh!<br \/>Loin de moi l&#8217;id\u00e9e de vous dire pr\u00e9cis\u00e9ment ce que fait chaque ligne : en vous y attardant un peu dessus, vous comprendrez dans les grandes lignes, le reste, c&#8217;est surtout de la doc Nginx <em>(que je n&#8217;ai pas lue, c&#8217;est aussi \u00e0 \u00e7a que \u00e7a sert, les tutos \ud83d\ude09 )<\/em> et si l&#8217;envie vous prend de la consulter, alors Google est votre ami; moi, j&#8217;ai appliqu\u00e9 et vous ai retranscrit surtout ce tuto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u00e8me.Je tiens \u00e0 pr\u00e9ciser que j&#8217;ai suivi quelques tutos, dont majoritairement celui-ci, qui est le plus complet.Comme je suis toujours en phase d\u00e9couverte, je ne sais [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[22],"class_list":["post-45","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi","tag-nginx"],"_links":{"self":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/45","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=45"}],"version-history":[{"count":0,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/45\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=45"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=45"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=45"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}