Limpiar la caché de nginx fastcgi a través de PHP (y/o WordPress)

He reservado 15 minutos esta mañana en un sitio de prueba para averiguar cómo empezaría a vaciar la caché fastcgi a través de PHP.

…horas más tarde, y he usado esa parte para armar un plugin de WordPress. Pero empecemos con un pequeño script PHP que purgará efectivamente todo el cache de nginx….

<?php
  array_map('unlink', glob("/path/to/nginx/cache/*/*/*"));
  array_map('rmdir', glob("/path/to/nginx/cache/*/*"));
  array_map('rmdir', glob("/path/to/nginx/cache/*"));
 ?>

Simple, ¿verdad? Y técnicamente, sólo necesitarías la primera línea ya que la 1 elimina los archivos de caché reales, mientras que la 2 y la 3 sólo eliminan los directorios ahora vacíos (que nginx recreará eventualmente de todos modos).

Pero mientras lo siguiente sea cierto, funciona:

  • Estás usando levels=1:2 para el caché en tu configuración de nginx (parte del bit fastcgi_cache_path).
  • Has reemplazado la parte /path/to/nginx/cache/ con la ubicación real de tu cache (parte del bit fastcgi_cache_path en tu nginx config)
  • PHP tiene los permisos necesarios para escribir en esa ubicación (si ejecutas nginx y php como el mismo usuario debería funcionar «fuera de la caja» – de lo contrario tendrás que ajustar los permisos para que tanto nginx como php puedan escribir allí).
  • No tienes otra cosa que hacer.

Por supuesto, limpia toda la memoria caché, pero es genial en el sentido de que puedes acceder a ese archivo php en cualquier momento que necesites purgar.

Esta fue la base del plugin de WordPress que empecé a armar y en el que me meteré más adelante.

Por otro lado, si quisieras quitar un archivo almacenado, las cosas se ponen un poco más difíciles… «Jesin A» hizo una fantástica guía sobre el Océano Digital, y también la mencionaré aquí:

<?php
$cache_path = '/etc/nginx/cache/';
$url = parse_url($_POST['url']);
if(!$url)
{
    echo 'Invalid URL entered';
    die();
}
$scheme = $url['scheme'];
$host = $url['host'];
$requesturi = $url['path'];
$hash = md5($scheme.'GET'.$host.$requesturi);
var_dump(unlink($cache_path . substr($hash, -1) . '/' . substr($hash,-3,2) . '/' . $hash));
?>

En ese guión, tendrías que enviar un POST a ese guión con la URL que quieres borrar. El ejemplo que se dio fue el siguiente (en este caso estarías vaciando http://www.example.com/time.php del cache):

curl -d 'url=http://www.example.com/time.php' http://localhost/purge.php

…un gran agradecimiento a «Jesin A» también – en realidad terminé usando eso en el plugin para dar una opción de limpiar las páginas manualmente, y el escrito en el sitio de DigitalOcean definitivamente vale la pena leerlo si eres nuevo en esto.

¡Extendiendo todo a un plugin de WordPress!

Ok, así que este es el trato… si quieres usar el plugin, puedes hacerlo, pero viene con un pequeño aviso!. La ubicación del directorio de caché de nginx está codificada en el plugin, así que querrás editarlo y cambiarlo a <cualquiera que sea el correcto en tu servidor> ANTES de activarlo.

No puedo enfatizar eso lo suficiente – tan pronto como se active, tratará de purgarse automáticamente cuando edites los mensajes, etc, y si comienza a tratar de borrar archivos en el lugar equivocado de tu servidor…. estarás solo. Te sugiero que hagas una copia de seguridad de cualquier cosa importante por si acaso.

Descarga: nginx-fastcgi-cache-purge.zip (v0.0.2)
(Recuerde editarlo antes de activarlo, y que solo soporta «levels=1:2» en su configuración de nginx fastcgi cache. Actualmente asume «/etc/nginx/cache/» como tu carpeta de cache, ¡así que asegúrate de editarlo si no es correcto!)

Bien, ahora que (con suerte) lo estás editando mientras tu servidor hace una copia de seguridad, aquí están algunos de los puntos más destacados:

  • Auto purga toda la caché cada vez que editas un post, cambias de tema, añades/eliminas una categoría, y creo que también debería funcionar cuando apruebas un comentario.
  • Tiene una página de opciones donde puedes purgar todo el caché, o páginas individuales.
  • Tiene un par de comprobaciones incorporadas para notificarte si no cree que la carpeta de la caché está ahí y es escribible.
  • Te muestra qué publicaciones/páginas de WordPress están actualmente en la caché.
  • Te dice el número total de páginas almacenadas.
  • No crea ninguna entrada nueva en la base de datos de WordPress. Así que si lo odias y lo eliminas, no tendrás basura extra en tu base de datos MySQL.

Algunas desventajas de esto:

  • Cuando digo que purga todo, purga todo. Si tienes algunos sitios en el servidor que (presumiblemente) comparten el mismo caché, todos se limpiarán (tanto automáticamente como cuando los purgues manualmente). Podrías deshabilitarlos con algunas modificaciones si quisieras, claro está.
  • No hay forma de detectar automáticamente la ubicación de la caché, así que simplemente se codifica en el archivo y tienes que editarlo para cambiarlo.
  • Idealmente se engancharía a otros programas de cacheo comunes (cuando sea posible), así que se borra cuando manualmente «vacías la caché» en otro plugin, pero no lo hace. Así que si estás luchando con contenido que no ha cambiado en digamos W3TC, tendrás que «Vaciar todos los cachés» allí y luego ir a la página de opciones de este plugin y hacer lo mismo.
  • La purga manual (cuando la automática no hace el truco) tiene que hacerse desde la página de opciones – no hay botón de «Vaciar todos los Caches».
  • …probablemente algunas otras cosas.

Pocas capturas de pantalla de la página de opciones (haz clic para ampliarlas):

nginx-cache-purge-1 nginx-cache-purge-2 nginx-cache-purge-3

En caso de que te lo hayas perdido, vuelve a descargar el enlace (por favor, lee las advertencias anteriores y haz las modificaciones antes de activarlo).

Descarga: nginx-fastcgi-cache-purge.zip (v0.0.2)
(Puedes subirlo a tu instalación de WordPress (a través de la página del plugin), pero recuerda que asume que «levels=1:2» y «/etc/nginx/cache/» es la forma en que tienes las cosas configuradas ya que la mayoría de las guías/tutoriales de nginx que hay por ahí usan esos, ¡pero deberías editarlo a los valores correctos antes de activarlo!)

Siéntete libre de dejar un comentario si te ha funcionado (¡o no!).

7 Comentarios | Diga un comentario

 Clasificado por el más antiguo... | Ordenar por el más reciente...
  1. El plugin de wordpress no funciona con mi Nginx. ¿Necesito primero el módulo de purga de caché nginx? Intento vaciar toda la caché, el directorio y los archivos aún existían. Aquí está la captura de pantalla http://i.imgur.com/1GTOwTj.jpg

    Mi usuario nginx es lo mismo con mi usuario de wordpress en Linux. Todavía no hacer nada y no purgar esos caché.
    • Hola Beny. El complemento no necesita ni utiliza el módulo de purga de caché. Miré su captura de pantalla: intente agregar una barra diagonal final a la ruta para que sea /var/cache/nginx/mfit/ en lugar de solo /var/cache/nginx/mfit. Cuando la ruta es correcta, en realidad debería enumerar algunas de las publicaciones almacenadas en caché y decir que «_ coincidieron con sus publicaciones/páginas y se enumeran a continuación». Dado que no coincide con nada, eso es una indicación de que la ruta no es correcta.

      Avísame si tienes algún problema. ¡Buena suerte!
  2. Nel en agosto 11, 2015 - haga clic aquí para responder
    Hola, estoy usando el almacenamiento en caché proxy y es trabajo para mí, pero el único problema es que Nginx siempre genera un archivo almacenado en caché ingrabable y eso hace que el complemento no pueda detectar archivos en caché, por lo que necesito chmod todos los archivos almacenados en caché en 777 y hacer que el complemento se detecte.

    ¿Cómo puede generar archivos grabables en caché por Nginx?
    • Hola Nel.

      Lo más probable es que nginx y PHP se ejecuten como usuarios diferentes. Algunas opciones fuera de la parte superior de mi cabeza:

      -Ejecute PHP y nginx como el mismo usuario (hecho en los archivos de configuración para ambos). Tendría que asegurarse de chmod los directorios apropiados después para asegurarse de que puedan leer las «cosas antiguas» que crearon bajo las cuentas de usuario anteriores (o bajo «nadie»).

      -Modificar los permisos de usuario/grupo para que la cuenta de usuario actual de PHP pueda escribir en los archivos de caché.

      -Escribe un script shell/bash (o un crontab simple que se ejecuta cada minuto o algo) que compruebe continuamente la carpeta de caché y cambia los permisos automáticamente. Esta es probablemente la opción menos propensa a errores, pero también la más torpe.
      • Nel en agosto 12, 2015 - haga clic aquí para responder
        Dulce! Modifiqué los permisos de usuario de Nginx igual que el usuario de PHP, entonces funcionó.

        Por cierto, ¿la caché fastcgi tiene el mismo problema ingrabable?
  3. Fantástico escribir, yo estaba buscando exactamente esto. Voy a implementar esto en un proyecto de Laravel. Muchas gracias.
  4. Trung Phan en noviembre 20, 2023 - haga clic aquí para responder
    Muchas gracias. Este plugin es muy útil.

Diga un comentario

Puedes usar un alias y un correo electrónico falso. Sin embargo, si eliges usar un correo electrónico real, se admiten los "gravatars". Lee la política de privacidad para más detalles.