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.

addServer('127.0.0.1', 11211);

// Tiempo de caché en segundos (1 día)
$cacheTime = 60 * 60 * 24 * 1;
$cacheKey = "fullpage:{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$debugMessage = 'Página recuperada de la caché en %f segundos';
$html = $memcached->get($cacheKey);

si ( ! $html) {
    $debugMessage = 'Página generada en %f segundos';

    ob_start();

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

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

    ob_end_clean();
}

$finish = microtiempo(verdadero);

eco $html;
echo '';
salida;

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 "";

    # ¿Es un navegador móvil?
    if ($http_user_agent ~* "(2.0 MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Celular|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mob
        set $cache_flags "{$cache_flags}M"
    }

    # ¿Está el usuario conectado?
    if ($http_cookie ~* "(comment_author_|wordpress_logged_in_|wp-postpass_)" ) {
        set $cache_flags "${cache_flags}C"
    }

    # ¿Tenemos argumentos de consulta?
    si ($is_args) {
        establecer $cache_flags "${cache_flags}Q";
    }

    # Si ninguna de las reglas anteriores se ha cumplido, podemos usar la caché
    si ($cache_flags = "") {
        establecer 1TP2Fichero de índice /index-memcached.php; 1TP3Debe establecerse en index-memcached.php para usar la caché
    }

    # De lo contrario, sólo usaremos index.php
    si ($cache_flags != "") {
        set $index_file /index.php;
    }

    ubicación / {
        index $index_file index.html;
        try_files $uri $uri/ $index_file?$args;
    }

    # Forzar a /wp-admin a usar siempre index.php
    ubicación /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 una respuesta

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