Setting up Gzip/Brotli compression
Transport-level compression reduces HTML, CSS, JS size 3-10 times. Brotli gives 15-25% better compression than Gzip at same CPU. Setup takes 30 minutes and requires no code changes.
Nginx: Gzip + Brotli
# /etc/nginx/nginx.conf or /etc/nginx/conf.d/compression.conf
# Gzip—supported everywhere
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6; # 1-9, CPU/compression balance; 6 is sweet spot
gzip_min_length 256; # don't compress very small files
gzip_types
application/javascript
application/json
application/xml
application/rss+xml
image/svg+xml
text/css
text/html
text/javascript
text/plain
text/xml
font/woff
font/woff2;
# Brotli—requires ngx_brotli module
# Install: apt install libnginx-mod-brotli
brotli on;
brotli_comp_level 6;
brotli_types
application/javascript
application/json
text/css
text/html
text/plain
image/svg+xml
font/woff2;
Check:
curl -H "Accept-Encoding: br" -I https://example.ru/
# Response should contain: Content-Encoding: br
curl -H "Accept-Encoding: gzip" -I https://example.ru/
# Response: Content-Encoding: gzip
Pre-compressed static assets
For static files (JS, CSS, bundles)—generate .gz and .br files at build, serve directly. No CPU cost per request:
// vite.config.ts
import { defineConfig } from 'vite';
import viteCompression from 'vite-plugin-compression';
export default defineConfig({
plugins: [
viteCompression({ algorithm: 'gzip', ext: '.gz' }),
viteCompression({ algorithm: 'brotliCompress', ext: '.br' }),
]
});
# Nginx: serve pre-compressed files
location ~* \.(js|css|woff2)$ {
gzip_static on; # look for .gz version
brotli_static on; # look for .br version (ngx_brotli module)
expires 1y;
add_header Cache-Control "public, immutable";
}
Apache
# .htaccess
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
AddOutputFilterByType DEFLATE application/json image/svg+xml font/woff2
</IfModule>
Laravel: middleware for API
// Laravel doesn't compress responses by default
// Add middleware in bootstrap/app.php for API
->withMiddleware(function (Middleware $middleware) {
$middleware->api(append: [
\Illuminate\Http\Middleware\GzipResponse::class, // Laravel 11+
]);
})
Or via Nginx—preferred for performance.
Typical compression results
| File | Original | Gzip | Brotli |
|---|---|---|---|
| app.js | 500 KB | 150 KB | 130 KB |
| app.css | 80 KB | 18 KB | 15 KB |
| HTML page | 50 KB | 12 KB | 10 KB |
Setup time: 30 minutes for Nginx configuration.







