---
title: "Cómo activar Gzip y Brotli en Nginx y Apache en Ubuntu 24.04"
description: "Activa la compresión Gzip y Brotli en Nginx y Apache en Ubuntu 24.04, elige qué tipos comprimir y comprueba con curl que las respuestas llegan comprimidas."
category: "Optimización de Rendimiento"
language: es
source: https://cubepath.com/es/docs/optimización-de-rendimiento/compresion-gzip-brotli-en-apache-y-nginx
updated: 2026-09-25
---
# Cómo activar Gzip y Brotli en Nginx y Apache en Ubuntu 24.04
Comprimir las respuestas de texto (HTML, CSS, JavaScript, JSON, SVG) reduce su tamaño entre un 60 % y un 90 %, con lo que las páginas cargan antes y se consume menos ancho de banda. Todos los navegadores actuales admiten Gzip y Brotli, y este último consigue ficheros algo más pequeños con un coste de CPU similar. En este tutorial activarás Gzip y Brotli en Nginx y en Apache sobre Ubuntu 24.04 y comprobarás con `curl` qué codificación sirve el servidor en cada caso. Sigue solo la parte del servidor web que uses.
## Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
- Un usuario no root con privilegios `sudo`.
- Nginx (`sudo apt install nginx`) o Apache (`sudo apt install apache2`) instalado y sirviendo una web.
- `curl` para las comprobaciones (viene instalado por defecto).
## Qué comprimir y qué no
La compresión solo tiene sentido para formatos de texto. Las imágenes JPEG, PNG y WebP, los vídeos, los ficheros ZIP y las fuentes WOFF2 ya están comprimidos, y volver a comprimirlos gasta CPU sin reducir su tamaño. Los tipos MIME que conviene comprimir son:
| Tipo de contenido | Tipos MIME |
|-------------------|------------|
| HTML | `text/html` |
| Hojas de estilo | `text/css` |
| JavaScript | `text/javascript`, `application/javascript` |
| Datos | `application/json`, `application/xml`, `text/xml`, `application/rss+xml` |
| Texto plano | `text/plain` |
| Gráficos vectoriales | `image/svg+xml` |
Tampoco merece la pena comprimir respuestas muy pequeñas: por debajo de unos cientos de bytes, la cabecera de compresión puede ocupar más de lo que se ahorra.
## Nginx
### Paso 1: Configurar Gzip
Nginx en Ubuntu trae el módulo gzip y lo activa en `/etc/nginx/nginx.conf` con `gzip on;`, pero con la configuración por defecto solo comprime `text/html`. Las demás opciones aparecen comentadas en ese fichero. En lugar de editarlo, crea un fichero propio en `conf.d`, que Nginx carga dentro del bloque `http`:
```bash
sudo nano /etc/nginx/conf.d/compression.conf
```
```nginx
# Gzip (gzip on ya está en nginx.conf)
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml;
```
Qué hace cada directiva:
- `gzip_vary on`: añade la cabecera `Vary: Accept-Encoding` para que las cachés intermedias y las CDN guarden por separado la versión comprimida y la sin comprimir.
- `gzip_proxied any`: comprime también las respuestas a peticiones que llegan a través de un proxy o CDN.
- `gzip_comp_level 5`: nivel de 1 a 9. A partir de 5 o 6 la reducción de tamaño es mínima y el coste de CPU sigue subiendo.
- `gzip_min_length 256`: no comprime respuestas de menos de 256 bytes.
- `gzip_types`: tipos MIME a comprimir, además de `text/html`, que se comprime siempre.
No declares ninguna de estas directivas también en `nginx.conf` sin comentar, o Nginx dará un error de directiva duplicada.
Comprueba la configuración y recarga:
```bash
sudo nginx -t
sudo systemctl reload nginx
```
```output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```
### Paso 2: Instalar y configurar Brotli
Ubuntu 24.04 incluye el módulo de Brotli para Nginx en dos paquetes: `libnginx-mod-http-brotli-filter`, que comprime al vuelo, y `libnginx-mod-http-brotli-static`, que sirve ficheros `.br` precomprimidos. Instálalos:
```bash
sudo apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static
```
Los paquetes cargan los módulos automáticamente mediante enlaces en `/etc/nginx/modules-enabled/`:
```bash
ls /etc/nginx/modules-enabled/
```
```output
50-mod-http-brotli-filter.conf
50-mod-http-brotli-static.conf
```
Añade la configuración de Brotli al mismo fichero `compression.conf`:
```bash
sudo nano /etc/nginx/conf.d/compression.conf
```
```nginx
# Brotli
brotli on;
brotli_comp_level 5;
brotli_min_length 256;
brotli_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml;
# Servir ficheros precomprimidos .br y .gz si existen junto al original
brotli_static on;
gzip_static on;
```
Cuando el navegador acepta ambos formatos, Nginx sirve Brotli; los clientes que solo admiten Gzip siguen recibiendo Gzip. Con `brotli_static` y `gzip_static`, si existe `app.js.br` o `app.js.gz` junto a `app.js`, Nginx envía directamente el fichero precomprimido sin gastar CPU. Muchas herramientas de build de frontend pueden generar estos ficheros.
Comprueba y recarga:
```bash
sudo nginx -t
sudo systemctl reload nginx
```
## Apache
### Paso 1: Revisar Gzip (mod_deflate)
En Apache la compresión Gzip la hace `mod_deflate`, que en Ubuntu viene activado por defecto con una lista de tipos en `/etc/apache2/mods-available/deflate.conf`. Compruébalo:
```bash
apache2ctl -M | grep -E 'deflate|filter'
```
```output
deflate_module (shared)
filter_module (shared)
```
Si solo necesitas Gzip, ya lo tienes funcionando y puedes pasar a la sección de verificación.
### Paso 2: Activar Brotli (mod_brotli)
El módulo `mod_brotli` viene incluido en el paquete `apache2` de Ubuntu 24.04, pero desactivado. Actívalo:
```bash
sudo a2enmod brotli
```
Hay un detalle importante: si dejas la configuración de `deflate.conf` tal como está y añades Brotli por separado, Apache aplica primero Gzip y el navegador nunca recibe Brotli. La solución es declarar ambos filtros en una sola directiva, en el orden `BROTLI_COMPRESS;DEFLATE`: Brotli comprime si el cliente lo admite y, si no, lo hace Gzip.
Primero desactiva las líneas por defecto de `deflate.conf`:
```bash
sudo nano /etc/apache2/mods-available/deflate.conf
```
Comenta las líneas `AddOutputFilterByType` para que el fichero quede así:
```apache
# AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
# AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript
# AddOutputFilterByType DEFLATE application/rss+xml
# AddOutputFilterByType DEFLATE application/wasm
# AddOutputFilterByType DEFLATE application/xml
```
Después crea un fichero de configuración propio con los dos filtros encadenados:
```bash
sudo nano /etc/apache2/conf-available/compression.conf
```
```apache
AddOutputFilterByType BROTLI_COMPRESS;DEFLATE text/html text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml image/svg+xml
BrotliCompressionQuality 5
```
`BrotliCompressionQuality` va de 0 a 11 y por defecto es 5, un buen equilibrio para compresión al vuelo. Los valores altos (10 u 11) son muy lentos y solo tienen sentido para ficheros precomprimidos.
Activa la configuración, comprueba la sintaxis y recarga Apache:
```bash
sudo a2enconf compression
sudo apache2ctl configtest
sudo systemctl reload apache2
```
```output
Syntax OK
```
## Verificar la compresión
La comprobación es la misma para Nginx y Apache. Pide una página indicando qué codificaciones acepta el cliente con la cabecera `Accept-Encoding` y mira la cabecera `Content-Encoding` de la respuesta. Sustituye `your_domain` por tu dominio o la IP del servidor.
Un cliente que acepta Gzip y Brotli, como cualquier navegador moderno, debe recibir Brotli:
```bash
curl -s -o /dev/null -D - -H 'Accept-Encoding: gzip, deflate, br' http://your_domain/ | grep -i -E 'content-encoding|vary'
```
```output
Vary: Accept-Encoding
Content-Encoding: br
```
Un cliente que solo acepta Gzip debe recibir Gzip:
```bash
curl -s -o /dev/null -D - -H 'Accept-Encoding: gzip' http://your_domain/ | grep -i -E 'content-encoding|vary'
```
```output
Vary: Accept-Encoding
Content-Encoding: gzip
```
Para ver el ahorro, compara los bytes descargados sin compresión y con Brotli:
```bash
curl -s -o /dev/null -w 'sin compresión: %{size_download} bytes\n' http://your_domain/
curl -s -o /dev/null -w 'brotli: %{size_download} bytes\n' -H 'Accept-Encoding: br' http://your_domain/
```
```output
sin compresión: 10671 bytes
brotli: 2722 bytes
```
Repite la prueba con un fichero CSS o JavaScript de tu web, por ejemplo `http://your_domain/assets/app.css`. También puedes comprobarlo en el navegador: en las herramientas de desarrollo, pestaña **Red**, la columna o cabecera `Content-Encoding` muestra `br` o `gzip` para cada recurso.
## Solución de problemas
- **No aparece `Content-Encoding`**: la respuesta es más pequeña que el mínimo configurado o su tipo MIME no está en la lista. Comprueba el tipo con `curl -sI http://your_domain/ruta | grep -i content-type`.
- **Apache sirve Gzip aunque el cliente acepta Brotli**: siguen activas las líneas `AddOutputFilterByType DEFLATE` de `deflate.conf` u otra directiva `DEFLATE` en tus virtual hosts o en un `.htaccess`. Elimínalas y deja solo la cadena `BROTLI_COMPRESS;DEFLATE`.
- **`unknown directive "brotli"` en Nginx**: el módulo no está cargado. Comprueba que los paquetes están instalados y que existen los enlaces en `/etc/nginx/modules-enabled/`.
- **Detrás de Cloudflare u otra CDN**: la CDN puede recomprimir o descomprimir las respuestas hacia el visitante. Comprueba las cabeceras directamente contra la IP del servidor para aislar el comportamiento de tu origen.
- **Uso de CPU alto**: baja `gzip_comp_level`, `brotli_comp_level` o `BrotliCompressionQuality`, y sirve ficheros estáticos precomprimidos cuando sea posible.
## Conclusión
Tu servidor web comprime ahora las respuestas de texto con Brotli para los navegadores que lo admiten y con Gzip para el resto, y sabes comprobarlo con `curl`. Como siguientes pasos, configura cabeceras de caché del navegador para los ficheros estáticos, activa HTTP/2 junto con HTTPS y mide el efecto de cada cambio con Apache Bench o con las herramientas de desarrollo del navegador.