Pagespeed: Nginx + Memcached + PHP5-FPM

Nginx con PHP5-FPM ya es bastante rápido, si las páginas terminadas se guardan usando Memcached, el tiempo de carga puede reducirse aún más. La implementación es simple.

Este artículo está inspirado en un manual de 6tech.org y transferido a las versiones actuales de software. Para que la configuración de Nginx se beneficie de Memcached, se deben cumplir los siguientes requisitos:

  1. nginx con PHP5-FPM
  2. módulos php5-memcached instalados y activados
  3. debe ser instalado en la memoria.

La idea básica: en lugar del actual index.php se llama un guión intermedio, que pasa la llamada al actual index.php y almacena el resultado en el memcache. Así que se obtiene una solución de almacenamiento en caché similar al plugin WP Supercachedonde se almacenan las páginas terminadas. En el caso de un golpe de caché, sólo se necesita una llamada PHP para entregar el resultado del memcache - ya que los datos se almacenan en la memoria RAM, esto es mucho más rápido que una llamada normal.

reemplazo de index.php

El siguiente script PHP debe colocarse en el directorio del WordPress que se va a cachear, por ejemplo como index-memcached.php.

<?php

$start = microtime(true);

$memcached = new Memcached;
$memcached->addServer('127.0.0.1', 11211);

// Cache time in seconds (1 day)
$cacheTime = 60 * 60 * 24 * 1;
$cacheKey = "fullpage:{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$debugMessage = 'Page retrieved from cache in %f seconds';
$html = $memcached->get($cacheKey);

if ( ! $html) {
    $debugMessage = 'Page generated in %f seconds';

    ob_start();

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

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

    ob_end_clean();
}

$finish = microtime(true);

echo $html;
echo '<!-- ' . sprintf($debugMessage, $finish - $start) . ' -->';
exit;

La duración del caching debe ser especificada en segundos, la fórmula da un caching de un día. Así que una vez que una página ha aterrizado en el Memcache, se actualizará después de un día. Esto debe tenerse en cuenta en lo que respecta a los comentarios, por ejemplo: si se utiliza la función de comentarios de WordPress, las contribuciones de los lectores no se actualizarán. Debido a que aquí se utiliza Sistema de Comienzo de Disco con Lazyload este problema se evita.

Configuración de Nginx

Para que Nginx reenvíe las solicitudes al nuevo index-memcached.php y no tenga en cuenta el index.php anterior al menos para los huéspedes, la configuración del servidor debe ser ajustada. Esto se hace en la configuración del VirtualHost de la respectiva instalación de WordPress. En servidor {...}-Añade el siguiente código a la sección:

#caching
set $cache_flags "";

    # Is this a mobile browser?
    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";
    }

    # Is the user logged in?
    if ($http_cookie ~* "(comment_author_|wordpress_logged_in_|wp-postpass_)" ) {
        set $cache_flags "${cache_flags}C";
    }

    # Do we have query arguments?
    if ($is_args) {
        set $cache_flags "${cache_flags}Q";
    }

    # If none of the rules above were matched, we can use the cache
    if ($cache_flags = "") {
        set $index_file /index-memcached.php; #must set to index-memcached.php for using cache
    }

    # Otherwise we'll just use index.php
    if ($cache_flags != "") {
        set $index_file /index.php;
    }

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

    # Force /wp-admin requests to always use index.php
    location /wp-admin/ {
        index index.php;
        try_files $uri $uri/ /index.php?$args;
    }

Cómo funciona: sólo si un usuario de escritorio llama a la página y no al tablero, la página correspondiente se entrega desde el caché. Si una página de Responsive utiliza el mismo código tanto para los dispositivos de escritorio como para los móviles, puede comentar la sección correspondiente.

Conclusión

¿Qué ha valido el esfuerzo ahora? Una prueba con webpagetest.org trae lo siguiente Resultadoel tiempo de primer byte es 0.092sel tiempo hasta que el sitio web completamente cargado es 0.993s. Esto corresponde a un índice de velocidad de 600.

El problema de esta solución es que la minería con W3 Total Cache no funciona. Para habilitar el aplazamiento y la sincronización de Javascript, éste debe ser almacenado directamente en el archivo correspondiente de WordPress.

Deje un comentario

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol
Ir arriba