## 什么是 Nginx 緩存
Nginx 基于Proxy Store 實現,使用 Nginx 的 `http_proxy `模塊可以實現類似于squid 的緩存功能。當啟用緩存時,Nginx 會將相應數據保存在磁盤緩存中,只要緩存數據尚未過期,就會使用緩存數據來響應客戶端的請求。
## 啟用緩存
1. 在 http 模塊下配置`proxy_cache_path `命令:
~~~
proxy_cache_path /data/cache keys_zone=huancun:10m;
~~~
第一個參數指定緩存保存的本地路徑;第二個參數定義緩存數據的共享內存區域的名稱和內存區大小。
Nginx 啟動后,緩存加載程序只進行加載一次,加載時會將緩存的元數據加載到共享內存區域,但是如果一次加載整個緩存全部內容可能會使 Nginx 剛啟動的前幾分鐘性能消耗嚴重,大幅度降低 Nginx 的性能。所以可以在 `proxy_cache_path`命令中配置緩存迭代加載。緩存迭代加載一共可以設置三個參數:
- loader_threshold:迭代的持續時間 (毫秒)(默認 200)
- loader_files:在一次迭代期間加載的最大項目(毫秒)(默認 100)
- loader_sleeps:迭代之間的延遲(毫秒)(默認為50)
例:
~~~
proxy_cache_path /data/cache keys_zone=niyueling:10m loader_threshold=300 loader_files=200;
~~~
2. 在虛擬服務器配置中配置`proxy_cache`命令:
~~~
proxy_cache huancun;
~~~
指定內存區。
> ps:通過配置 proxy_cache_path 中的 keys_zone 參數內存大小為 10m,并不會限制緩存數據大小,實際上緩存數據是存儲在文件系統中的特定文件的元數據副本。如果想要限制緩存數據的上限,則需要在proxy\_cache\_path命令中添加max\_size參數設置緩存數據上限
3. 在虛擬服務器下配置`proxy_cache_methods`命令指定該虛擬服務器下什么類型的 HTTP 方法可以被緩存
~~~
proxy_cache_methods[GET HEAD POST];
~~~
默認情況下 `GET` 請求及 `HEAD` 請求會被緩存,而`POST`請求不會被緩存。
4. `proxy_cache_vaild` 針對不同狀態碼的響應數據設置不同的緩存時間
~~~
proxy_cache_valid reply_code [reply_code...] time;
~~~
例:
~~~
proxy_cache_valid 200 10m; # 200狀態碼的緩存時間為 10 分鐘
proxy_cache_valid 404 1m; # 404的緩存時間為 1 分鐘
proxy_cache_valid 302 5m; # 302重定向的緩存時間為 5 分鐘
proxy_cache_valid any 5m; # 所有狀態緩存時間 5 分鐘
~~~
5. `proxy_cache_bypass`
~~~
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
·~~~
配置不從緩存中獲取響應的條件。如果URL中包含該配置的值,則這次請求會直接跳過緩存直接請求后端服務去獲取數據
6. `proxy_cache_min_uses`
~~~
proxy_cache_min_uses 2;
~~~
設置當某請求最少響應幾次后會被緩存, 默認 1。
## 清除緩存
如果緩存過期則需要從緩存中刪除過期的緩存文件,防止新舊緩存出現交錯出錯,當Nginx接收到自定義HTTP頭或者PURGE請求時,緩存將會被清除。
### 配置緩存清除
http 模塊下創建一個新變量 `$purge_method` 來標識使用 `PURGE `方法的請求并刪除匹配的 URL。
~~~
http {
map $request_method $purge_method {
PURGE 1;
default 0;
}
}
~~~
進入虛擬服務器配置,在location中配置高速緩存,并且指定緩存清除請求命令`proxy_cache_purge`。
~~~
server {
listen 80;
server_name huancun.test;
location / {
proxy_cache huancun;
proxy_cache_purge $purge_method;
}
}
~~~
### 發送清除命令
發送PURGE請求來清除緩存
~~~
PURGE huancun.test
~~~
這些高速緩存數據不會從緩存中完全刪除,它們將保留在磁盤上,直到它們被刪除為非活動狀態,或由緩存清除進程處理。
### 限制IP訪問清除命令
~~~
geo $purge_allowed {
default 0;
192.168.1.100/24 1;
}
map $request_method $purge_method {
PURGE $purge_allowed;
default 0;
}
~~~
當Nginx接收到清除緩存請求時,Nginx 檢查客戶端 IP 地址,若 IP 地址已經獲得清除緩存權限,則`$purge_method`設置為`$purge_allowed`,值為 1 表示允許清除緩存,值為0表示表示 IP 地址未獲得權限。
> 相關函數文檔:https://nginx.org/en/docs/http/ngx_http_proxy_module.html
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS