Pagespeed : Nginx + Memcached + PHP5-FPM

Nginx avec PHP5-FPM est déjà assez rapide, mais si les pages terminées sont sauvegardées à l'aide de Memcached, le temps de chargement peut être encore réduit. La mise en œuvre est simple.

Ce billet est inspiré d'un tutoriel sur 6tech.org et appliqué aux versions actuelles des logiciels. Les conditions suivantes doivent être remplies pour que la configuration de Nginx puisse bénéficier de Memcached :

  1. nginx avec PHP5-FPM
  2. modules php5-memcached installés et activés
  3. memcached doit être installé

L'idée de base : au lieu de l'index.php actuel, un script intermédiaire est appelé, qui transmet l'appel à l'index.php actuel et stocke le résultat dans le memcache. C'est un moyen simple d'obtenir une solution de mise en cache similaire au plugin WP Supercacheoù sont stockées les pages terminées. Cela signifie que dans le cas d'un hit du cache, un seul appel PHP est nécessaire pour fournir le résultat du memcache - comme les données sont stockées en RAM, c'est beaucoup plus rapide qu'un appel normal.

remplacement de index.php

Le script PHP suivant doit être stocké dans le répertoire du WordPress à mettre en cache, par exemple sous le nom index-memcached.php.

addServer('127.0.0.1', 11211);

// Durée du cache en secondes (1 jour)
$cacheTime = 60 * 60 * 24 * 1 ;
$cacheKey = "fullpage:{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}" ;

$debugMessage = 'Page récupérée du cache en %f secondes' ;
$html = $memcached->get($cacheKey) ;

si ( ! $html) {
    $debugMessage = 'Page générée en %f secondes' ;

    ob_start() ;

    requiert 'index.php' ;
    $html = ob_get_contents() ;

    $memcached->set($cacheKey, $html, $cacheTime) ;

    ob_end_clean() ;
}

$finish = microtime(true) ;

echo $html ;
echo '' ;
sortie ;

La durée de la mise en cache doit être spécifiée en secondes, la formule donne une mise en cache d'un jour. Une fois qu'une page a atterri dans le memcache, elle ne sera mise à jour qu'après un jour. Il faut en tenir compte lorsqu'il s'agit de commentaires, par exemple : si vous utilisez la fonction de commentaire de WordPress, les articles des lecteurs ne seront pas mis à jour. Par le biais de l'ici utilisé Système de commentaires Disqus avec Lazyload ce problème est évité.

Configuration de Nginx

Pour que Nginx transmette les requêtes au nouvel index-memcached.php et ignore l'ancien index.php, du moins pour les invités, la configuration du serveur doit être adaptée. Cela se fait dans la configuration du VirtualHost de l'installation WordPress respective. Dans le serveur {...}-Ajouter le code suivant à la section :

#caching
set $cache_flags "" ;

    # Est-ce un navigateur mobile ?
    if ($http_user_agent ~* "(2.0 MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mob
        set $cache_flags "{$cache_flags}M"
    }

    # L'utilisateur est-il connecté ?
    if ($http_cookie ~* "(comment_author_|wordpress_logged_in_|wp-postpass_)" ) {
        définir $cache_flags "${cache_flags}C" ;
    }

    # Avons-nous des arguments de requête ?
    if ($is_args) {
        set $cache_flags "${cache_flags}Q" ;
    }

    # Si aucune des règles ci-dessus n'a été respectée, nous pouvons utiliser le cache
    if ($cache_flags = "") {
        set $index_file /index-memcached.php ; #must set to index-memcached.php for using cache
    }

    # Sinon nous utiliserons simplement index.php
    if ($cache_flags != "") {
        set $index_file /index.php ;
    }

    emplacement / {
        index $index_file index.html ;
        try_files $uri $uri/ $index_file?$args ;
    }

    # Force les requêtes /wp-admin à toujours utiliser index.php
    emplacement /wp-admin/ {
        index index.php ;
        try_files $uri $uri/ /index.php?$args ;
    }

Le principe est le suivant : ce n'est que lorsqu'un utilisateur de bureau appelle la page et n'appelle pas non plus le tableau de bord que la page correspondante est délivrée à partir du cache. Pour une page réactive qui utilise le même code pour les appareils de bureau et les appareils mobiles, vous pouvez commenter la section correspondante.

Conclusion

Quel a été le résultat de cet effort ? Un test avec webpagetest.org apporte les résultats suivants Résultat: le temps jusqu'au premier octet est à 0.092sle temps nécessaire au chargement complet de la page web est d'environ 1,5 heure. 0.993s. Cela correspond à un Indice de vitesse de 600.

Cette solution est problématique : minifier en utilisant W3 Total Cache ne fonctionne pas, afin d'activer defer et async pour le Javascript, celui-ci doit être stocké directement dans le fichier WordPress correspondant.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *