apache magento

Magento et mpm_worker

Concernant le fonctionnement d'Apache, le module mpm_prefork est le module par défaut. Il est très robuste mais aussi très consommateur de ressources. Chacun de ses processus utilise son propre espace mémoire, chaque nouveau processus réserve un nouvel espace en RAM.

Le module mpm_worker est plus récent, mieux pensé. Beaucoup plus performant, il permet de multi-threader les requêtes, le lancement d'un thread étant beaucoup plus rapide que celui d'un nouveau processus, conservant aussi le même espace mémoire. Il s'agit de l'une des meilleures optimisations possible pour la plateforme Magento hébergée.

La principale raison pour laquelle mpm_worker n'a pas encore remplacé mpm_prefork, est qu'il lui faut utiliser des extensions thread-safe, ce qui n'est pas toujours le cas, notamment avec mod_php. D'où la nécessité d'utiliser fastCGI en lieu et place de mod_php (voir ce billet). À noter que mpm_worker remplace mpm_prefork, et vice versa. Il n'est pas possible de conserver les deux.

Pour l'installer, un apt-get sur une debian ou un ubuntu suffit, sinon il convient de recompiler Apache avec l'option --with-mpm=worker lors du ./configure. Pour vérifier si l'installation a bien fonctionné, utiliser la commande " httpd -l " si tout s'est bien passé, worker apparaîtra dans la liste des modules chargés par Apache.

Magento, Apache et KeepAlive

Une connexion TCP se termine automatiquement au terme d'une requête (par exemple, le téléchargement d'une seule des images de la page d'accueil du site Magento). Ainsi, une nouvelle connexion TCP devra être initiée lors d'une nouvelle requête, consumant temps et bande passante.

Afin de palier à ce problème, il est possible de garder une connexion TCP ouverte durant plusieurs requêtes, par l'envoi de paquets dits keepalive (tous les navigateurs récents le supportent). Ce procédé permet d'accélérer l'affichage d'une page lourde en images de près de 50%.

Pour l'activer, il convient de se rendre dans le fichier de configuration d'Apache (sous Debian : /etc/apache2/apache.conf), et de changer la ligne KeepAlive Off en KeepAlive On (plus d'informations ici).

En ce qui concerne Magento, il est essentiel de ne pas l'activer si on utilise mod_php, en effet, un processus mod_php est spawné par Apache à chaque fois que cela s'avère nécessaire. A cause de keepalive, le processus reste en RAM pendant le timeout du keepalive, ce qui peut impacter énormément les performances en épuisant temporairement la RAM du serveur et en swappant. En revanche, c'est une optimisation dont on ne saurait se passer avec fastCGI, qui lui spawn un processus unique qui reste de toute façon en RAM (voir ce billet).

Compression des pages Magento

90% des navigateurs acceptent dorénavant les pages web compressées, et les décompressent à la volée lors de la navigation. Afin d'optimiser la plateforme Magento hébergée, il est essentiel de profiter de cette technologie.

Pour activer la compression gzip (Apache 1.x) ou deflate (Apache 2.x), il convient d'installer les modules mod_gzip ou mod_deflate, puis de décommenter, dans le .htaccess à la racine de Magento, les lignes suivantes :

php_flag zlib.output_compression on
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

Et uniquement dans le cas de l'utilisation d'un proxy :
Header append Vary User-Agent env=!dont-vary

Dans le cas où les fichiers .htaccess / ne seraient pas utilisés (voir ce billet), il convient de décommenter / rajouter ces lignes au fichier de configuration de Apache ou du vhost.

Fichiers .htaccess de Magento

Les fichiers .htaccess qui résident dans les dossiers de Magento servent à outre-passer certains paramètres de la configuration générale du serveur web (Apache, …). Cela permet d'avoir une configuration adaptée pour chaque hôte virtuel (vhost) résidant sur le même serveur (dans le cas d'hébergements mutualisés, par exemple).

Dans le cas de Magento, cela peut poser un problème de performance. En effet, lors de la navigation sur le site, chaque chargement de page engendrera le chargement du fichier .htaccess correspondant, par le serveur web.

Il est fréquent de gagner environ une seconde sur le chargement de chaque page en copiant le contenu des .htaccess soit dans le fichier de configuration du serveur web, soit dans la configuration de l'hôte virtuel.

Ne pas oublier de supprimer les fichiers .htaccess, car même vides ils sont chargés par le serveur web.

Une fois que vous avez supprimé les .htaccess, il peut être très utile de désactiver le AllowOverride pour le dossier en question. En effet, cela évitera qu'apache ne vérifie dans chaque dossier du path si un .htaccess est présent ou non.

Expiration du cache Magento

Tous les navigateurs s'appuient maintenant sur des systèmes de caches. Ils les utilisent dès que cela s'avère possible, afin d'accélérer l'accès aux pages web, de limiter l'usage de la bande passante...

Le problème est que le navigateur ne sait pas forcément lorsqu'il doit rafraîchir la page depuis le serveur web. Dans le doute, il la rafraîchit, ce qui annihile l'utilité du cache. Pour savoir lorsqu'il doit aller chercher la page dans son cache plutôt que sur le web, il s'appuie sur deux en-têtes HTML : expiration et contrôle du cache.

Ces deux en-têtes sont réglés, en fonction des recommandations d'optimisation de Yahoo!, dans le fichier .htaccess de de la plateforme Magento hébergée ; cependant, ils ne sont pas activés par défaut. Pour les activer, les lignes suivantes sont à ajouter dans le fichier de configuration de apache (la plupart du temps /etc/apache2/apache.conf) :

<IfModule mod_expires.c>
ExpiresActive On
</IfModule>

Si vous n'avez pas accès à la configuration d'Apache, il est possible d'ajouter ces lignes au .htaccess à la racine de votre site, mais il faudra penser à les rajouter au nouveau .htaccess lors des mises-à-jour de Magento.