---
title: "PageSpeed en Nginx y Apache: alternativas en Ubuntu 24.04"
description: "mod_pagespeed y ngx_pagespeed están abandonados. Retíralos y replica sus optimizaciones en Nginx y Apache con Brotli, caché de estáticos, WebP y carga diferida."
category: "Rendimiento Web"
language: es
source: https://cubepath.com/es/docs/rendimiento-web/modulo-pagespeed-para-nginx-y-apache
updated: 2026-09-25
---
# PageSpeed en Nginx y Apache: alternativas en Ubuntu 24.04
El módulo PageSpeed de Google (`mod_pagespeed` para Apache y `ngx_pagespeed` para Nginx) reescribía las páginas al vuelo para comprimir, minificar y convertir imágenes. El proyecto dejó de mantenerse: Google abandonó el desarrollo y el proyecto de la Apache Software Foundation se retiró en 2023, así que no hay versiones para el Nginx de Ubuntu 24.04 ni parches de seguridad. En esta guía verás cómo retirarlo si aún lo tienes y cómo obtener las mismas mejoras con herramientas mantenidas en Nginx o Apache sobre Ubuntu 24.04.
## Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
- Un usuario no root con privilegios `sudo`.
- Nginx (paquete `nginx` de Ubuntu) o Apache (`apache2`) sirviendo tu sitio en `tudominio.com`.
## Por qué no instalar PageSpeed hoy
| Optimización de PageSpeed | Alternativa mantenida |
|---------------------------|-----------------------|
| Compresión (gzip) | gzip y Brotli nativos del servidor web |
| `extend_cache` | Cabeceras `Cache-Control` largas con nombres de archivo versionados |
| `rewrite_css`, `rewrite_javascript`, `combine_*` | Minificación en el proceso de build (Vite, esbuild, webpack) |
| `recompress_images`, `convert_*_to_webp` | Conversión previa con `cwebp` y negociación por cabecera `Accept` |
| `lazyload_images` | Atributo HTML nativo `loading="lazy"` |
Hacer estas tareas antes de servir la página, en lugar de en cada petición, consume menos CPU y memoria y no rompe el HTML, que era el problema más habitual de PageSpeed.
## Paso 1: Retirar PageSpeed si está instalado
En Apache, comprueba si el módulo está cargado:
```bash
sudo apache2ctl -M | grep pagespeed
```
Si aparece `pagespeed_module`, desactívalo y elimina el paquete y su repositorio:
```bash
sudo a2dismod pagespeed
sudo apt purge mod-pagespeed-stable
sudo rm -f /etc/apt/sources.list.d/mod-pagespeed.list
sudo systemctl restart apache2
```
En Nginx, `ngx_pagespeed` solo existía compilado a mano. Comprueba si tu binario lo incluye:
```bash
nginx -V 2>&1 | grep -o pagespeed
```
Si aparece, reinstala el paquete de Ubuntu para volver al binario oficial y elimina las directivas `pagespeed` de tu configuración:
```bash
sudo apt install --reinstall nginx
sudo grep -rl pagespeed /etc/nginx/
```
Edita cada archivo que devuelva el último comando, borra las líneas que empiezan por `pagespeed` y comprueba la configuración con `sudo nginx -t`.
## Paso 2: Activar compresión Brotli y gzip
Brotli comprime HTML, CSS y JavaScript entre un 15 y un 20 % más que gzip y lo soportan todos los navegadores actuales. Mantén gzip para clientes antiguos.
### Nginx
Instala los módulos de Brotli empaquetados en Ubuntu:
```bash
sudo apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static
```
El paquete los activa en `/etc/nginx/modules-enabled/`. Crea un archivo de compresión que se incluirá en el bloque `http`:
```bash
sudo nano /etc/nginx/conf.d/compression.conf
```
```nginx
# gzip ya está activado con "gzip on;" en nginx.conf: no lo repitas aquí
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;
brotli on;
brotli_comp_level 5;
brotli_min_length 256;
brotli_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;
```
`text/html` se comprime siempre y no debe aparecer en las listas. Comprueba y recarga:
```bash
sudo nginx -t
sudo systemctl reload nginx
```
### Apache
Ubuntu incluye `mod_brotli` y `mod_deflate`. Activa Brotli:
```bash
sudo a2enmod brotli
sudo nano /etc/apache2/conf-available/brotli.conf
```
```apache
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml
```
```bash
sudo a2enconf brotli
sudo apache2ctl configtest
sudo systemctl reload apache2
```
### Verificación
Pide una página anunciando soporte de Brotli:
```bash
curl -s -o /dev/null -D - -H "Accept-Encoding: br, gzip" https://tudominio.com/ | grep -i content-encoding
```
```output
content-encoding: br
```
## Paso 3: Cabeceras de caché para estáticos
El filtro `extend_cache` de PageSpeed renombraba los recursos para poder cachearlos durante un año. Si tu build ya genera nombres con hash (`app.3f9a1c.js`), basta con enviar una cabecera de caché larga.
### Nginx
Añade este bloque dentro del `server` de tu sitio, en `/etc/nginx/sites-available/tudominio.com`:
```nginx
location ~* \.(css|js|mjs|woff2|svg|png|jpe?g|gif|webp|avif|ico)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
access_log off;
try_files $uri =404;
}
```
### Apache
Activa `mod_expires` y `mod_headers`:
```bash
sudo a2enmod expires headers
```
Añade dentro del `` de tu sitio:
```apache
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header set Cache-Control "public, max-age=31536000, immutable"
```
Recarga el servidor y verifica sobre un recurso real:
```bash
curl -sI https://tudominio.com/css/app.css | grep -i cache-control
```
```output
cache-control: public, max-age=31536000, immutable
```
> Importante: usa `immutable` solo con archivos cuyo nombre cambia en cada versión. Si publicas siempre `style.css` con el mismo nombre, reduce el tiempo (por ejemplo `max-age=3600`) o los visitantes verán la versión antigua.
## Paso 4: Servir imágenes WebP
En lugar de convertir en cada petición, genera la versión WebP junto al original una vez y deja que el servidor elija según la cabecera `Accept` del navegador. Instala el conversor:
```bash
sudo apt install webp
```
Convierte las imágenes del sitio creando `foto.jpg.webp` junto a `foto.jpg`:
```bash
find /var/www/tudominio.com/images -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) \
-exec sh -c 'cwebp -quiet -q 80 "$1" -o "$1.webp"' _ {} \;
```
En Nginx, crea el mapa que decide el sufijo:
```bash
sudo nano /etc/nginx/conf.d/webp.conf
```
```nginx
map $http_accept $webp_suffix {
default "";
"~*image/webp" ".webp";
}
```
Y en el `server` de tu sitio, coloca este bloque antes del de estáticos del paso 3:
```nginx
location ~* \.(jpe?g|png)$ {
add_header Vary Accept;
add_header Cache-Control "public, max-age=2592000";
try_files $uri$webp_suffix $uri =404;
}
```
Recarga Nginx y comprueba que un navegador con soporte WebP recibe la versión convertida:
```bash
sudo nginx -t && sudo systemctl reload nginx
curl -sI -H "Accept: image/webp" https://tudominio.com/images/foto.jpg | grep -i content-type
```
```output
content-type: image/webp
```
Para automatizar la conversión de las imágenes nuevas y añadir AVIF, consulta la guía de pipeline de optimización de imágenes.
## Paso 5: Minificar y aplicar carga diferida en origen
La minificación y la combinación de CSS y JavaScript deben hacerse al compilar el frontend: herramientas como Vite o esbuild ya minifican en modo producción (`npm run build`). En sitios PHP como WordPress, un plugin de caché o de optimización cumple la misma función.
Para la carga diferida de imágenes, añade el atributo nativo en las plantillas en lugar de reescribir el HTML en el servidor:
```html
```
Indicar `width` y `height` reserva el espacio de la imagen y evita saltos de diseño (CLS). No uses `loading="lazy"` en la imagen principal visible al cargar, porque retrasaría el LCP.
## Solución de problemas
**`nginx: [emerg] "gzip" directive is duplicate`.** Has escrito `gzip on;` en un archivo de `conf.d`, pero ya está en `/etc/nginx/nginx.conf`. Elimina la línea duplicada.
**`unknown directive "brotli"`.** Los módulos no se cargan. Comprueba que existen los enlaces en `/etc/nginx/modules-enabled/` con `ls /etc/nginx/modules-enabled/ | grep brotli`.
**Las imágenes siguen llegando como JPEG.** Verifica que existe `foto.jpg.webp` en disco y que ningún otro `location` con regex anterior captura la petición: Nginx usa el primer bloque regex que coincide.
## Conclusión
Has retirado un módulo sin mantenimiento y has cubierto sus optimizaciones principales con compresión Brotli, cabeceras de caché, WebP negociado y carga diferida nativa, todo con paquetes de Ubuntu que reciben actualizaciones. Como siguientes pasos, mide el resultado con PageSpeed Insights, activa HTTP/3 en tu servidor web y automatiza la conversión de imágenes con un temporizador de systemd.