Optimiser Apache

apache linux seo

Dans mon précédent article je vous expliquait comment installer un serveurApache dans un container LXC.

La configuration de base est d’Apache est souvent suffisante mais une configuration plus pointue peut vous économiser de la bande passante et de la ressource. Vous serez donc en mesure de tenir une charge plus importante et aussi d’ améliorer votre temps de réponse. De plus, en respectant les conseils Google vous améliorerez aussi votre référencement.

La mise en cache

Quoi de mieux que de réduire la taille des fichiers? Ne pas les envoyer!

Il s’agit du principe de la mise en cache. Lors de la première requête, nous spécifions un en-tête HTTP qui définit une date d’expiration de la page. La page est stockée dans un fichier par le navigateur jusqu’à cette date. Lors de la prochaine visite, si la date est toujours valide, le navigateur utilisera cette page sans passer par le serveur.

Nous allons utiliser PHP pour simuler un temps de chargement assez long. On commence par l’installer:

$ apt install php libapache2-mod-php
$ a2enmod php7.0
$ systemctl reload apache2

La version de PHP à activer peut différer en fonction de celle qui a été installée

On crée un petit script qui va retarder l’affichage de la page grâce à la fonction sleep:

$ echo '<?php sleep(2); echo "loaded" ?>' > /var/www/test.fr/public/load.php

On se rend sur http://test.fr/load.php. La page met plus de deux secondes à s’afficher (normal):

Affichage de test.fr/load.php sans mise en cache

Mettons maintenant en place ce cache. Apache utilise deux modules pour ça: headers qui permet de modifier l’en-tête des réponses et expires qui ajoute l’entête expires. On commence par les activer:

$ a2enmod expires headers

On rajoute la directive ExpiresActive on pour activer l’option et on utilise ExpireDefault pour spécifier le temps de mise en cache. ExpireDefault utilise en argument le temps de mise en cache. Ce temps s’exprime avec:

  • une lettre: A pour Access (dernière visite) et M pour Modification
  • un chiffre: désignant le temps de secondes de mise en cache

Par exemple A10 pour le garder 10 secondes après le dernier accès ou M60 pour le garder 1 minutes après la dernière modification.

Et on rajoute une directive de cache pour les images.

# active la mise en cache
<IfModule mod_header.c>
  Header append Cache-Control public
</IfModule>
# définis un cache d'une heure après la dernier accès
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault A3600
</IfModule>

On redémarre Apache

$ systemctl reload apache2

Et lorsqu’on rafraîchis notre navigateur, la différence est flagrante!

Affichage de test.fr/load.php sans mise en cache

La compression

La compression permet d’économiser de la bande passante en comprimant les données (HTML, CSS, JavaScript, etc..). L’objectif est de réduire la taille des données avant de les envoyer. Le navigateur du client s’occupera de les décompresser avant de les interpréter.

Cette fonctionnalité demande l’activation du module mod_deflate. Pour cela on utilise a2enmod:

$ a2enmod headers deflate

On ajoute maintenant une nouvelle directive à notre fichier de configuration test.fr.conf.

$ vi /etc/apache2/sites-availables/test.fr.conf
# activation du module de compression
<IfModule mod_deflate.c>
  SetOutputFilter DEFLATE
  DeflateCompressionLevel 9

  # compression des fichiers HTML / CSS
  <Location />
   AddOutputFilterByType DEFLATE text/html
   AddOutputFilterByType DEFLATE text/css
  </Location>
</IfModule>

Et il suffit de redémarrer Apache

$ systemctl reload apache2

Sur le PC client, ouvrez l’inspecteur réseaux avec F12 et actualisez la page.

Page d'accueil de test.fr

L’inspecteur nous inique que sur 155,54 ko, 21,31 ko ont été transférés! Il s’agit donc d’un gain à ne pas négliger car il fera la différence pour les petites connections.

Supprimer les modules inutiles

Certains modules sont activés par défaut lors de l’installation. Ceux-ci:

  • nous prennent de la place sur le serveur
  • sont potentiellement une faille de sécurité
  • utilise éventuellement une partie des ressource

Il convient donc de les supprimer.

Pour les connaître, il suffit de lister les fichiers contenu dans le dossier /etc/apache2/mods-enabled:

$ ls /etc/apache2/mods-enabled/

Ensuite, il suffit d’utiliser a2dismod pour les désactiver (attention à tester sur un serveur de test avant de le faire en production).

Désactiver les logs d’accès

Les logs d’accès sont définit dans votre Vhost avec la directive

  • ErrorLog pour les logs erreurs
  • CustomLog pour les logs d’accès

Pour améliorer les performances, on peut désactiver les logs d’accès avec a2disconf.

$ a2disconf other-vhosts-access-log

Pensez bien à supprimer la directive de votre Vhost

HTTP2

Il s’agit de la nouvelle version du protocole HTTP. IL apporte de nombreuses améliorations.

Ne peux être utilisé que en HTTPS. Si vous n’avez pas encore activé le HTTPS, considérez vraiment Let’s Encrypt qui vous délivre un certificat rapidement & gratuitement. L’installation est très rapide avec Certbot qui s’occupe de mettre à jour votre configuration Apache. Pour l’installer, suivez la documentation officielle.

$ sudo a2enmod ssl http2

Et on édite notre Vhost en ajoutant la directive.

Protocols h2 http/1.1
SSLEngine on

Malheureusement nous ne pouvons pas tester sur notre environnement local car nous ne possédons pas le nom de domaine test.fr. Il faudra faire la manipulation directement sur votre environnement de production.

D’autres paramètres en vrac

La recherche de DNS

HostnameLookups permet de rechercher le nom de domaine du visiteur afin de le logger. Le problème est qu’une recherche DNS est effectuée à chaque visite. On peut désactiver cette options simplement dans notre Vhost:

HostnameLookups off

.htaccess

Les fichiers .htaccess permettent d’écraser les options renseignées dans le fichier de configuration Apache. Un appel système est effectué pour vérifier qu’un fichier .htaccess existe ou non. Si votre projet n’utilise pas de ces fichiers, vous pouvez les désactiver l’option AllowOverride:

<Directory "public/">
  AllowOverride None
</Directory>

Durée de vie d’une connexion TCP

KeepAliveTimeout détermine la durée d’attente de la prochaine requête. Par défaut la valeur est fixée à 5 secondes ce qui signifie qu’un processus attendra 5 secondes maximum avant de se fermer. Nous pouvons l’ abaisser à 2 secondes. Il suffit d’ajouter la directive à notre Vhost.

KeepAliveTimeout 2

Les liens symboliques

L’option FollowSymLinks autorise Apache à traverser les liens symbolique pour récupérer des ressources (des images par exemple). Lorsque cette option est désactivée, un appel système est effectuée pour vérifier que le dossier n’est pas un lien symbolique. Donc autant activer l’option si cela est possible. Dans votre Vhost, ajouter la directive suivante:

<Directory "public/">
  Options FollowSymLinks
</Directory>

Liens intéressants

Licence Creative Commons
Cet article de Alexandre Rousseau est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.