- 快取檔案放在哪兒?
- 如何指定哪些請求被快取?
- 快取的有效期是多久?
- 如何指定哪些請求不被快取?
1 快取檔案放在哪兒?
配置
$ vim $NGINX_HOME/conf/nginx.conf
worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
upstream aidan.org{
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882 weight=2;
server 127.0.0.1:8883 weight=1;
}
server {
listen 80;
proxy_cache one;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
$ nginx -t
$ nginx -s reload
這里面加了兩行配置
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
proxy_cache one;
說明
| 指令 | 說明 |
|---|---|
| proxy_cache_path | 指定快取位置、快取名稱、記憶體中快取內容元資料資訊大小限制、快取總大小限制,快取位置是一個目錄應該先創建好,nginx并不會幫我們創建這個快取目錄 |
| proxy_cache | 指定使用前面設定的快取名稱 |
2. 如何指定哪些請求被快取?
- Nginx默認會快取所有get和head方法的請求結果,快取的key默認使用請求字串
- 自定義key,例如 proxy_cache_key “ h o s t host hostrequest_uri$cookie_user”;
$ vim $NGINX_HOME/conf/nginx.conf
worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
upstream aidan.org{
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882 weight=2;
server 127.0.0.1:8883 weight=1;
}
server {
listen 80;
proxy_cache one;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_key "$host$request_uri$cookie_user";
}
}
}
$ nginx -t
$ nginx -s reload
- 指定請求至少被發送了多少次以上時才快取,可以防止低頻請求被快取,例如:proxy_cache_min_uses 5;
- 指定哪些方法的請求被快取,例如 proxy_cache_methods GET HEAD POST;
3 快取有效期
默認情況下,快取的內容是長期存留的,除非快取的總量超出限制,可以指定快取的有效期,例如:
- 回應狀態碼為200 302時,10分鐘有效 proxy_cache_valid 200 302 10m;
- 對應任何狀態碼,5分鐘有效 proxy_cache_valid any 5m;
$ vim $NGINX_HOME/conf/nginx.conf
worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
upstream aidan.org{
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882 weight=2;
server 127.0.0.1:8883 weight=1;
}
server {
listen 80;
proxy_cache one;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_key "$host$request$cookie_user";
proxy_cache_valid 200 302 10m;
}
}
}
$ nginx -t
$ nginx -s reload
4. 如何指定哪些請求不被快取?
proxy_cache_bypass 該指令回應來自原始服務器而不是快取
例如:proxy_cache_bypass $cookie_nocache
a
r
g
n
o
c
a
c
h
e
arg_nocache
argn?ocachearg_comment;
如果任何一個引數值不為慷訓者不等0,nginx就不會查找快取,直接進行代理轉發,
$ vim $NGINX_HOME/conf/nginx.conf
worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
upstream aidan.org{
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882 weight=2;
server 127.0.0.1:8883 weight=1;
}
server {
listen 80;
proxy_cache one;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_key "$host$request$cookie_user";
proxy_cache_valid 200 302 10m;
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
}
}
}
$ nginx -t
$ nginx -s reload
網頁快取是由HTTP訊息頭中的"Cache-control"來控制的,常見的取值有private、no-cache、max-age、must-revalidate等,默認為private,
其作用根據不同的重新瀏覽方式分為以下幾種情況,
| Cache-directive | 說明 |
|---|---|
| public | 所有內容都將被快取(客戶端和代理服務器都可快取) |
| private | 內容只快取到私有快取中(僅客戶端可以快取,代理服務器不可快取) |
| no-cache | 必須先與服務器確認回傳的回應是否被更改,然后才能使用該回應來滿足后續對同一個網址的請求,因此,如果存在合適的驗證停牌(ETag),no-cache會發起往返通信來驗證快取的回應,如果資源未被更改,可以避免下載 |
| no-store | 所有內容都不會被快取到快取或Internet臨時檔案中 |
| must-revalidation/proxy-revalidation | 如果快取內容失敗,請求必須發送到服務器、代理以進行重新驗證 |
| max-age=xxx(xxx is numeric) | 快取的內容將在xxx秒失效,這個選項只在HTTP 1.1可用,并如果和Last-Modified一起使用時,優先級較高 |
示例:
$ vim /usr/local/nginx/conf/nginx.conf
worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
proxy_cache_path /data/nginx/cache keys_zone=one:10m max_size=10g;
upstream aidan.org{
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882 weight=2;
server 127.0.0.1:8883 weight=1;
}
server {
listen 80;
proxy_cache one;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
expires 1y;
proxy_cache_valid any 5m;
add_header Cache-Control "public";
add_header X-proxy-Cache $upstream_cache_status;
}
}
}
$ nginx -t
$ nginx -s reload
[root@localhost cache]# curl aidan.org/a/a -I
HTTP/1.1 200
Server: nginx/1.16.1
Date: Mon, 23 Sep 2019 16:01:47 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 77
Connection: keep-alive
Expires: Tue, 22 Sep 2020 16:01:47 GMT
Cache-Control: max-age=31536000
Cache-Control: public
X-proxy-Cache: MISS
[root@localhost cache]# curl aidan.org/a/a -I
HTTP/1.1 200
Server: nginx/1.16.1
Date: Mon, 23 Sep 2019 16:01:49 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 77
Connection: keep-alive
Expires: Tue, 22 Sep 2020 16:01:49 GMT
Cache-Control: max-age=31536000
Cache-Control: public
X-proxy-Cache: HIT
第一次MISS,第二次命中,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/51974.html
標籤:其他
上一篇:關于容器,虛擬機和多IP的困惑
