ngx_pagespeed 是 Google PageSpeed 優化技術的 Nginx 移植版,作為 Nginx 模組運行,自動重寫網頁資源實現前端性能優化,無需修改應用代碼。
| 類別 | 具體優化 | 效果 |
|---|---|---|
| 資源壓縮 | 圖片無損/有損壓縮、WebP 轉換、CSS/JS 最小化、HTML 壓縮 | 減少 30-70% 傳輸體積 |
| 緩存優化 | 延長緩存時間、資源指紋化、本地存儲緩存 | 提升二次訪問速度 |
| 渲染優化 | CSS 前置、JS 後置、關鍵 CSS 內聯、字體載入優化 | 改善首屏渲染指標 |
| 請求減少 | CSS/JS 合併、圖片 Sprite、Data URI 內聯小資源 | 降低 HTTP 連接數 |
| 移動端優化 | 響應式圖片、AMP 支持、延遲加載 | 適配弱網環境 |
# CentOS/RHEL
yum install -y gcc gcc-c++ make automake autoconf libtool pcre-devel zlib-devel openssl-devel
# Ubuntu/Debian
apt-get install -y build-essential libpcre3-dev zlib1g-dev libssl-dev
NPS_VERSION=1.15.0.0
cd /usr/local/src
wget https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}.tar.gz
tar -xzf v${NPS_VERSION}.tar.gz
cd incubator-pagespeed-ngx-${NPS_VERSION}/
# 下載預編譯優化庫(PSOL)
wget https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}-x64.tar.gz
tar -xzf ${NPS_VERSION}-x64.tar.gz
nginx -V 2>&1 | grep --color=never 'configure arguments:'
# 輸出示例:
# --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module
NGINX_VERSION=1.24.0
wget https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
tar -xzf nginx-${NGINX_VERSION}.tar.gz
cd nginx-${NGINX_VERSION}/
./configure \
--prefix=/usr/local/nginx \
--user=www --group=www \
--with-http_ssl_module --with-http_v2_module --with-http_stub_status_module \
--with-http_gzip_static_module --with-http_realip_module \
--add-module=../incubator-pagespeed-ngx-${NPS_VERSION}
make -j$(nproc)
# 注意:只 make,不要 make install
若遇到 undefined reference to `__sync_add_and_fetch_4':
make clean
./configure ...(原參數) \
--with-cc-opt='-DLINUX=2 -D_REENTRANT -D_LARGEFILE64_SOURCE -march=i686 -pthread'
make -j$(nproc)
# 備份舊二進制
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.$(date +%Y%m%d)
# 替換新二進制
cp objs/nginx /usr/local/nginx/sbin/nginx
# 語法檢查
/usr/local/nginx/sbin/nginx -t
# 平滑升級
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
sleep 3
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
mkdir -p /var/ngx_pagespeed_cache
chown www:www /var/ngx_pagespeed_cache
http {
# 全局啟用
pagespeed on;
pagespeed FileCachePath /var/ngx_pagespeed_cache;
pagespeed FileCacheSizeKb 1048576; # 1GB 緩存上限
pagespeed FileCacheCleanIntervalMs 3600000; # 1 小時清理間隔
pagespeed LRUCacheKbPerProcess 1024;
pagespeed LRUCacheByteLimit 16384;
# 重寫級別:CoreFilters 為推薦基線
pagespeed RewriteLevel CoreFilters;
# 額外啟用的過濾器
pagespeed EnableFilters collapse_whitespace,remove_comments;
pagespeed EnableFilters combine_css,combine_javascript;
pagespeed EnableFilters rewrite_css,rewrite_javascript;
pagespeed EnableFilters prioritize_critical_css,defer_javascript;
pagespeed EnableFilters sprite_images,convert_png_to_jpeg,convert_jpeg_to_webp;
pagespeed EnableFilters resize_images,recompress_images;
pagespeed EnableFilters lazyload_images,insert_image_dimensions;
pagespeed EnableFilters local_storage_cache;
# 統計與管理介面(僅內網訪問)
location /ngx_pagespeed_statistics { allow 127.0.0.1; deny all; }
location /ngx_pagespeed_message { allow 127.0.0.0/8; deny all; }
location /ngx_pagespeed_beacon { }
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; }
location ~ "^/ngx_pagespeed_static/" { }
}
Discuz! 某些版本偽靜態規則與 pagespeed 衝突,需註釋:
# 原規則
if (!-e $request_filename) {
return 404;
}
# 改為
# if (!-e $request_filename) {
# return 404;
# }
curl -I 'https://www.example.com/' | grep X-Page-Speed
# 輸出:X-Page-Speed: 1.15.0.0-xxxx 表示生效
瀏覽器開發者工具 Network 面板觀察:
X-Page-Speed*.pagespeed.*.css/js| 指標 | 影響 | 調優建議 |
|---|---|---|
| CPU 佔用 | +10-30% | 啟用 LRU 緩存、限制緩存大小、關閉高消耗過濾器 |
| 內存佔用 | +50-200MB | 調整 LRUCacheKbPerProcess、使用獨立緩存分區 |
| 首次請求延遲 | +20-100ms | 預熱關鍵頁面、啟用 preload 機制 |
| 磁盤 I/O | 緩存讀寫 | 緩存目錄掛載 tmpfs 或高速 SSD |
rewrite_css、move_css_to_head 測試定位combine_javascript、defer_javascriptresize_images 源圖權限、關閉 sprite_imagesFileCachePath 權限、檢查 pagespeed_statistics 狀態ngx_pagespeed 以「零代碼侵入」實現企業級前端優化,適合歷史項目快速提速、內容型站點降本增效。生產部署建議:灰度發布 → 核心頁面驗證 → 全量開啟 → 持續監控統計介面,根據業務特點微調過濾器組合,實現性能與穩定的平衡。