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.