国产精品久久久久久亚洲影视,性爱视频一区二区,亚州综合图片,欧美成人午夜免费视在线看片

意見箱
恒創(chuàng)運(yùn)營部門將仔細(xì)參閱您的意見和建議,必要時將通過預(yù)留郵箱與您保持聯(lián)絡(luò)。感謝您的支持!
意見/建議
提交建議

如何利用Nginx進(jìn)行服務(wù)器端緩存配置?

來源:佚名 編輯:佚名
2025-05-15 16:00:37
利用 Nginx 進(jìn)行服務(wù)器端緩存(反向代理緩存)配置,可以有效減少后端服務(wù)器壓力,提升靜態(tài)資源或動態(tài)內(nèi)容的響應(yīng)速度。以下是詳細(xì)的配置步驟和最佳實(shí)踐:

一、Nginx 緩存模塊簡介

Nginx 主要通過以下兩個模塊實(shí)現(xiàn)緩存:

?

  1. ngx_http_proxy_module:反向代理功能,用于轉(zhuǎn)發(fā)請求到后端服務(wù)器。
  2. ngx_http_cache_module:緩存模塊,用于存儲后端響應(yīng)結(jié)果。

?

核心原理:Nginx 作為反向代理,第一次請求后端服務(wù)器時,將響應(yīng)內(nèi)容緩存到本地磁盤 / 內(nèi)存;后續(xù)相同請求直接返回緩存內(nèi)容,無需再次訪問后端。

二、配置步驟

1. 準(zhǔn)備工作

  • 檢查模塊支持
    確認(rèn) Nginx 已編譯包含?proxy?和?cache?模塊。執(zhí)行以下命令: bash ? ? ? ? ?
    nginx -V 2>&1 | grep -E "proxy|cache"
    
    ?


    輸出中應(yīng)包含?--with-http_proxy_module?和?--with-http_cache_module。
    • 若未包含,需重新編譯 Nginx(參考?Nginx 官方文檔)。
  • 創(chuàng)建緩存目錄: bash ? ? ? ? ?
    sudo mkdir -p /var/cache/nginx/cache # 路徑可自定義
    sudo chown -R nginx:nginx /var/cache/nginx # 設(shè)置權(quán)限(用戶需與 Nginx 運(yùn)行用戶一致)
    
    ?

2. 全局緩存配置(http 塊)

在 Nginx 配置文件(通常為?/etc/nginx/nginx.conf)的?http?塊中,定義緩存區(qū)域和策略:

?

nginx ? ? ? ? ?
http {
  # 定義緩存區(qū)域(levels、keys_zone、max_size 為必填項)
  proxy_cache_path /var/cache/nginx/cache # 緩存存儲路徑
    levels=1:2 # 緩存目錄層級(1:2 表示兩層目錄,如 /a/b/cache_key)
    keys_zone=my_cache:10m # 緩存鍵共享內(nèi)存區(qū)(名稱:大小,10m 表示占用 10MB 內(nèi)存)
    max_size=10g # 緩存最大磁盤占用(超過后按策略淘汰)
    inactive=60m # 緩存項在指定時間內(nèi)未被訪問則刪除(60分鐘)
    use_temp_path=on; # 是否使用臨時路徑緩存(默認(rèn) on,建議保留)

  # 其他全局配置(如 MIME 類型、日志等)...
}
?

?

關(guān)鍵參數(shù)說明

?

參數(shù) 說明 levels 緩存目錄層級,用于分散文件存儲,避免單目錄文件過多(建議 1:2 或 2:2)。 keys_zone 緩存鍵的元數(shù)據(jù)存儲區(qū),內(nèi)存大小需根據(jù)緩存鍵數(shù)量調(diào)整(1MB 約存儲 8000 個鍵)。 max_size 緩存總大小,超過后按?proxy_cache_use_stale?策略淘汰舊緩存。 inactive 緩存項未被訪問的超時時間,超時后自動刪除(僅在內(nèi)存中標(biāo)記,磁盤空間延遲釋放)。 use_temp_path 是否使用臨時目錄緩存數(shù)據(jù)(建議開啟,避免緩存寫入過程中返回不完整數(shù)據(jù))。

3. 反向代理緩存配置(server/location 塊)

在具體的?server?或?location?塊中,啟用緩存并關(guān)聯(lián)到后端服務(wù)器:

?

nginx ? ? ? ? ?
server {
  listen 80;
  server_name example.com;

  location / {
    # 反向代理到后端服務(wù)器(如 Node.js、PHP-FPM 等)
    proxy_pass http://backend_server; # 后端地址,如 http://127.0.0.1:8080

    # 啟用緩存并關(guān)聯(lián)全局緩存區(qū)域
    proxy_cache my_cache; # 使用 http 塊中定義的 keys_zone 名稱(my_cache)
    proxy_cache_key $scheme$host$request_uri; # 緩存鍵規(guī)則(基于協(xié)議、域名、URI)

    # 緩存有效期配置(按響應(yīng)狀態(tài)碼設(shè)置不同緩存時間)
    proxy_cache_valid 200 302 12h;  # 成功響應(yīng)(200/302)緩存 12 小時
    proxy_cache_valid 404 1m;       # 404 錯誤緩存 1 分鐘
    proxy_cache_valid any 5m;       # 其他狀態(tài)碼默認(rèn)緩存 5 分鐘(可選)

    # 緩存更新策略
    proxy_cache_use_stale updating; # 緩存過期時,返回舊緩存并后臺更新
    proxy_cache_background_update on; # 后臺異步更新緩存(需 Nginx 1.13.9+)

    # 忽略后端返回的 Cache-Control 頭,強(qiáng)制使用 Nginx 配置
    proxy_ignore_headers Cache-Control;

    # 傳遞必要的請求頭(如 Cookie,按需開啟)
    proxy_pass_request_cookie on;
  }
}
?

?

關(guān)鍵參數(shù)說明

?

  • proxy_cache_key:定義緩存鍵的生成規(guī)則,需確保相同請求生成唯一鍵。常見變量:
    • $scheme:協(xié)議(http/https)。
    • $host:域名(避免不同域名共享緩存)。
    • $request_uri:完整 URI(包含查詢參數(shù),如??id=123)。
    • 若需排除查詢參數(shù),可改為?$uri(僅路徑部分)。
  • proxy_cache_valid:按狀態(tài)碼設(shè)置不同緩存時間,any?表示所有狀態(tài)碼。
  • proxy_cache_use_stale:緩存過期時的處理策略,updating?表示使用舊緩存并觸發(fā)更新。

4. 高級配置:緩存分層與控制

  • 按請求頭緩存(如區(qū)分用戶登錄狀態(tài)): nginx ? ? ? ? ?
    location / {
      # 僅緩存未登錄用戶的請求(通過 Cookie 判斷)
      if ($http_cookie !~* "logged_in=1") {
        proxy_cache my_cache;
      }
    }
    
    ?
  • 禁止緩存特定請求(如帶授權(quán)頭): nginx ? ? ? ? ?
    location / {
      if ($http_authorization) {
        proxy_no_cache 1; # 禁止緩存帶 Authorization 頭的請求
        add_header Cache-Control "no-cache, no-store";
      }
    }
    
    ?
  • 緩存分層(內(nèi)存 + 磁盤): nginx ? ? ? ? ?
    proxy_cache_path /var/cache/nginx/cache
      levels=1:2
      keys_zone=my_cache:10m
      max_size=10g
      inactive=60m
      loader_files=1000 # 啟動時一次性加載的緩存元數(shù)據(jù)文件數(shù)
      loader_sleep=200ms # 加載間隔
      loader_threshold=300m; # 加載閾值(超過則分批次加載)
    
    ?

三、緩存管理與監(jiān)控

1. 查看緩存狀態(tài)

在?location?塊中添加?proxy_cache_status?變量,返回緩存狀態(tài):

?

nginx ? ? ? ? ?
location / {
  # 其他配置...
  add_header X-Cache $proxy_cache_status; # 響應(yīng)頭中添加緩存狀態(tài)
}
?

?

狀態(tài)值說明

?

  • HIT:緩存命中,直接返回緩存內(nèi)容。
  • MISS:緩存未命中,請求后端服務(wù)器并緩存結(jié)果。
  • EXPIRED:緩存過期,請求后端服務(wù)器并更新緩存。
  • STALE:使用舊緩存(proxy_cache_use_stale?生效時)。

?

示例響應(yīng)頭

?

http ? ? ? ? ?
X-Cache: HIT
?

2. 清理緩存

Nginx 本身不提供內(nèi)置緩存清理接口,需借助第三方模塊或腳本:

?

  • 方法一:使用?ngx_http_cache_purge?模塊(需編譯時添加)
    1. 重新編譯 Nginx 并啟用模塊: bash ? ? ? ? ?
      ./configure --add-module=/path/to/ngx_http_cache_purge
      make && make install
      
      ?
    2. 配置清理接口: nginx ? ? ? ? ?
      location /purge {
        allow 127.0.0.1; # 允許清理的 IP
        deny all;
        proxy_cache_purge my_cache $scheme$host$request_uri; # 按緩存鍵清理
      }
      
      ?


      發(fā)送?POST?請求到?/purge?uri=/path/to/clear?即可刪除對應(yīng)緩存。

  • 方法二:手動刪除緩存文件: bash ? ? ? ? ?
    # 按緩存鍵哈希值刪除(需先計算鍵的哈希值)
    key_hash=$(echo -n "$scheme$host$request_uri" | md5sum | cut -c1-2)/$(echo -n "$scheme$host$request_uri" | md5sum | cut -c3-4)/$(echo -n "$scheme$host$request_uri" | md5sum)
    rm -f /var/cache/nginx/cache/$key_hash
    
    ?

3. 監(jiān)控緩存命中率

通過 Nginx 日志或外部工具監(jiān)控緩存命中情況:

?

  • 在日志中記錄緩存狀態(tài)
    修改?nginx.conf?中的日志格式: nginx ? ? ? ? ?
    log_format cache_log '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$proxy_cache_status"';
    access_log /var/log/nginx/access.log cache_log;
    
    ?


    日志中會顯示每行請求的?$proxy_cache_status?值,通過統(tǒng)計?HIT?與?MISS?的比例計算命中率。
  • 使用第三方工具
    • Prometheus + Nginx Exporter:監(jiān)控 Nginx 指標(biāo)(如緩存命中數(shù))。
    • Grafana:可視化緩存命中率趨勢。

四、最佳實(shí)踐與注意事項

1. 緩存策略優(yōu)化

  • 區(qū)分動態(tài)與靜態(tài)內(nèi)容
    • 靜態(tài)資源(如圖片、CSS)優(yōu)先通過瀏覽器緩存(Cache-Control: max-age=31536000)處理,減少 Nginx 緩存壓力。
    • 動態(tài)內(nèi)容(如 API 接口)使用 Nginx 反向代理緩存,設(shè)置合理過期時間(如 5-30 分鐘)。
  • 避免緩存敏感數(shù)據(jù)
    對包含用戶認(rèn)證信息(如 Cookie、Authorization 頭)的請求,禁用緩存(proxy_no_cache 1)。
  • 熱點(diǎn)數(shù)據(jù)預(yù)熱
    通過腳本提前請求熱點(diǎn) URL,將數(shù)據(jù)載入緩存(如啟動時執(zhí)行?curl -I http://example.com/hot-path)。

2. 性能調(diào)優(yōu)

  • 調(diào)整內(nèi)存與磁盤占用
    • keys_zone?大小:根據(jù)預(yù)估的緩存鍵數(shù)量調(diào)整(1MB ≈ 8000 鍵),避免頻繁內(nèi)存回收。
    • max_size:根據(jù)服務(wù)器磁盤空間設(shè)置,建議為后端數(shù)據(jù)總量的 1-3 倍。
  • 啟用 Sendfile 加速: nginx ? ? ? ? ?
    http {
      sendfile on;
      tcp_nopush on;
    }
    
    ?


    減少內(nèi)核空間與用戶空間的數(shù)據(jù)拷貝,提升靜態(tài)文件傳輸效率。

3. 高可用性架構(gòu)

  • 緩存服務(wù)器集群
    將 Nginx 緩存節(jié)點(diǎn)獨(dú)立部署為集群,避免單機(jī)緩存失效影響全局。
  • 后端服務(wù)器健康檢查
    結(jié)合?proxy_next_upstream?實(shí)現(xiàn)故障轉(zhuǎn)移: nginx ? ? ? ? ?
    proxy_next_upstream error timeout invalid_header http_500;
    
    ?

五、示例配置文件

nginx ? ? ? ? ?
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;

http {
  include mime.types;
  default_type application/octet-stream;

  # 全局緩存配置
  proxy_cache_path /var/cache/nginx/cache
    levels=1:2
    keys_zone=my_cache:20m
    max_size=20g
    inactive=30m
    use_temp_path=on;

  server {
    listen 80;
    server_name example.com;

    location / {
      proxy_pass http://backend; # 后端服務(wù)器組(需在 http 塊中定義 upstream)
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;

      # 緩存配置
      proxy_cache my_cache;
      proxy_cache_key $scheme$host$uri$is_args$args; # 包含查詢參數(shù)
      proxy_cache_valid 200 302 6h;
      proxy_cache_valid 404 10m;
      add_header X-Cache $proxy_cache_status;

      # 禁止緩存帶 Cookie 的請求
      if ($http_cookie ~* "sessionid") {
        proxy_no_cache 1;
        add_header Cache-Control "no-cache";
      }
    }
  }

  # 后端服務(wù)器組
  upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
  }
}
?

六、常見問題排查

  1. 緩存未生效(始終返回 MISS)
    • 檢查?proxy_cache?是否啟用(是否關(guān)聯(lián)到正確的?keys_zone)。
    • 確認(rèn)?proxy_cache_key?是否包含必要變量(如?$host?避免跨域名緩存污染)。
    • 查看響應(yīng)頭是否有?Cache-Control: no-cache(可能被后端或 Nginx 配置覆蓋)。
  2. 緩存數(shù)據(jù)不一致
    • 確保后端數(shù)據(jù)更新時,通過接口清理對應(yīng)緩存(如調(diào)用?/purge?接口)。
    • 檢查?inactive?時間是否過長,導(dǎo)致舊數(shù)據(jù)未被及時刪除。
  3. 磁盤空間不足
    • 調(diào)整?max_size?或?inactive?時間,釋放過期緩存。
    • 啟用?proxy_cache_use_stale error timeout,在后端故障時繼續(xù)返回舊緩存。

?

通過以上配置,Nginx 可高效實(shí)現(xiàn)服務(wù)器端緩存,顯著提升網(wǎng)站性能和后端負(fù)載能力。實(shí)際應(yīng)用中需結(jié)合業(yè)務(wù)場景動態(tài)調(diào)整緩存策略,并定期監(jiān)控緩存命中率和資源占用。
本網(wǎng)站發(fā)布或轉(zhuǎn)載的文章均來自網(wǎng)絡(luò),其原創(chuàng)性以及文中表達(dá)的觀點(diǎn)和判斷不代表本網(wǎng)站。
上一篇: 配置Nginx緩存時如何選擇合適的緩存大?。?/span> 下一篇: 美國服務(wù)器物理層的作用以及操作方式