PageSpeed Module for Nginx and Apache
Google PageSpeed (mod_pagespeed for Apache, ngx_pagespeed for Nginx) automatically optimizes web assets — minifying CSS/JS, compressing images, and applying performance best practices — without changing application code. This guide covers installing PageSpeed for both Nginx and Apache on Linux, configuring filters, and managing the cache.
Prerequisites
- Ubuntu 20.04+/Debian 11+ or CentOS 8+/Rocky Linux 8+
- Nginx or Apache already installed
- Root or sudo access
- At least 512 MB RAM
Installing ngx_pagespeed for Nginx
ngx_pagespeed requires a custom Nginx build or a pre-built package:
# Option 1: Use the pre-compiled Nginx package with PageSpeed (Ubuntu/Debian)
# Add the Nginx mainline repository first
curl -fsSL https://nginx.org/keys/nginx_signing.key | \
sudo gpg --dearmor -o /usr/share/keyrings/nginx.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx.gpg] \
https://nginx.org/packages/mainline/ubuntu $(lsb_release -cs) nginx" | \
sudo tee /etc/apt/sources.list.d/nginx.list
# The standard nginx packages don't include pagespeed
# Build from source instead:
Building Nginx with ngx_pagespeed from source:
# Install build dependencies
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \
libssl-dev libgd-dev libxslt1-dev uuid-dev
# Set variables
NPS_VERSION=1.14.36.1
NGINX_VERSION=$(nginx -v 2>&1 | grep -oP '\d+\.\d+\.\d+')
# Download PageSpeed module
wget "https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}-stable.zip" \
-O ngx_pagespeed.zip
unzip ngx_pagespeed.zip
cd ngx_pagespeed-${NPS_VERSION}-stable
# Download PageSpeed optimization library
psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget "${psol_url}"
tar xzvf $(basename "${psol_url}")
cd ..
# Download Nginx source matching your installed version
wget "http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
tar xvf nginx-${NGINX_VERSION}.tar.gz
cd nginx-${NGINX_VERSION}
# Configure and build (add your existing --add-module flags)
./configure \
--add-dynamic-module=$(pwd)/../ngx_pagespeed-${NPS_VERSION}-stable \
$(nginx -V 2>&1 | grep 'configure arguments' | sed 's/.*configure arguments: //')
make modules
sudo cp objs/ngx_pagespeed.so /etc/nginx/modules/
Load the module:
# Add to /etc/nginx/nginx.conf at the top
sudo tee -a /etc/nginx/modules-enabled/pagespeed.conf << 'EOF'
load_module modules/ngx_pagespeed.so;
EOF
Nginx PageSpeed Configuration
# Create the PageSpeed cache directory
sudo mkdir -p /var/cache/ngx_pagespeed
sudo chown www-data:www-data /var/cache/ngx_pagespeed
Add to your server block:
server {
listen 443 ssl;
server_name www.yourdomain.com;
# Enable PageSpeed
pagespeed on;
pagespeed FileCachePath /var/cache/ngx_pagespeed;
# Required for the admin interface and beacon
pagespeed Statistics on;
pagespeed StatisticsLogging on;
pagespeed LogDir /var/log/pagespeed;
pagespeed AdminPath /pagespeed_admin;
# Rewrite level (CoreFilters is a good starting point)
pagespeed RewriteLevel CoreFilters;
# Enable specific additional filters
pagespeed EnableFilters combine_css;
pagespeed EnableFilters combine_javascript;
pagespeed EnableFilters inline_images;
pagespeed EnableFilters lazyload_images;
pagespeed EnableFilters convert_jpeg_to_webp;
pagespeed EnableFilters convert_png_to_jpeg;
# Respect no-transform cache headers
pagespeed DisableRewriteOnNoTransform on;
# Required Nginx config for PageSpeed
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
add_header "" "";
}
location ~ "^/pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon$" { }
# Restrict admin panel to localhost
location /pagespeed_admin {
allow 127.0.0.1;
deny all;
}
}
sudo nginx -t
sudo systemctl reload nginx
Installing mod_pagespeed for Apache
Apache's mod_pagespeed has official pre-built packages:
# Ubuntu/Debian
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 install -f -y # Resolve any dependencies
# Enable the module
sudo a2enmod pagespeed
sudo apachectl -M | grep pagespeed # Verify it's loaded
For CentOS/Rocky:
wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm
sudo rpm -U mod-pagespeed-stable_current_x86_64.rpm
sudo systemctl restart httpd
Apache PageSpeed Configuration
Edit the PageSpeed configuration:
sudo nano /etc/apache2/mods-available/pagespeed.conf
<IfModule pagespeed_module>
ModPagespeed on
ModPagespeedFileCachePath /var/cache/mod_pagespeed/
# Logging
ModPagespeedLogDir /var/log/mod_pagespeed
# Use CoreFilters plus extras
ModPagespeedRewriteLevel CoreFilters
# Additional filters
ModPagespeedEnableFilters combine_css
ModPagespeedEnableFilters combine_javascript
ModPagespeedEnableFilters convert_jpeg_to_webp
ModPagespeedEnableFilters convert_png_to_jpeg
ModPagespeedEnableFilters lazyload_images
ModPagespeedEnableFilters inline_css
# Image compression quality
ModPagespeedJpegQualityLevel 85
ModPagespeedWebpQualityLevel 80
# Disable for certain paths
<Location /admin>
ModPagespeed off
</Location>
</IfModule>
sudo apachectl configtest
sudo systemctl reload apache2
Image Optimization Filters
PageSpeed offers several image optimization filters:
# Nginx - image optimization settings
pagespeed EnableFilters rewrite_images;
pagespeed EnableFilters convert_jpeg_to_webp;
pagespeed EnableFilters convert_png_to_jpeg;
pagespeed EnableFilters strip_image_metadata;
pagespeed EnableFilters resize_images;
pagespeed EnableFilters inline_images; # Inline small images as data URIs
# Set image quality
pagespeed JpegQualityLevel 85;
pagespeed WebpQualityLevel 80;
pagespeed JpegRecompressionQuality 85;
# Image resampling
pagespeed EnableFilters resize_rendered_image_dimensions;
# Apache - same filters
ModPagespeedEnableFilters rewrite_images
ModPagespeedEnableFilters convert_jpeg_to_webp
ModPagespeedEnableFilters strip_image_metadata
ModPagespeedJpegQualityLevel 85
ModPagespeedWebpQualityLevel 80
CSS and JavaScript Optimization
# Nginx - CSS/JS optimization
pagespeed EnableFilters rewrite_css;
pagespeed EnableFilters rewrite_javascript;
pagespeed EnableFilters combine_css;
pagespeed EnableFilters combine_javascript;
pagespeed EnableFilters move_css_above_scripts;
pagespeed EnableFilters move_css_to_head;
# Minification
pagespeed EnableFilters rewrite_javascript_external;
pagespeed EnableFilters rewrite_javascript_inline;
# Deferred JavaScript loading
pagespeed EnableFilters defer_javascript;
Cache Management
PageSpeed maintains its own file cache for optimized assets:
# Create cache directory with proper permissions
sudo mkdir -p /var/cache/ngx_pagespeed
sudo chown www-data:www-data /var/cache/ngx_pagespeed
sudo chmod 750 /var/cache/ngx_pagespeed
# Flush PageSpeed cache (force re-optimization)
# For Nginx:
sudo find /var/cache/ngx_pagespeed -type f -delete
# For Apache:
sudo mod_pagespeed_clear_cache # Or:
sudo find /var/cache/mod_pagespeed -type f -delete
sudo systemctl reload apache2
Set cache TTL in the config:
# Keep optimized assets for 1 hour in browser cache
pagespeed ModifyCachingHeaders on;
pagespeed DefaultSharedMemoryCacheKB 100;
pagespeed FileCacheSizeKb 102400; # 100 MB file cache
pagespeed FileCacheCleanIntervalMs 3600000; # Clean every hour
Troubleshooting
PageSpeed module not loading:
# Nginx: check error log
nginx -t 2>&1
journalctl -u nginx | grep pagespeed
# Apache: check if module is loaded
apache2ctl -M | grep pagespeed
tail -50 /var/log/apache2/error.log | grep pagespeed
Images not being converted to WebP:
PageSpeed only serves WebP to browsers that send the Accept: image/webp header. Verify with:
curl -H "Accept: image/webp,*/*" -I https://yourdomain.com/image.jpg | grep Content-Type
Page layout breaks after enabling PageSpeed:
Disable aggressive filters one at a time:
pagespeed DisableFilters defer_javascript;
pagespeed DisableFilters combine_javascript;
Cache directory filling up disk:
pagespeed FileCacheSizeKb 51200; # Limit to 50 MB
pagespeed FileCacheCleanIntervalMs 3600000; # Clean hourly
Conclusion
PageSpeed modules provide server-level performance optimization that works across any web application without code changes. Start with RewriteLevel CoreFilters, verify your site looks and functions correctly, then enable additional filters incrementally. The WebP conversion and JavaScript combination filters typically deliver the largest performance gains for most sites. Monitor your PageSpeed score in Google Lighthouse before and after to quantify improvements.


