Pagespeed: Microcaching con Nginx

Nginx es un servidor web muy rápido en sí mismo - pero todavía ofrece algunas características interesantes de almacenamiento en caché, minimizando el acceso a PHP y entregando las páginas mucho más rápido. Un manual corto.

Para este blog uso la actual versión 1.7.0 de Nginx mainline con los módulos ngx_pagespeed como base. Para esto tuve que compilar nginx por mí mismo, pero esto no es un problema fundamental y con las instrucciones apropiadas se hace rápidamente incluso en un sistema Debian actual.
Aquí están mis ajustes de configuración:

--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_modules --with-http_realip_modules --with-http_addition_modules --with-http_sub_modules --with-http_dav_modules ---with-http_flv_modules --with-http_mp4_modules --with-http_gunzip_modules --with-http_gzip_static_modules --with-http_random_index_modules --with-http_secure_link_modules --with-http_stub_status_modules --with-http_auth_request_modules --with-mail --with-mail_ssl_modules --with-file-aio --with-http_spdy_modules --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wormat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2' --con-ld-opt='-Wl,-z,relro -Wl,--as-needed' --con-ipv6 --add-module=../ngx_pagespeed-1.7.30.4-beta --add-module=../ngx_cache_purge-2.1

Esto permite que nginx 1.7.0 sea usado como un reemplazo de nginx de los repositorios de Debian, todos los directorios de configuración permanecen iguales. Si hay algo malo con la versión autocompilada, también puedes simplemente volver a la versión original.

Preparación para el microcaching

Para usar el microcaching de nginx la configuración debe ser ajustada. Para hacer esto en la carpeta /etc/nginx/conf.d crear un nuevo archivo, lo he llamado microcache.conf Esto se cargará automáticamente en el archivo de configuración principal. El contenido de este archivo:

fastcgi_cache_path /dev/shm/niveles de microcache=1:2 zona_clave=microcache:5M tamaño_máximo=1G inactivo=2h;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers El control de la caché expira Set-Cookie;

Esto crea un área de caché de un gigabyte en un ramdisk llamado "microcache". Si no puedes o no quieres mantener la caché en la RAM, puedes por supuesto crear un directorio en el disco duro y usarlo. La clave de cada entrada de la caché resulta del protocolo, el método de solicitud (POST o GET), el host y la URL llamada. Esto te permite guardar en caché varios blogs de WordPress sin que se superpongan.

Configuración del caching para VirtalHosts

La mayoría funcionará con una configuración de VirtualHost. Para guardar en caché la salida de PHP, fastcgi debe ser configurado en consecuencia. La siguiente información debe ser agregada al archivo de configuración:

establecer $skip_cache 0;

Las solicitudes POST # y las urls con una cadena de consulta siempre deben ir a PHP
si (1TP2Método_de_solicitud = POST) {
 set $skip_cache 1;
}

si ($query_string != "") {
 set $skip_cache 1;
}

# No almacene uris que contengan los siguientes segmentos
si ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml {
set $skip_cache 1;
    }

# No utilice la caché para los usuarios conectados o los comentaristas recientes
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}

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

# procesa cualquier script php, no encontrado es redirigido a través de routestring
ubicación ~ \ ~ - php$ {\a6} {\a6}
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $documento_root$fastcgi_script_name;
fastcgi_cache microcache;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Configurar la clave de la caché para incluir la identificación de los componentes
fastcgi_cache_valid 200 1d;
fastcgi_cache_valid 302 301 1m;
fastcgi_cache_valid 404 1s;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header updating http_500;
fastcgi_ignore_headers El control de la caché expira;
fastcgi_pass_header Set-Cookie;
fastcgi_pass_header set cookie;
}

Conclusión

En comparación con la solución que he usado hasta ahora (El almacenamiento en caché de páginas enteras a través de Memcached) la variante ofrece algunas ventajas sobre las funciones de cacheo integradas en Nginx:

  • No hay ningún acceso a PHP-FPM para la entrega de la caché
  • Las páginas también pueden ser entregadas si PHP devuelve un error (esto se indica con la línea fastcgi_cache_use_stale alcanzado)
  • Para WordPress hay plugins adecuados que facilitan el vaciado de la caché (purga de la caché)

Seguiré usando esta configuración aquí en el blog y veré qué otros efectos tiene - los tiempos de carga rápida ya son una ventaja fundamental.

Deje una respuesta

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