最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx中fastcgi_cache實(shí)現(xiàn)PHP頁(yè)面緩存加速

 更新時(shí)間:2026年04月20日 09:27:42   作者:冰川箭仙  
Nginx使用cgi_cache緩存PHP生成的動(dòng)態(tài)頁(yè)面,降低后端負(fù)載并提升響應(yīng)速度,配置方案包括緩存控制、自定義緩存時(shí)間、緩存清理等等關(guān)鍵響應(yīng)頭,感興趣的可以了解一下

在 Nginx 中使用 fastcgi_cache 可以緩存 PHP-FPM 生成的動(dòng)態(tài)頁(yè)面,顯著降低后端負(fù)載并提升響應(yīng)速度。以下是完整的配置方案和優(yōu)化技巧。

核心配置架構(gòu)

用戶請(qǐng)求 → Nginx → 檢查緩存 → [命中] 直接返回緩存
                     ↓
              [未命中] → PHP-FPM → 生成頁(yè)面 → 存入緩存 → 返回用戶

基礎(chǔ)配置

1. http 塊(全局配置)

http {
    # 定義緩存區(qū)
    fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=PHPCACHE:100m max_size=1g inactive=60m use_temp_path=off;
    # 緩存鍵定義(區(qū)分 URI 和參數(shù))
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    # 默認(rèn)緩存時(shí)間
    fastcgi_cache_valid 200 302 10m;
    fastcgi_cache_valid 404 1m;
    # 日志格式(可選,用于調(diào)試緩存命中率)
    log_format cache_log '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         'cache:$upstream_cache_status';
}

2. server/location 塊(站點(diǎn)配置)

server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.php;

    # PHP 請(qǐng)求處理
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # ========== 緩存核心配置 ==========
        
        # 啟用緩存并指定緩存區(qū)
        fastcgi_cache PHPCACHE;
        
        # 緩存條件:僅對(duì)登錄用戶以外的請(qǐng)求緩存
        fastcgi_cache_bypass $cookie_session;      # 有 session cookie 時(shí)不讀緩存
        fastcgi_no_cache $cookie_session;          # 有 session cookie 時(shí)不寫緩存
        
        # 或者根據(jù)自定義 header 控制(如管理員后臺(tái)不緩存)
        fastcgi_cache_bypass $http_pragma;
        fastcgi_no_cache $http_authorization;
        
        # 緩存狀態(tài)頭(調(diào)試用,生產(chǎn)環(huán)境可移除)
        add_header X-Cache-Status $upstream_cache_status;
        
        # 緩存鎖定(防止緩存失效時(shí)的并發(fā)穿透)
        fastcgi_cache_lock on;
        fastcgi_cache_lock_timeout 5s;
        
        # 后臺(tái)更新(舊緩存過(guò)期時(shí),先返回舊數(shù)據(jù),后臺(tái)異步更新)
        fastcgi_cache_background_update on;
        
        # 使用 stale 緩存(后端故障時(shí)返回過(guò)期緩存)
        fastcgi_cache_use_stale error timeout invalid_header updating http_500;
    }

    # 靜態(tài)文件不經(jīng)過(guò) PHP
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        access_log off;
    }
}

緩存控制策略詳解

按 Cookie 排除(用戶登錄狀態(tài))

# 如果有 wordpress_logged_in cookie 就不緩存(WordPress 場(chǎng)景)
fastcgi_cache_bypass $cookie_wordpress_logged_in;
fastcgi_no_cache $cookie_wordpress_logged_in;
# 多條件組合(任一滿足即不緩存)
set $skip_cache 0;
if ($cookie_session) { set $skip_cache 1; }
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($http_authorization) { set $skip_cache 1; }
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;

按 URL 排除(后臺(tái)管理、API)

location ~ /wp-admin|/wp-login|/api/ {
    fastcgi_cache off;  # 完全禁用緩存
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
}

自定義緩存時(shí)間(按頁(yè)面類型)

location ~ \.php$ {
    fastcgi_cache PHPCACHE;
    # 首頁(yè)緩存 5 分鐘
    if ($request_uri = /) {
        set $cache_time 5m;
    }
    # 文章頁(yè)緩存 1 小時(shí)
    if ($request_uri ~ ^/post/) {
        set $cache_time 1h;
    }
    # 默認(rèn) 10 分鐘
    if ($cache_time = "") {
        set $cache_time 10m;
    }
    fastcgi_cache_valid 200 $cache_time;
}

緩存清理方案

方案 1:使用 ngx_cache_purge 模塊(需編譯安裝)

# 編譯時(shí)添加 --add-module=ngx_cache_purge
location ~ /purge(/.*) {
    allow 127.0.0.1;      # 僅允許本地訪問(wèn)
    deny all;
    fastcgi_cache_purge PHPCACHE "$scheme$request_method$host$1";
}

方案 2:腳本手動(dòng)清理

#!/bin/bash
# /usr/local/bin/clear-php-cache.sh
CACHE_DIR="/var/cache/nginx/fastcgi"
TARGET="$1"
if [ -z "$TARGET" ]; then
    # 清理全部緩存
    rm -rf ${CACHE_DIR}/*
    echo "All cache cleared"
else
    # 根據(jù) URL 計(jì)算緩存文件路徑(匹配 fastcgi_cache_key)
    KEY="$scheme$request_method$host$TARGET"
    MD5=$(echo -n "$KEY" | md5sum | awk '{print $1}')
    LEVEL1=${MD5: -1}
    LEVEL2=${MD5: -3:2}
    rm -f "${CACHE_DIR}/${LEVEL1}/${LEVEL2}/${MD5}"
    echo "Cache for $TARGET cleared"
fi
# 重載 Nginx 使更改生效(或發(fā)送信號(hào))
kill -HUP $(cat /var/run/nginx.pid)

生產(chǎn)環(huán)境優(yōu)化配置

http {
    # 緩存路徑優(yōu)化:SSD 建議用 levels=1:2,機(jī)械硬盤用 levels=1:2:3
    fastcgi_cache_path /var/cache/nginx/fastcgi 
        levels=1:2 
        keys_zone=PHPCACHE:256m  # 內(nèi)存中存儲(chǔ) 256MB 的鍵
        max_size=10g             # 磁盤最大 10GB
        inactive=7d              # 7 天未訪問(wèn)則清理
        use_temp_path=off        # 直接寫入目標(biāo)目錄,減少 IO
        manager_files=10000      # 每次清理最多處理 10000 文件
        manager_sleep=50ms       # 清理間隔
        manager_threshold=200ms; # 單次清理最大耗時(shí)
    # 忽略后端設(shè)置的緩存控制頭(強(qiáng)制按 Nginx 配置緩存)
    fastcgi_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
    # 隱藏后端版本信息
    fastcgi_hide_header X-Powered-By;
    fastcgi_hide_header Server;
}
server {
    location ~ \.php$ {
        fastcgi_cache PHPCACHE;
        fastcgi_cache_valid 200 5m;
        # 微緩存(Microcache):極短時(shí)間的緩存,應(yīng)對(duì)突發(fā)流量
        fastcgi_cache_valid 200 1s;  # 1 秒內(nèi)相同請(qǐng)求直接返回緩存
        # 緩存鍵增加設(shè)備類型(桌面/移動(dòng)端分開緩存)
        fastcgi_cache_key "$scheme$request_method$host$request_uri$http_user_agent";
    }
}

監(jiān)控與調(diào)試

查看緩存命中率

# 查看緩存目錄統(tǒng)計(jì)
find /var/cache/nginx/fastcgi -type f | wc -l
# 實(shí)時(shí)查看緩存狀態(tài)頭
curl -I http://example.com/page.php
# 檢查響應(yīng)頭中的 X-Cache-Status: HIT / MISS / BYPASS / EXPIRED
# 分析日志統(tǒng)計(jì)命中率
awk '{print $NF}' /var/log/nginx/access.log | sort | uniq -c

關(guān)鍵響應(yīng)頭說(shuō)明

狀態(tài)含義
HIT緩存命中,直接返回
MISS緩存未命中,已寫入新緩存
BYPASS跳過(guò)緩存(如帶有 Cookie)
EXPIRED緩存過(guò)期,已重新獲取
UPDATING緩存過(guò)期,但返回舊數(shù)據(jù)(后臺(tái)更新中)
STALE返回過(guò)期緩存(后端故障時(shí))

完整 WordPress 優(yōu)化示例

fastcgi_cache_path /var/cache/nginx/wp levels=1:2 keys_zone=WPCACHE:150m max_size=2g inactive=48h;
server {
    set $skip_cache 0;
    # 不緩存的條件
    if ($request_method = POST) { set $skip_cache 1; }
    if ($query_string != "") { set $skip_cache 1; }
    if ($cookie_woocommerce_items_in_cart) { set $skip_cache 1; }  # WooCommerce
    if ($cookie_wordpress_logged_in) { set $skip_cache 1; }
    if ($request_uri ~* "/wp-admin/|/wp-login|/cart|/checkout|/my-account") { set $skip_cache 1; }
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_cache WPCACHE;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache_lock on;
        fastcgi_cache_use_stale updating error timeout;
        add_header X-Cache-Status $upstream_cache_status;
    }
}

配置完成后,使用 nginx -t 檢查語(yǔ)法,然后 systemctl reload nginx 生效。建議先用小流量測(cè)試,確認(rèn)緩存邏輯符合預(yù)期后再全量上線。

到此這篇關(guān)于Nginx中fastcgi_cache實(shí)現(xiàn)PHP頁(yè)面緩存加速的文章就介紹到這了,更多相關(guān)Nginx PHP頁(yè)面緩存加速內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx進(jìn)程調(diào)度問(wèn)題詳解

    Nginx進(jìn)程調(diào)度問(wèn)題詳解

    Nginx采用的是固定數(shù)量的多進(jìn)程模型,由一個(gè)主進(jìn)程(MasterProcess)和數(shù)量與主機(jī)CPU核數(shù)相同的工作進(jìn)程協(xié)同處理各種事件。這篇文章主要介紹了Nginx進(jìn)程調(diào)度問(wèn)題,需要的朋友可以參考下
    2021-09-09
  • Nginx 多站點(diǎn)配置實(shí)例詳解

    Nginx 多站點(diǎn)配置實(shí)例詳解

    這篇文章主要介紹了Nginx 多站點(diǎn)配置實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 通過(guò)Nginx實(shí)現(xiàn)前端與后端的協(xié)同部署

    通過(guò)Nginx實(shí)現(xiàn)前端與后端的協(xié)同部署

    在現(xiàn)代 web 開發(fā)中,前端與后端的協(xié)同部署是一個(gè)關(guān)鍵問(wèn)題,一個(gè)高效的部署策略不僅能提升用戶體驗(yàn),還能簡(jiǎn)化開發(fā)流程,今天,我們就來(lái)探討如何利用 Nginx 實(shí)現(xiàn)前端與后端的協(xié)同部署,需要的朋友可以參考下
    2025-03-03
  • Nginx流量拷貝ngx_http_mirror_module模塊使用方法詳解

    Nginx流量拷貝ngx_http_mirror_module模塊使用方法詳解

    這篇文章主要介紹了Nginx流量拷貝,Nginx專門提供了ngx_http_mirror_module模塊,用來(lái)實(shí)現(xiàn)流量拷貝。將生產(chǎn)環(huán)境的流量拷貝到預(yù)上線環(huán)境或測(cè)試環(huán)境
    2022-04-04
  • nginx實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)

    nginx實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)

    本文給大家分享的是使用nginx實(shí)現(xiàn)代理(請(qǐng)求轉(zhuǎn)發(fā))的教程及簡(jiǎn)單示例,非常實(shí)用,有需要的小伙伴可以參考下
    2017-07-07
  • nginx做代理時(shí)如何修改querystring方法詳解

    nginx做代理時(shí)如何修改querystring方法詳解

    這篇文章主要介紹了nginx做代理時(shí)如何修改querystring的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • nginx配置ssl雙向驗(yàn)證的方法

    nginx配置ssl雙向驗(yàn)證的方法

    這篇文章主要介紹了nginx配置ssl雙向驗(yàn)證的方法,需要的朋友可以參考下
    2014-11-11
  • Nginx部署SSL證書的過(guò)程

    Nginx部署SSL證書的過(guò)程

    SSL證書是數(shù)字證書的一種,類似于駕駛證、護(hù)照和營(yíng)業(yè)執(zhí)照的電子副本,這篇文章主要介紹了Nginx部署SSL證書的相關(guān)知識(shí),需要的朋友可以參考下
    2022-10-10
  • Web服務(wù)器-Nginx-高并發(fā)問(wèn)題

    Web服務(wù)器-Nginx-高并發(fā)問(wèn)題

    Nginx通過(guò)事件驅(qū)動(dòng)、I/O多路復(fù)用和異步非阻塞技術(shù)高效處理高并發(fā),結(jié)合動(dòng)靜分離和限流策略,提升性能與穩(wěn)定性
    2025-08-08
  • Nginx 反向代理與負(fù)載均衡運(yùn)行小結(jié)

    Nginx 反向代理與負(fù)載均衡運(yùn)行小結(jié)

    Nginx還支持對(duì)后端服務(wù)器進(jìn)行健康檢查,當(dāng)某個(gè)服務(wù)器不可用時(shí),Nginx會(huì)自動(dòng)將流量重定向到其他可用的服務(wù)器,這篇文章給大家分享Nginx 反向代理與負(fù)載均衡是如何運(yùn)行的,感興趣的朋友一起看看吧
    2024-03-03

最新評(píng)論

孝义市| 西城区| 洮南市| 五台县| 松潘县| 西昌市| 迭部县| 彰武县| 德化县| 宜春市| 仁寿县| 姚安县| 武鸣县| 吉隆县| 富阳市| 赣州市| 延寿县| 克拉玛依市| 和田市| 新郑市| 锡林郭勒盟| 黔西| 常山县| 南召县| 灵丘县| 平昌县| 吉木乃县| 岫岩| 南投市| 勐海县| 通道| 镇江市| 富宁县| 云霄县| 怀宁县| 易门县| 枣强县| 科技| 垣曲县| 讷河市| 溧阳市|