Módulo PageSpeed para Nginx y Apache

El módulo Google PageSpeed (ngx_pagespeed para Nginx, mod_pagespeed para Apache) aplica automáticamente docenas de optimizaciones web al vuelo: minificación de CSS y JavaScript, compresión de imágenes, combinación de recursos, lazy loading y mucho más, sin necesidad de modificar el código de la aplicación. Es una de las formas más efectivas de mejorar el rendimiento web en servidores Linux con un esfuerzo mínimo.

Requisitos Previos

  • Servidor Linux (Ubuntu 20.04+, Debian 11+ o CentOS 8+)
  • Nginx 1.18+ o Apache 2.4+
  • Mínimo 512 MB de RAM adicional para el procesamiento de PageSpeed
  • Acceso root o sudo
  • Compilador GCC/Clang (para compilar desde fuente si es necesario)

Instalación en Nginx

Nginx no incluye PageSpeed por defecto; debe compilarse junto con el módulo:

# Ubuntu/Debian: Instalar dependencias de compilación
sudo apt update
sudo apt install -y build-essential zlib1g-dev libpcre3-dev \
  libssl-dev libxslt1-dev libgd-dev libgeoip-dev \
  libperl-dev libpam-dev uuid-dev

# Obtener la versión actual de Nginx
NGINX_VERSION=$(nginx -v 2>&1 | grep -oP '\d+\.\d+\.\d+')
echo "Versión de Nginx: $NGINX_VERSION"

# Descargar el código fuente de Nginx
cd /tmp
wget "http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
tar -xzf nginx-${NGINX_VERSION}.tar.gz

# Descargar ngx_pagespeed
NPS_VERSION="1.14.36.1"
wget "https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}-stable.tar.gz"
tar -xzf v${NPS_VERSION}-stable.tar.gz
cd incubator-pagespeed-ngx-${NPS_VERSION}-stable

# Descargar la librería PSOL requerida
psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget $psol_url
tar -xzf *.tar.gz

cd /tmp/nginx-${NGINX_VERSION}
# Obtener los flags de compilación actuales de Nginx
CURRENT_FLAGS=$(nginx -V 2>&1 | grep "configure arguments:" | sed 's/configure arguments: //')

# Compilar Nginx con PageSpeed y los flags originales
./configure \
  $CURRENT_FLAGS \
  --add-module=/tmp/incubator-pagespeed-ngx-${NPS_VERSION}-stable

make -j$(nproc)

# Guardar el binario actual como backup
sudo cp /usr/sbin/nginx /usr/sbin/nginx.bak

# Instalar el nuevo binario
sudo make install

# Verificar que PageSpeed está incluido
nginx -V 2>&1 | grep pagespeed

# Reiniciar Nginx
sudo systemctl restart nginx

Alternativa más sencilla: usar paquetes precompilados de OpenResty:

# OpenResty incluye ngx_pagespeed en algunos paquetes
# Añadir el repositorio de OpenResty
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
echo "deb https://openresty.org/package/ubuntu $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/openresty.list

sudo apt update
sudo apt install -y openresty

Instalación en Apache

mod_pagespeed para Apache tiene paquetes precompilados disponibles:

# Ubuntu/Debian - Descargar e instalar el paquete .deb
wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb
sudo dpkg -i mod-pagespeed-stable_current_amd64.deb
sudo apt-get -f install -y  # Resolver dependencias si las hay

# CentOS/Rocky - Descargar e instalar el paquete .rpm
wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm
sudo rpm -i mod-pagespeed-stable_current_x86_64.rpm

# Verificar que el módulo está cargado
sudo apache2ctl -M | grep pagespeed

# Reiniciar Apache
sudo systemctl restart apache2

# La configuración se encuentra en:
cat /etc/apache2/mods-available/pagespeed.conf

Configuración de Filtros

La configuración de PageSpeed se realiza en el bloque del servidor (Nginx) o en el VirtualHost (Apache):

Nginx (/etc/nginx/sites-available/tudominio.conf):

server {
    listen 80;
    server_name tudominio.com;

    # Directorio de caché para PageSpeed
    pagespeed FileCachePath /var/ngx_pagespeed_cache;

    # Activar PageSpeed
    pagespeed on;

    # Nivel de optimización (PassThrough, CoreFilters, OptimizeForBandwidth)
    pagespeed RewriteLevel CoreFilters;

    # Filtros adicionales habilitados
    pagespeed EnableFilters extend_cache;
    pagespeed EnableFilters defer_javascript;
    pagespeed EnableFilters lazyload_images;
    pagespeed EnableFilters insert_dns_prefetch;

    # Filtros de imágenes
    pagespeed EnableFilters recompress_images;
    pagespeed EnableFilters convert_png_to_jpeg;
    pagespeed EnableFilters convert_jpeg_to_webp;

    # Necesario para el funcionamiento correcto de PageSpeed
    location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
        add_header Cache-Control "max-age=31536000, no-transform";
    }
    location ~ "^/pagespeed_static/" { }
    location ~ "^/ngx_pagespeed_beacon$" { }
}

Apache (/etc/apache2/sites-available/tudominio.conf):

<VirtualHost *:80>
    ServerName tudominio.com

    # Activar PageSpeed
    ModPagespeed on

    # Directorio de caché
    ModPagespeedFileCachePath /var/mod_pagespeed/cache

    # Nivel de optimización
    ModPagespeedRewriteLevel CoreFilters

    # Habilitar filtros adicionales
    ModPagespeedEnableFilters extend_cache
    ModPagespeedEnableFilters defer_javascript
    ModPagespeedEnableFilters lazyload_images
    ModPagespeedEnableFilters recompress_images

    # Deshabilitar filtros problemáticos si es necesario
    ModPagespeedDisableFilters rewrite_domains
</VirtualHost>

Optimización de Imágenes

PageSpeed puede convertir y comprimir imágenes automáticamente:

Nginx:

# Convertir imágenes a WebP automáticamente
pagespeed EnableFilters convert_jpeg_to_webp;
pagespeed EnableFilters convert_png_to_webp;
pagespeed EnableFilters convert_gif_to_png;
pagespeed EnableFilters recompress_images;

# Configurar la calidad de compresión JPEG
pagespeed JpegRecompressionQuality 75;
pagespeed ImageRecompressionQuality 80;

# Redimensionar imágenes grandes para ajustarlas al viewport
pagespeed EnableFilters resize_images;
pagespeed EnableFilters resize_rendered_image_dimensions;

# Diferir la carga de imágenes fuera del viewport
pagespeed EnableFilters lazyload_images;

# Inline de imágenes pequeñas como base64 (menos peticiones HTTP)
pagespeed EnableFilters inline_images;
pagespeed ImageInlineMaxBytes 3072;  # 3KB máximo para inline

# Crear directorio de caché con los permisos correctos
sudo mkdir -p /var/ngx_pagespeed_cache
sudo chown -R www-data:www-data /var/ngx_pagespeed_cache

Minificación de CSS y JavaScript

# Nginx - Configuración de minificación
server {
    # ...
    pagespeed on;
    pagespeed RewriteLevel CoreFilters;

    # Minificar CSS
    pagespeed EnableFilters rewrite_css;
    pagespeed EnableFilters flatten_css_imports;
    pagespeed EnableFilters combine_css;

    # Minificar JavaScript
    pagespeed EnableFilters rewrite_javascript;
    pagespeed EnableFilters combine_javascript;

    # Diferir la carga de JavaScript no crítico
    pagespeed EnableFilters defer_javascript;
    pagespeed EnableFilters move_css_above_scripts;
    pagespeed EnableFilters move_css_to_head;

    # Precarga de recursos críticos
    pagespeed EnableFilters prioritize_critical_css;

    # Minificar HTML
    pagespeed EnableFilters collapse_whitespace;
    pagespeed EnableFilters remove_comments;
}

Gestión de Caché

# Crear y configurar el directorio de caché
sudo mkdir -p /var/ngx_pagespeed_cache
sudo chown -R www-data:www-data /var/ngx_pagespeed_cache

# Ver el uso del caché
du -sh /var/ngx_pagespeed_cache/

# Limpiar el caché (útil después de cambios en CSS/JS)
sudo rm -rf /var/ngx_pagespeed_cache/*

# O via la API de administración de PageSpeed (si está habilitada)
# En Nginx, habilitar la API de administración:
# Habilitar la API de estadísticas (solo en localhost por seguridad)
server {
    listen 127.0.0.1:8080;
    server_name localhost;

    pagespeed on;
    pagespeed Statistics on;
    pagespeed StatisticsPath /ngx_pagespeed_statistics;
    pagespeed GlobalStatisticsPath /ngx_pagespeed_global_statistics;
    pagespeed MessagesPath /ngx_pagespeed_message;
    pagespeed ConsolePath /pagespeed_console;
    pagespeed AdminPath /pagespeed_admin;
    pagespeed GlobalAdminPath /pagespeed_global_admin;
    pagespeed FileCachePath /var/ngx_pagespeed_cache;
}
# Consultar estadísticas localmente
curl http://localhost:8080/ngx_pagespeed_statistics

# Forzar la invalidación de la caché de una URL específica
curl "http://localhost:8080/ngx_pagespeed_admin?purge_cache"

# Verificar la caché desde los headers HTTP
curl -I https://tudominio.com/ | grep -i "x-page-speed\|cache"

Solución de Problemas

Nginx no arranca tras compilar con PageSpeed:

# Ver el error de inicio
sudo nginx -t

# Verificar que el directorio de caché existe con los permisos correctos
ls -la /var/ngx_pagespeed_cache/

# Crear el directorio si no existe
sudo mkdir -p /var/ngx_pagespeed_cache
sudo chown -R www-data:www-data /var/ngx_pagespeed_cache
chmod 755 /var/ngx_pagespeed_cache

PageSpeed rompe el diseño del sitio:

# Deshabilitar filtros problemáticos gradualmente
# Empieza deshabilitando los filtros de JavaScript y CSS:
pagespeed DisableFilters rewrite_javascript,rewrite_css,combine_javascript

# O desactivar PageSpeed para URLs específicas
pagespeed Disallow "*/admin/*"
pagespeed Disallow "*/api/*"

Las imágenes no se convierten a WebP:

# Verificar que el cliente soporta WebP
curl -H "Accept: image/webp" -I https://tudominio.com/imagen.jpg \
  | grep Content-Type

# Verificar que la librería webp está disponible
sudo apt install -y libwebp-dev webp

Alto uso de memoria:

# Limitar el uso de la caché de PageSpeed
pagespeed FileCacheSizeKb 102400;       # 100MB máximo
pagespeed FileCacheCleanIntervalMs 3600000;  # Limpiar cada hora

# Reducir la complejidad del procesamiento
pagespeed ImageResolutionLimitBytes 1048576;  # Procesar solo imágenes < 1MB

Conclusión

El módulo PageSpeed automatiza las optimizaciones web más impactantes sin necesidad de modificar el código de la aplicación, convirtiendo un servidor estándar en una plataforma de entrega de contenido optimizada. La combinación de optimización de imágenes, minificación de recursos y gestión inteligente de la caché puede reducir los tiempos de carga en un 30-50% en muchos sitios web. Comienza con el nivel CoreFilters y añade filtros adicionales de forma progresiva, verificando que no afectan la funcionalidad del sitio en cada paso.