Comment faire un audit technique de site web? Ma méthode efficace

Vous avez tout compris, il est important de faire un audit SEO technique de votre site web. L’aspect technique est désormais une partie importante du SEO, il ne faut surtout pas le bâcler! Pour qu’un site soit bien classé, il faut qu’un site soit performant! Pour faire une analyse de la performance d’un site web, vous pouvez aussi utiliser mes outils SEO indispensables et gratuits.

L’audit SEO technique couvre 2 principaux points:

  • Optimiser le temps de crawl de Google
  • PERFORMANCE

Pour être bien classé, il faut que Google soit content. Google est content quand il est flatté. Suivez donc toutes les recommandations de Google, à la lettre.

Le SEO Technique est technique. Par conséquent, il n’est pas forcément à la portée de tous. Il faudra certainement aller modifier la configuration de votre serveur.

Optimiser son temps de crawl: liens morts, sitemap et robots.txt

C’est quoi le temps de crawl? Chaque jour, Google va passer quelques secondes à scanner votre site. Plus votre site est populaire, plus Google passera de temps chez vous. Chaque seconde est alors précieuse. C’est d’autant plus important lorsque vous êtes mal classé ou lorsque vous débutez: votre budget crawl est très faible.

Par exemple, sur un petit site, j’ai des statistiques de crawl à 16 pages/jour et 243Ko téléchargés. Sur un autre site, plus important, j’obtiens alors 358 pages/jour et 12Mo téléchargés. Vous pouvez aussi consulter vos statistiques de crawl dans la Google Search Console.

L’objectif ici, c’est de rentabiliser au maximum le temps crawl, c’est-à-dire diriger Google vers les pages les plus importantes et le détourner de pages inutiles ou chronophage comme, par exemple, les pages Mentions légales, ou les résultats de pages de recherche.

Ces 3 points sont la base d’un audit SEO technique d’un site web. Ils sont très simples à faire alors ne les négligez pas!

Vérifier les liens morts

Si votre site contient des liens morts, c’est un problème. Pensez toujours au visiteur en premier. Un visiteur qui constate un lien mort pense que votre site n’est pas à jour et s’en va. Un visiteur qui s’en va rapidement, c’est une dégradation de votre classement. Pour le temps de crawl, inutile de cramer du budget sur des liens morts.

Pour analyser les liens morts gratuitement, on va utiliser le logiciel linkchecker sur Linux. Vous pouvez l’utiliser sur votre serveur directement.

Pour installer linkchecker sur Ubuntu 18.04:

sudo apt install linkchecker

Pour analyser un site:

ubuntu@flogg.fr:~$ linkchecker https://flogg.fr --check-extern
 Statistics:
 Downloaded: 6.02MB.
 Content types: 75 image, 4448 text, 0 video, 0 audio, 4061 application, 4 mail and 739 other.
 URL lengths: min=13, max=1772, avg=57.
 
 That's it. 9327 links in 402 URLs checked. 0 warnings found. 0 errors found.

Recommandation: Analysez votre site et corrigez tous les liens cassés.

Le fichier robots.txt

Le fichier robots.txt, placé à la racine du domaine, donne des indications aux bots pour analyser le site. Ces indications sont très basiques, ça se limite à autoriser ou non l’accès à une page. Toutefois, Google s’autorise à indexer cette page si des liens pointent vers celle-ci. Plus d’informations sur le fichier robots.txt sur l’aide de Google Search Console.

Vous pouvez consulter celui de n’importe quel site. Par exemple, vous pouvez consulter le mien: https://flogg.fr/robots.txt.

Recommandation: Vérifiez qu’aucune page n’est bloquée inutilement, et que les pages superflues sont bloquées.

Le fichier sitemap.xml

Le fichier sitemap.xml, c’est un peu l’annuaire du site. Il indique aux bots la liste des pages du site, ainsi que leurs dates de mise à jour. On peut aussi le découper en plusieurs fichiers. Ce fichier est souvent généré automatiquement, avec YoastSEO pour WordPress, Drupal XML Sitemap pour Drupal, etc.

Google sait analyser votre site, ainsi le sitemap est la plupart du temps superflu. Il peut servir par exemple pour indiquer une page lointaine de votre site. Mais si une page est mal référencée au sein même de votre site, elle le sera également sur Google. (Plus d’informations sur le sitemap sur l’aide de Google Search Console)

Néanmoins, ça fait partie des basiques à ne pas négliger. C’est simple à mettre en place, alors utilisez-le! Vous pouvez également indiquer la présence de votre sitemap dans Google Search Console pour lui demander de venir vous indexer.

Recommandation: Utilisez un plugin qui le génère automatiquement.

La performance d’un site web lors d’un audit technique

Lors d’un audit SEO technique, l’essentiel des éléments doit être axé sur la performance du site web. Un site non performant sera mal référencé.

Lors d’un audit SEO Technique, plusieurs points sont abordés:

  • Les versions logiciels
  • La configuration HTTPS (+ HTTP/2 +OCSP stapling)
  • IPV6
  • La Compression GZIP / Brotli
  • Cache
  • Les images

Pour analyse la performance d’un site web avec un outil gratuit, vous pouvez consulter ma liste des outils SEO indispensables.

Analyse performance site web
Ma page est assez bien optimisée

Analyse des logiciels

Pour héberger un site WordPress, Drupal ou Symfony, vous aurez besoin au minimum d’un serveur web et de PHP.

Pour le serveur Web, il y en a 3 connus: Apache2, Nginx, et IIS. Sauf besoin particulier, il faut utiliser Nginx qui est le plus rapide.

Pour PHP, il faut utiliser si possible la dernière version. En tout cas, il est nécessaire d’utiliser au moins PHP 7+ qui est beaucoup plus rapide que les anciennes versions 5.4.

Vous pourrez trouvez des informations directement sur le serveur ou parfois en utilisant curl, dans l’entête HTTP:

Recommandation: Utilisez Nginx et la dernière version de PHP.

➜  ~ curl --head -H "Accept-Encoding: gzip" https://flogg.fr

 server: nginx
 x-powered-by: PHP/7.3.11

Optimiser la configuration HTTPS

Utiliser le HTTPS

Il est nécessaire d’utiliser le protocole HTTPS. Si votre site n’est pas encore sécurisé (HTTP), migrez alors vers HTTPS le plus rapidement possible. Google le recommande, alors faites-le! 🙂

Pour passer au HTTPS, il faut modifier la configuration de Nginx. Ensuite, il faut paramétrer une redirection de toutes les pages vers leurs versions sécurisées. Là aussi, ça se passe dans la configuration Nginx. Pour vérifier si ça fonctionne, tester une page non sécurisée:

➜  ~ curl --head http://flogg.fr 
 HTTP/1.1 301 Moved Permanently

Recommandation: Utilisez le HTTPS

Utiliser le protocole HTTP/2

Au-delà de l’aspect sécurisé, le HTTPS permet aussi d’activer le protocole HTTP/2 qui permet d’accélérer la communication entre le serveur et les visiteurs. Ça ne coûte rien mais il faut là aussi modifier la configuration Nginx. Pour vérifier si votre site utilise HTTP/2, utilisez curl.

➜  ~ curl --head https://flogg.fr
 HTTP/2 200

Recommandation: Utilisez le HTTP/2

Utiliser l’OCSP Stapling

La sécurisation de la connexion par HTTPS apporte toutefois quelques lenteurs, pour vérifier la légitimité du site notamment. On peut limiter cet impact en utilisant la technique de l’OCSP Stapling. Pour vérifier si c’est le cas:

➜  ~ openssl s_client -connect flogg.fr:443 -tls1  -tlsextdebug  -status

Dans la réponse, vous devriez trouver une section:

OCSP response: 
 ======================================
 OCSP Response Data:
     OCSP Response Status: successful (0x0)
     Response Type: Basic OCSP Response
     Version: 1 (0x0)
     Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
     Produced At: Nov 10 08:37:00 2019 GMT
     Responses:
     Certificate ID:
       Hash Algorithm: sha1
       Issuer Name Hash: 7EE66AE7729AB3FCF8A220646C16A12D6071085D
       Issuer Key Hash: A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1
       Serial Number: 042D1E82A6FBF81510DD0C5D8BAAAF8BDE2F
     Cert Status: good
     This Update: Nov 10 08:00:00 2019 GMT
     Next Update: Nov 17 08:00:00 2019 GMT
 

     Signature Algorithm: sha256WithRSAEncryption
          69:de:97:b6:bb:58:2e:c9:ec:43:bd:ca:9c:1e:97:08:1d:13:
          5f:1b:91:a9:fa:79:5f:2c:b4:d1:47:06:a9:ef:ca:21:c6:07:
          40:88:53:e8:5e:6b:41:64:92:8e:de:21:7c:c8:ac:c9:b7:20:
          1b:ab:76:eb:bb:e7:bc:5f:72:fe:cc:6f:78:4f:af:21:b1:60:
          ee:1c:11:84:c5:0d:a7:b1:7c:f3:26:9d:6c:10:f8:5b:ba:47:
          f3:31:dc:31:68:9f:d7:bc:fd:f0:48:7e:05:c5:0b:24:15:84:
          7b:39:8d:a7:91:56:64:72:6b:d4:3c:cb:88:fe:8e:ab:c5:40:
          8c:46:fe:b9:4e:cc:22:6a:00:ce:e1:8e:02:cf:98:5f:82:e1:
          2a:00:55:84:4b:16:3d:51:d9:83:8d:0c:2f:57:e0:94:9f:b7:
          68:99:75:c2:31:97:86:b7:ad:b7:be:f9:8d:cd:89:a7:0c:40:
          1c:e0:e7:41:da:8d:98:0b:7f:b8:5a:82:ca:d4:69:f6:b3:ea:
          86:4c:fe:7b:92:9f:fc:42:64:61:9f:28:b4:1b:e3:63:a2:74:
          e1:cb:46:b0:06:b9:85:b5:7a:30:5d:35:12:e9:b2:c1:b0:34:
          1d:b3:fd:e4:0b:ef:64:27:de:31:d7:70:2a:1d:cd:08:7c:ca:
          e0:5a:b2:ab
 ======================================

Je vous avais prévenu, un audit technique, c’est technique!

Vérifiez la qualité de la connexion SSL

Toutes les connexions HTTPS ne se valent pas malheureusement. Certaines configurations sont « à trous », c’est-à-dire qu’il y a des failles connues. Configurez donc le HTTPS sur votre serveur Web en tenant compte des meilleures pratiques actuelles.

Pour tester la qualité de la connexion SSL, le service en ligne de référence est SSLLabs. Vous devez alors obtenir une note au moins égal à A+.

Recommandation: Utilisez l’OCSP Stapling et obtenez une note d’au moins A+ au test SSLLabs.

Compatibilité IPv6 & audit technique

En 2019, il est nécessaire qu’un site web soit compatible avec IPV6. Pour vérifier que votre site est accessible en IPV6, vous pouvez le voir dans le test de SSL Labs. Par exemple, pour mon site, c’est la ligne indiquant le test sur l’adresse 2a05:d012:adb:cc32:233:5a3b:d05a:663d.

La compatibilité IPv6 se passe au niveau du serveur DNS et du serveur Web.

Pour tester la configuration du DNS pour IPv6, utilisez dig:

➜  ~ dig flogg.fr AAAA

;; ANSWER SECTION:
 flogg.fr. 300 IN AAAA 2a05:d012:adb:cc32:233:5a3b:d05a:663d

Pour tester la configuration du serveur pour IPv6, vous pouvez utiliser un service en ligne, par exemple ipv6-test.com.

Recommandation: Prenez en charge l’IPv6.

La compression GZIP / Brotli

Toujours pour améliorer le transfert d’informations, il est utile de compresser les informations transmises entre le serveur et le visiteur.

Pour tester la compression GZIP d’un site, on utilise curl:

➜  ~ curl --head -H "Accept-Encoding: gzip" https://flogg.fr
 
content-encoding: gzip
Audit technique SEO avec Curl
HTTP2, Compression GZIP et page en cache

La compression Brotli est un autre type de compression, plus rapide. C’est certainement l’avenir, mais il reste encore des navigateurs qui ne le supporte pas. Nginx ne l’intègre pas encore en standard, il faut donc le compiler spécialement avec cette option. Mais ça deviendra important dans les années à venir lors d’un audit technique.

Recommandation: Compressez le contenu avec GZIP.

La stratégie de Cache

Avec un CMS comme WordPress, les pages sont générées à la demande. L’inconvénient, c’est que ça prend beaucoup de temps, le site est alors lent. La génération de page à la demande, c’est donc superflu dans beaucoup de cas.

Cet article par exemple. Il est n’est pas nécessaire de régénérer la page pour chaque visiteur, car c’est le même contenu. En revanche, il est plus efficace de conserver en mémoire la page générée pour la resservir directement au prochain visiteur. Cette technique, c’est donc le cache.

Il y a plusieurs méthodes pour mettre en place une stratégie de cache. Ma préférée, c’est le cache FastCGI de Nginx. Par conséquent, c’est celui que j’utilise. J’indique dans l’entête HTTP si la page envoyée est issue du cache ou non, vous pouvez donc le voir avec curl:

➜  ~ curl --head https://flogg.fr

x-fastcgi-cache: HIT

HIT signifie que le cache est utilisé, MISS signifie qu’on n’avait pas de page préchargée en mémoire, BYPASS signifie qu’il ne fallait pas utiliser le cache dans ce cas (lorsque le visiteur vient de laisser un commentaire par exemple).

Recommandation: Mettez en place un cache.

Optimiser les images

Une image peut contenir beaucoup d’informations qui peuvent être superflues lors de l’affichage sur un site web. Supprimez alors toutes les informations inutiles de l’image en utilisant un logiciel pour optimiser les images comme celui que j’utilise.

De plus, s’il est nécessaire de faire défiler le site pour faire apparaître une image, il faut alors qu’elle soit chargée plus tard. C’est ce qu’on appelle le Lazy Load.

Vous pouvez utiliser l’un des outils SEO indispensables que je recommande. Pour l’analyse de la performance d’un site web, je conseille notamment l’outil gratuit Web.Dev.

Optimiser les images sur macOs clic droit
Sur macOs, j’utilise ImageOptimize pour optimiser les images

Recommandation: Optimisez toutes les images et retardez le chargement des images qui ne sont pas en haut.

Bilan de l’audit SEO technique d’un site web

Si vous avez correctement mis tous ces éléments en place, vous avez donc tous les prérequis pour être bien classé sur Google. Si votre contenu est aussi bon que l’aspect technique, alors il suffit d’attendre quelques mois pour voir fleurir vos articles en 1ère page.

Le SEO, c’est mon métier. J’ai déjà fait grimper des sites en partant de 0. C’est possible! N’hésitez pas à me contacter si vous avez besoin d’aide pour faire un audit SEO technique ou pour mettre en place les actions nécessaires.

Plugins pour accélérer WordPress: éléments chiffrés!

J’ai longtemps tâtonné dans les plugins WordPress pour obtenir la configuration la plus efficace. Mon site se trouve sur un serveur virtuel (VPS) chez Scaleway. Il coûte 3€ par mois. Au fur et à mesure que la fréquentation augmentait, je me demandais à partir de quel moment je devais faire grossir le serveur. Conclusion, c’est pas pour tout de suite, ce petit serveur sait gérer un flux énorme, et ce grâce à 2 plugins pour accélérer WordPress.

Configuration de départ

Pour faire ce test, j’ai choisi un article du site et j’utilise deux outils pour mesurer la vitesse:
Pingdom: pour mesurer la performance unitaire du site
Loader.io: pour mesurer la montée en charge, avec 100 requêtes par secondes durant 1mn

Au départ, le site tourne sur nginx sans option particulière (gzip est activé par défaut). Il n’y a pas de plugins pour accélérer WordPress. Le CDN Cloudflare est configuré mais en mode « développement » pour accéder directement au site.

Résultat Pingdom:
– Note: 74%
– Vitesse de la page: 5,68s
– Nombre de requêtes: 30

Résultat Loader:
– Test avorté à la 2ème seconde car le taux d’erreur est trop élevé (= le serveur met trop de à répondre)

Pas génial donc…

Plugin Autoptimize

J’ai choisi de commencer par Autoptimize. Ce plugin permet de:
– Minifier le code HTML
– Minifier et unifier en un seul fichier le code CSS
– Minifier et unifier en un seul fichier le code Javascript

Plus on a de plugins, plus on a de fichiers css et javascript qui s’ajoutent et qui dégradent la vitesse de chargement du site. Parfois, même les fichiers incluent dans les thèmes nécessitent un travail d’optimisation.

Est-ce que le plugin fait ce qu’il annonce? Oui! Et je suis le premier surpris car des plugins de minification qui ne marchent pas, j’en ai vu des dizaines. Après activé la minification HTML, CSS et Javascript, WordPress charge un seul fichier css dont le nom contient « Autoptimize ». WordPress charge toujours le fichier JQuery.js séparément (il est dans la liste blanche de autoptimize), et les autres fichiers ne font plus qu’un. Le code HTML est également minifié. C’est parfait! Ce plugin ne fait qu’une chose et le fait très bien.

Résultat Pingdom:
– Note: 85% (+9%)-
– Vitesse de la page: 1,96s _(-65%)

– Nombre de requêtes: 14 (-53%)

Résultat Loader:
– Test avorté à la 3ème seconde

C’est mieux, le site est plus rapide en accès direct. Par contre il ne tient pas encore la charge.

HTTP2

HTTP2 est une nouvelle norme. La plupart des navigateurs la supporte désormais. Je ne connais pas les détails mais cette norme est sensé rendre internet plus rapide.

HTTP2 s’active au niveau de Nginx. Il suffit d’ajouter « http2 » au niveau de la ligne « listen »:

listen 443 ssl http2;

Résultat Pingdom:
– Note: 85%
– Vitesse de la page: 1,33s (-30%)
– Nombre de requêtes: 14

Résultat Loader:
– Test avorté à la 3ème seconde car le taux d’erreur est trop élevé (= le serveur met trop de à répondre)

Encore une nette amélioration du temps de chargement unitaire. Tout ça rien qu’avec un changement de norme.

Le plugin Cache-Enabler

Générer une page à chaque accès c’est bien beau mais ce n’est pas efficace. Pour tenir une montée en charge, il va falloir générer des pages statiques qui seront envoyées aux visiteurs. J’ai choisi d’utiliser le plugin Cache-Enabler car il me paraissait simple. Il ne veut pas trop en faire comme « W3 Total Cache » par exemple. Ce plugin va uniquement créer une page html statique pour chaque page ou article du site. En configurant Nginx tel que recommandé par le plugin, le client accédera directement à la page en cache sans passer par PHP.

Pour profiter à fond du plugin, il faut donc changer sa configuration nginx tel quel préconisé par le plugin.

Il vous faut remplacer la zone « location » de votre configuration qui doit ressembler à ça:

location / {
# This is cool because no php is touched for static content.
# include the "?$args" part so non-default permalinks doesn't break when using query string
try_files $uri $uri/ /index.php?$args;
<code> }

Par le code fourni par le plugin:

set $cache_uri $request_uri;

# bypass cache if POST requests or URLs with a query string
 if ($request_method = POST) {
 set $cache_uri 'nullcache';
 }
 if ($query_string != "") {
 set $cache_uri 'nullcache';
 }

# bypass cache if URLs containing the following strings
 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 'nullcache';
 }

# bypass cache if the cookies containing the following strings
 if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
 set $cache_uri 'nullcache';
 }

# custom sub directory e.g. /blog
 set $custom_subdir '';

# default html file
 set $cache_enabler_uri '${custom_subdir}/wp-content/cache/cache-enabler/${http_host}${cache_uri}index.html';

# webp html file
 if ($http_accept ~* "image/webp") {
 set $cache_enabler_uri '${custom_subdir}/wp-content/cache/cache-enabler/${http_host}${cache_uri}index-webp.html';
 }

location / {
 gzip_static on; # this directive is not required but recommended
 try_files $cache_enabler_uri $uri $uri/ $custom_subdir/index.php?$args;
 }

Pensez bien à recharger le serveur nginx. Sur Debian/Ubuntu, c’est:

sudo service nginx reload

Résultat Pingdom:
– Note: 86% (+1%)
– Vitesse de la page: 0,736s (-44%)
– Nombre de requêtes: 14

Résultat Loader:
– Temps de réponse moyen: 118ms
– Taux d’erreur: 0%

C’est une claque! Je ne pensais pas le plugin de cache si efficace. L’article se charge en 0,7s, c’est parfait. Le serveur est capable de servir 100 demandes par secondes, durant une minute, sans broncher, sans erreur.

Pour aller plus loin

Avec 100 requêtes par secondes, le site gère sans problème. Peut-on aller plus loin? J’ai essayé 500 requêtes par seconde:

Résultat Loader @500req/s:
– Temps de réponse moyen: 121ms
– Taux d’erreur: 0%

Aucun problème pour 500. On peut pousser encore? 1000 requêtes par seconde?

Résultat Loader @1000req/s:
– Temps de réponse moyen: 182ms
– Taux d’erreur: 0,2%

Des erreurs commencent à arriver mais ça reste acceptable. Durant le test, les ressources du serveur sont à 100%, signe qu’on ne pourra pas aller beaucoup plus loin.

Plugins pour accélérer WordPress: en conclusion

L’objectif était d’améliorer la vitesse de son site WordPress. Au départ, notre site chargeait en plus de 5s et ne tenait pas la charge. A l’arrivée, notre site charge en 0,7s et est capable de gérer 1000 requêtes par secondes. Le tout grâce à 3 points clefs:
– HTTP2
– Plugin Autoptimize
– Plugin Cache-Enabler

A ma question « quand devrais-je augmenter la puissance de mon serveur », la réponse est donc:
– Quand le site devra afficher plus de 1000 requêtes par seconde;
– Ou quand le site devra afficher plus de 3,6 millions de page par heure

Avec un serveur à 3€, on peut faire un site WordPress capable d’afficher plus de 3 millions de page par heure. Ça devrait nous suffire pour l’instant =).

Éviter le spam de commentaire WordPress, gratuit et sans plugin

Le spam de commentaire WordPress, c’est la plaie. C’est sans fin. Pour éviter le spam de commentaire WordPress, il y a heureusement des solutions. On peut le classer en 2 catégories:

  • le spam automatisé: en anglais, faisant souvent la promotion de médicament
  • le spam de promotion: des commentaires en français du genre « super article » qui en profite pour mettre son lien et essayer de gratter un backlink inutile.

Dans les 2 cas, on en veut pas. Voici le plan que je propose:

  • Activer la modération pour tous les commentaires: au lieu d’afficher tout de suite les commentaires, on les met en attente pour une approbation manuelle.
  • Mettre en place un liste noire de mots clés pour les commentaires: pour les envoyer tout de suite à la corbeille.
  • Supprimer le lien du « site internet » du commentaire.
Éviter ce genre de commentaire spam WordPress
Miam miam, du bon spam

Pourquoi ne pas utiliser Akismet? C’est pourtant gratuit pour les sites « non-commerciaux ». Oui, mais la notion de site commercial n’est pas super-définie. Si vous avez des liens affiliés, vous gagnez de l’argent, c’est donc commercial. L’autre raison, c’est que Akismet a beaucoup de faux-positif (des commentaires tagués comme spam par erreur): des commentaires légitimes qui ne s’affichent pas, des visiteurs mécontent d’être censurés.

Activer la modération de tous les commentaires

En premier lieu, on va donc éviter d’afficher ces commentaires. On va soumettre tous les commentaires à une approbation manuelle. WordPress a une option pour ça, dans « Réglage > Discussion ». Cochez « Le commentaire doit être approuvé manuellement ».

Notons que cette action ne va pas éviter le spam de commentaire WordPress. En revanche, les commentaires ne seront plus directement affiché sur le site ce qui préservera l’image de votre site.

Activer la modération des commentaires WordPress
Activer la modération des commentaires WordPress

Mettre en place une liste noire pour les commentaires spam WordPress

Ok, maintenant on reçoit un mail pour chaque commentaire en attente. Et il peut y en avoir beaucoup. Heuresement, la grande majorité du spam (99% chez moi), c’est le spam automatique en anglais pour des médicaments. C’est celui qui tombera dans le panneau de notre liste noire.

On va utiliser une autre fonctionnalité de WordPress: la mise à la corbeille des commentaires contenant les mots clés du spam. C’est encore dans « Réglages > Discussion ».

Liste noire de commentaire spam WordPress
Liste noire de commentaire spam WordPress

Il y a 3 écoles:

  • vous alimentez la liste noire à la main, suivant les cas rencontrés. C’est ce que je fais désormais.
  • vous utilisez une liste noire préconstruite, contenant la majorité des mots clés. C’est ce que je faisait, et j’utilisais cette liste noire. J’ai arrêté car il y avait trop de faux-positif.
  • Utiliser un plugin qui maintient à jour la liste noire. Par exemple Blacklist Updater ou Comment Blocklist Manager qui utilise la même source de liste noire qu’au point précédent.

Supprimer le lien du commentaire WordPress

Ce moyen, c’est spécialement dédié au spam de promotion. Ce cas est assez rare, je n’en rencontre pas beaucoup. Vous n’êtes pas obligé de faire cette étape, vous aller déjà bien éviter le spam de commentaire WordPress avec la modération et la liste noire.

Pour cette partie, on va ajouter du code dans WordPress. On peut le faire directement dans le fichier functions.php, mais je préfère le faire avec un plugin gérant ce genre de modification: Code Snippets.

Voici le code à ajouter pour ne pas afficher de lien pour le site:

add_filter( 'get_comment_author_link', 'rv_remove_comment_author_link', 10, 3 );
function rv_remove_comment_author_link( $return, $author, $comment_ID ) {
  return $author;
} 

add_filter('get_comment_author_url', 'rv_remove_comment_author_url'); 
function rv_remove_comment_author_url() {
  return false;
}
Code pour supprimer le lien des commentaires WordPress
Code pour supprimer le lien des commentaires WordPress

Mes outils indispensables pour un audit SEO, c’est quoi? #partage

Le SEO, Search Engine Optimisation, c’est l’ensemble des techniques qui permettent d’améliorer son référencement naturel. Il n’y a pas de secret: plus le site est bon, mieux il est classé. Le SEO va donc consister en un ensemble de bonnes pratiques pour créer du contenu de qualité. Je vais partager ici mes outils seo indispensables pour faire un audit de site web, ceux que j’utilise.

Avant de commencer, c’est quoi des outils SEO? C’est un logiciel ou un service qui va donner des pistes d’améliorations, pour le SEO technique et pour le contenu.

Nous allons voir 3 points:

  • le contenu
  • le SEO technique
  • l’analyse des concurrents

Le contenu

Le nerf de la guerre. Le contenu doit être intéressant et optimisé.

Intéressant: c’est à vous de le définir, c’est une thématique sur lesquelles vous avez des informations utiles à apporter et que recherchent les internautes.

Optimisé: ce sont de bonnes pratiques. C’est une approche plus mécanique: quelle est la requête cible sur laquelle vous souhaitez apparaitre? Cette trame est-elle écrite mot pour mot dans le contenu? Est-elle repetée plusieurs fois? Le champ lexical de l’article est-il en cohérence avec la thématique abordée? On peut faire une liste sans fin de question mais ce n’est pas interessant. Et puis surtout, il y a plus simple. Parmi tous les plugins WordPress, le meilleur des outils indispensables est Yoast SEO.

Yoast SEO

Yoast SEO est un plugin pour WordPress. C’est le meilleur plugin de contenu SEO. Il analyse le contenu et vérifie l’application des bonnes pratiques:

  • distribution de la requête cible dans le contenu, dans les titre
  • liens internes et externes en relation avec le thème
  • image contenant la requête cible
  • nombre de mots
  • lisibilité du contenu
  • proportion de phrases à la forme passives
  • etc.

Yoast analyse tout et donne une indication de la qualité SEO du contenu. Vous pouvez alors facilement modifier le contenu pour qu’il devienne plus optimisé. C’est le plugin essentiel à utiliser pour le contenu SEO.

Outils SEO technique indispensables

Avant de parler outil, c’est quoi le SEO technique? Pour les moteurs de recherche, Google en premier, un contenu optimisé ne suffit pas. Il faut également que le site soit performant. Il doit être rapide, avec un accès immédiat au contenu. Si le contenu est recouvert de publicités, Google le sait et dégrade la note de votre site.

Un point souvent négligé, c’est l’optimisation des images. C’est essentiel sur internet. Le temps de chargement peut facilement être divisé par 2. Utilisez toujours un programme pour optimiser les images avant de les charger sur Internet.

Web.dev

Web.dev est un outil SEO utilise l’auditeur SEO Lighthouse de Google. Ses recommandations sont bonnes à prendre mais il ne faut pas chercher à obtenir 100% partout.

Vous pouvez aussi l’utiliser pour analyser vos concurrents. Si votre est score est inférieur, alors il est bon de travailler sur l’optimisation technique de votre site. C’est un outil indispensable pour réussier le SEO technique. C’est souvent mon premier outil SEO dans le cadre d’un audit de site web.

Outils SEO Technique indispensables Web.Dev
Très bons score de SEO Technique pour iGen.fr

Pingdom Website Speed Test

Pingdom est un outil SEO analyse la vitesse d’un site. Il fonctionne un peu comme Web.dev mais donne des résultats un peu différent.

C'est quoi l'outil SEO Pingdom
1,32s de temps de chargement, c’est très bien

Se comparer aux autres

C’est toujours utile de se comparer aux autres. Internet est grand, vous avez certainement des concurrents. Il est bon d’identifier quelles sont leurs requêtes cible. Où trouvent ils leur audience? Comment se positionnent-ils? Quelles sont leur résultats?

SimilarWeb: outil indispensable pour mesurer l’audience

SimilarWeb fait vraiment partie des outils SEO indispensables pour mesurer l’audience d’un site. Je ne sais pas comment il fonctionne, mais il est très fiable! Vous n’obtiendrez pas toujours une estimation précise de la fréquentation, mais vous saurez si vos concurrents ont plus ou moins d’audience.

c'est quoi l'outil seo SimilarWeb
On caresse le millions de sessions par mois chez iGen.fr, bravo!

Moz Link Explorer

Moz analyse le web. Il indexe au maximum les sites web et enregistre notamment les liens entre eux. Le Moz Link Explorer permet de connaître la notoriété d’une page, si d’autres sites la référence et quel est le poids de ces sites.

C’est un outil indispensable pour construire votre stratégie backlink, mais aussi pour faire l’audit SEO du site web d’un concurrent.

outil seo Moz Link Exporer
Plus de 7900 sites ont un lien vers iGen.fr, c’est beaucoup!

Google Search Console

Enfin, la Google Search Console. Cet outil SEO permet de connaitre vos résultat de référencement sur Google. Quelles sont les requêtes cibles générant le plus de clic? Quelle est votre position moyenne sur telle requête cible? Combien de fois votre site a été proposé pour cette requête?

La Search Console de Google permet de connaitre les résultats de son SEO. Elle permet aussi de connaitre le temps de crawl accordé par Google.

Outils SEO indispensables: au final

Avec ces 6 services, vous saurez mieux comment appréhender le SEO de votre site, et comment utiliser ces outils pour un audit de site web. Ça prend du temps le SEO, ne paniquez pas. J’ai des articles qui étaient totalement ignorés par Google et qui, après 3 mois, se sont retrouvés sur la 1ère page. Si vos résultats dans Yoast, Web.Dev et Pingdom sont bons, soyez patient.

Sauvegarde automatique de base de données MySQL: mon script

Une sauvegarde automatique de la base de données MySQL peut sauver! Un piratage de site peut toujours arriver et sans sauvegarde, vous êtes bon pour tout recommencer depuis zéro.

Faire une sauvegarde (un backup) sur le même serveur, c’est un début mais ça ne suffit pas. Si un pirate a accès à votre serveur, il peut facilement tout supprimer, y compris vos sauvegarder. C’est pourquoi il faut conserver vos backups sur un autre support. Tout d’abord sur un autre serveur, puis également sur un support déconnecté d’Internet.

Quelles solutions possibles?

Sauvegarde automatique avec WordPress

Il existe plusieurs plugins WordPress qui fonctionnent très bien. Le plus connu est certainement UpDraftPlus.

Mais les plugins WordPress… faut pas non plus en abuser. Il y a déjà assez de plugins dans tous les sens, lorsque je peux éviter d’en ajouter, j’évite!

Sauvegarde WordPress sans plugin

Pour sauvegarder les articles de WordPress sans plugin et de manière automatique, il faut passer par un script de sauvegarde. Ce script fera appel à MysqlDump pour créer des sauvegardes et Crontab pour le planifier chaque jour.

Sauvegarde automatique avec MysqlDump et Crontab

J’ai mis en place un script qui effectue une sauvegarde automatique de la base de données tous les jours sur un NAS situé chez moi. Tous les 3 mois, je fais une sauvegarde froide, je fais une copie des dernières sauvegarde sur un disque externe. Avec ce process, j’ai une réponse à plusieurs risques:

  • Piratage du site: récupération depuis la sauvegarde de la veille
  • Piratage du site + du serveur de sauvegarde: récupération depuis la sauvegarde d’il y a max 3 mois.

Dans mon cas, le « serveur de sauvegarde » est un Raspberry Pi. C’est lui qui va créer les backups et les enregistrer sur le NAS.

Sécurité de la sauvegarde automatique de base de données

L’idée générale, c’est une tâche ordonnancé par cron qui se connecte automatiquement au serveur, sauvegarde les bases de données et les transfert sur le NAS. Pour limiter les accès du programme de sauvegarde, on va créer un utilisateur spécial pour se connecter en SSH, et un autre pour accéder à la base de donnée.

Créer un utilisateur sans permissions dans Linux

La configuration par défaut suffit. La commande est simple:

ubuntu@serveur: sudo adduser backupuser

Saisissez un mot de passe compliqué, issu d’un générateur de mot de passe. De toutes façons, on ne va jamais l’utiliser puisque la connexion SSH par mot de passe est désactivé sur le serveur web.

Pour permettre la connexion par clef SSH, il faut ajouter notre clef . Copier la clef SSH du serveur de sauvegarde:

ubuntu@pi:~$ cat ~/.ssh/id_rsa.pub

Sur le serveur web, ajouter votre clef pour le nouvel utilisateur:

ubuntu@serveur:~$ sudo -u backupuser bash
backupuser@serveur:~$ mkdir -p ~/.ssh
backupuser@serveur:~$ echo "MACLEFSSH" >> ~/.ssh/authorized_keys

Désormais, le serveur de sauvegarde sait se connecter au serveur web, avec un utilisateur sans permissions. Sans risque donc.

Créer un utilisateur MySQL dédié pour la sauvegarde

De même pour l’utilisateur MySQL (ou MariaDB). On créé un utilisateur n’ayant pour permissions que la lecture (=SELECT).

On se connecte à MariaDB avec les droits root pour créer cet utilisateur:

ubuntu@serveur:~$ sudo mysql
MariaDB [(none)]> GRANT SELECT ON *.* TO 'backupuser'@'localhost' IDENTIFIED BY 'secret-password';

On peut maintenant se connecter avec cet utilisateur pour sauvegarder la base de données: il peut lire toutes les bases de données et ne peut en modifier aucune: parfait!

Script de sauvegarde automatique

Le programme de sauvegarde est piloté par le serveur de sauvegarde (mon Raspberry Pi). Il va se connecter en SSH, exécuter le programme de sauvegarde, rapatrier les fichiers de sauvegarde créés et supprimer ces fichiers du serveur web.

#!/bin/sh

SQL_USER="backupuser"
SQL_PASS="secret-password"
SQL_HOST="localhost"

SSH_USER="backupuser"
SSH_HOST="monServeur"

FILE_PREFIX="backup_db"
FILE_PATH="/media/smb/Backups/"

FILE_DATE=`date +%Y-%m-%d-%H-%M-%S`
TARGET_FILE_PATH="/tmp/backupuser/"

DB_SCRIPT="MYSQL_PWD=$SQL_PASS mysql -h $SQL_HOST -u $SQL_USER -e \"SHOW DATABASES;\" | tr -d \" | \" | grep -v -e Database -e _schema -e mysql"
DB_SAVE="MYSQL_PWD=$SQL_PASS mysqldump -h $SQL_HOST -u $SQL_USER --single-transaction --skip-lock-tables \$DB_NAME > $TARGET_FILE_PATH$FILE_PREFIX.\$DB_NAME.$FILE_DATE.sql"
DB_COMPRESS="gzip $TARGET_FILE_PATH$FILE_PREFIX.\$DB_NAME.$FILE_DATE.sql"

ssh -T $SSH_USER@$SSH_HOST << EOSSH
mkdir -p $TARGET_FILE_PATH
DATABASES=\$($DB_SCRIPT)
for DB_NAME in \$DATABASES; do
	\$($DB_SAVE)
	\$($DB_COMPRESS)
done
EOSSH

# On transfert les données du script client
scp $SSH_USER@$SSH_HOST:$TARGET_FILE_PATH$FILE_PREFIX.*.sql.gz $FILE_PATH

# On supprime le script client et les fichiers temporaires
ssh $SSH_USER@$SSH_HOST "rm $TARGET_FILE_PATH$FILE_PREFIX.*.sql.gz"

Déchiffrons le fonctionnement du script, point par point

1/ La configuration du script

Ici, ce sont les variables qu’il faut modifier pour que le script fonctionne.

  • Nom du serveur Web
  • Utilisateur SSH du serveur Web
  • Nom du serveur SQL
  • Utilisateur SQL
  • Mot de passe SQL
  • Chemin où seront enregistrés les fichiers de sauvegarde
  • Préfixe pour le nom des fichiers de sauvegarde
SQL_USER="backupuser"
SQL_PASS="secret-password"
SQL_HOST="localhost"

SSH_USER="backupuser"
SSH_HOST="monServeur"

FILE_PREFIX="backup_db"
FILE_PATH="/media/smb/Backups/"

2/ Les variables de travail

On stocke la date actuelle qui servira à nommer les fichiers, afin d’avoir des noms fichiers uniques.

Le chemin temporaire de travail peut être modifié. /tmp est généralement stocké en RAM. Si vous avez des grosses bases de données, ça pourrait ralentir le serveur web.

FILE_DATE=`date +%Y-%m-%d-%H-%M-%S`
TARGET_FILE_PATH="/tmp/backupuser/"

Les 3 fonctions à exécuter

On définit les 3 opérations à exécuter:

  • Lire la liste de la base de données
  • Sauvegarder une base de données
  • Compresser un fichier de sauvegarde

Ces fonctions seront exécutés dans un tunnel SSH.

Les options de mysqldump:

  • Single Transaction: la sauvegarde se fera dans une transaction SQL: ça permet de conserver l’intégrité des données sans bloquer la base de données.
  • Skip Lock Tables: pas besoin de vérouiller la base de données pendant le backup puisqu’on l’effectue dans une seule transaction SQL

Je me suis inspiré de cet article intéressant sur les options de mysqldump.

DB_SCRIPT="MYSQL_PWD=$SQL_PASS mysql -h $SQL_HOST -u $SQL_USER -e \"SHOW DATABASES;\" | tr -d \" | \" | grep -v -e Database -e _schema -e mysql"

DB_SAVE="MYSQL_PWD=$SQL_PASS mysqldump -h $SQL_HOST -u $SQL_USER --single-transaction --skip-lock-tables \$DB_NAME > $TARGET_FILE_PATH$FILE_PREFIX.\$DB_NAME.$FILE_DATE.sql"

DB_COMPRESS="gzip $TARGET_FILE_PATH$FILE_PREFIX.\$DB_NAME.$FILE_DATE.sql"

Le tunnel SSH

On ouvre le tunnel SSH et on créer le dossier qui va recevoir nos fichiers temporaires. On sort le liste des bases de données puis on boucle dessus pour créer et compresser une sauvegarde pour chaque base de données

ssh -T $SSH_USER@$SSH_HOST << EOSSH
mkdir -p $TARGET_FILE_PATH
DATABASES=\$($DB_SCRIPT)
for DB_NAME in \$DATABASES; do
	\$($DB_SAVE)
	\$($DB_COMPRESS)
done
EOSSH

Rapatriement des fichiers de sauvegarde

Une simple copie avec SSH de tous les fichiers backups compressés (*.sql.gz) vers notre répertoire de sauvegarde.

scp $SSH_USER@$SSH_HOST:$TARGET_FILE_PATH$FILE_PREFIX.*.sql.gz $FILE_PATH

Nettoyage des fichiers temporaires

Pour ne pas laisser trainer des fichiers inutiles sur le serveur, on supprime tous les fichiers backups compressés de notre répertoire de travail

ssh $SSH_USER@$SSH_HOST "rm $TARGET_FILE_PATH$FILE_PREFIX.*.sql.gz"

Planification de la sauvegarde automatique dans Cron

Il ne reste plus qu’à planifier une sauvegarde automatique de base de données toutes les nuits, et le tour est joué. On ouvre crontab pour un utilisateur standard du serveur de sauvegarde.

ubuntu@pi:~$ crontab -e

Et on ajoute cette ligne:

3 33 * * * /home/ubuntu/Scripts/backup-bdd.sh

Tous les jours, à 3h33, une sauvegarde automatique de la base de données du serveur Web sera effectuée.

Faire taire le message d’accueil SSH

Quand vous utiliserez ce script, il est possible que le message d’accueil SSH vous agace. C’est mon cas.

La solution est très simple, il suffit d’ajouter un fichier .hushlogin dans son répertoire personnel.

backupuser@serveur:~$ touch .hushlogin

Optimiser les images sur macOs facilement avec ImageOptim

Il est très important d’optimiser les images pour le web. Le site sera plus rapide et mieux référencé. L’optimisation des images est une part importante du SEO technique. J’ai longtemps chercher une solution idéale pour optimiser les images sur macOs facilement, et j’ai enfin trouvé!

Pour WordPress, je préfère optimiser les images avant de les télécharger sur le site. La raison est toute simple: WordPress est souvent bien assez chargé de plugin, autant éviter d’un ajouter. D’une manière générale, si je peux faire quelque chose sans plugin WordPress, je n’hésite pas.

ImageOptim pour optimiser les images sur macOs

ImageOptim, c’est gratuit, c’est Open-Source et l’interface graphique est agréable. On part déjà sur de bonnes bases. Pour l’installer, télécharger l’archive sur le site officiel: https://imageoptim.com, décompresser l’archive et copier le programme dans « Applications ». ImageOptim n’est pas disponible sur HomeBrew :(.

ImageOptim intègre et cumule tous les optimiseurs d’image les plus utilisés:

  • JPEG (.jpg / .jpeg)
    • jpegoptim
    • guetzli
  • PNG
    • PNGOUT
    • OxiPNG
    • AdvPNG
    • PNGCrush
  • GIF (ou Jif?)
    • Gifsicle
  • SVG
    • SVGO
    • SVGCleaner

On peut facilement choisir entre une compression sans perte (Lossless) ou avec, on peut conserver le timestamp initial, on peut supprimer les informations EXIF.

J’ai opté pour une compression avec perte, en suivant les recommandations de Google pour le JPEG: « au delà de 85%, la taille de l’image grandit vite mais n’apporte que peu d’amélioration visuelle » (source: Google PageSpeed du 9 février 2019). Pour le format PNG et SVG, j’ai également opté pour une compression avec perte, pour une qualité de 90%. Bien entendu, je supprime toutes les informations EXIF et la correction Gamma des PNG (là encore, sur recommandation de Google). Enfin, j’ai mis la vitesse d’optimisation la plus lente pour avoir la meilleure compression.

Utilisation d’ImageOptim

Pour optimiser les images sur macOs avec ImageOptim, c’est très simple. Un clic droit sur l’image puis « Image Optimize » et le tour est joué. La compression peut prendre plusieurs secondes suivant la taille de l’image et la puissance de votre ordinateur.

Après compression, l’image est remplacée: il n’y a pas de copie de sauvegarde de l’image d’origine. Pour mon utilisation, ça m’arrange mais sachez le avant de traiter en lot des images précieuses.

Optimiser les images sur macOs clic droit

On peut traiter une image ou un lot d’image tout aussi simplement, en les sélectionnant et en faisant un clic droit.

ImageOptim est très efficace. Depuis que je l’utilise, Google PageSpeed n’a plus rien à redire sur mes images.

Exemple d’optimisation d’image

Démonstration sur une image au hasard. Au départ, cette image JPEG fait 9,8Mo. Après optimisation, on arrive à 5,9Mo. A l’arrivée, l’image est presque 40% plus légère. Ça veut également dire un coût de bande passante 40% moins élevé pour la même image.

OptimImage est simple, gratuit et efficace. Il fait une tâche et la fait bien. On serait beaucoup plus heureux si tout était aussi simple :).