亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 Nginx 入門教程 Nginx 入門教程 18 Nginx中的緩存與壓縮配置

Nginx中的緩存與壓縮配置

1. Nginx中的緩存介紹

由于 Nginx 是在網站的所有其他后臺服務的最前線,它接收的請求和流量是后臺服務的數倍甚至數十倍之多。因此,用好 Nginx 的緩存功能對于大型網站而言至關重要。Nginx 中的緩存功能優勢如下:

  • 提升所有客戶端體驗
  • 有效降低上游服務器的負載
  • 減少上游服務器之間的流量消耗

Nginx 的 Web 緩存服務主要由 proxy_cache 相關指令集和 fastcgi_cache 相關指令集構成,前者用于反向代理時,對后端內容源服務器進行緩存,后者主要用于對 FastCGI 的動態程序進行緩存。兩者的功能基本上一樣。強大的緩存功能也成為了 Nginx 吸引眾多用戶的重要因素之一。

2. Nginx中緩存指令

2.1 expires指令

Nginx 中的 expires 指令通過控制 HTTP 相應中的" Expires" 和 "Cache-Control"的頭部值,達到控制瀏覽器緩存時間的效果。指令格式如下:

Syntax:	expires [modified] time;
expires epoch | max | off;
Default:	
expires off;
Context: http, server, location, if in location

Nginx 中的時間單位有s(秒), m(分), h(小), d(天)。指令參數說明:

  • epoch: 指定"Expires"的值為1, 即 January,1970,00:00:01 GMT;
  • max: 指定"Expires"的值為31 December2037 23:59:59GMT, "Cache-Control"的值為10年;
  • -1:指定"Expires"的值為當前服務器時間-1s,即永遠過期;
    off:不修改"Expires"和"Cache-Control"的值
  • time中出現@表示具體的時間,比如@18h30m表示的是下午6點半;

官方的示例如下:

expires    24h;       # 24小時過期
expires    modified +24h;
expires    @24h;
expires    0;         # 不緩存,立即過期
expires    -1;        # 用不過期
expires    epoch;
expires    $expires;

2.2 proxy 模塊中的 cache 相關指令

Nginx 的 proxy 模塊中定義了許多和 cache 相關的模塊,這是配置 http 請求代理的緩存功能。

通常情況下,我們使用 proxy_cache 指令開啟 Nginx 緩存功能,用 proxy_cache_path 指令來設置緩存的路徑和其他配置。兩個指令的用法如下:

Syntax:	proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location

Syntax:	proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: —
Context: http

proxy_cache_path 指令中有較多的參數,部分重要參數說明如下:

  • path: 定義緩存存放的位置;
  • levels: 定義緩存路徑的目錄等級,最多3級
  • use_temp_path:
    • on: 使用proxy_temp_path定義的目錄
    • off:
  • keys_zone:
    • name: 共享內存名
    • size: 共享內存大小
  • max_size: 設置最大的緩存文件大小

其余的重要的緩存指令有:

  • proxy_cache_key: 配置緩存的關鍵字,格式如下:
Syntax:	proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location

示例:

proxy_cache_key "$host$request_uri $cookie_user";
  • proxy_cache_valid: 配置緩存什么樣的響應,緩存多長時間。注意,如果只設置了緩存時間,只緩存只針對相應碼200, 301和302的請求 。格式如下:
Syntax:	proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location

示例:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

# 只設置了緩存時間,只對200,301和302有效
proxy_cache_valid 5m;

proxy_cache_valid 200 302 10m;
proxy_cache_valid 301      1h;

# any表示所有相應碼
proxy_cache_valid any      1m;

  • proxy_cache_methods: 對哪種 method 的請求使用緩存返回響應。
Syntax:	proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location

3. Nginx中的壓縮配置

Nginx 的壓縮配置主要是用在與瀏覽交互中,對網頁、css、js等靜態資源進行壓縮,通過消耗 cpu 的計算資源來節約大量的帶寬,提高傳輸效率,給用戶良好的體驗。Nginx 中的 ngx_http_gzip_module 就是專門處理這里壓縮功能的模塊。其中部分重要指如下:

  • gzip: 是否打開 gzip 壓縮功能;
Syntax:	gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
  • gzip_buffers: 設置壓縮所需要的緩沖區大小;
Syntax:	gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location
  • gzip_comp_level: 設置壓縮級別,從1-9;越大壓縮率越高,同時消耗cpu資源也越多;
Syntax:	gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location
  • gzip_types:需要壓縮的文件格式 text/html默認會壓縮,不用添加;
Syntax:	gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location
  • gzip_min_length: 壓縮文件最小大小;
Syntax:	gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location

一個常見的壓縮配置如下:

    # 開啟gzip壓縮
    gzip on;
    # http的協議版本
    gzip_http_version 1.0;
    # IE版本1-6不支持gzip壓縮,關閉
    gzip_disable 'MSIE[1-6].';
    #需要壓縮的文件格式
    gzip_types text/css text/javascript application/javascript image/jpeg image/png image/gif;
    #設置為4個8K內存作為壓縮結果流緩存
    gzip_buffers 4 8k;
    #壓縮文件最小大小
    gzip_min_length 1k;
    #壓縮級別1-9
    gzip_comp_level 9;
    #給響應頭加個vary,告知客戶端能否緩存
    gzip_vary on;
    #反向代理時使用
    gzip_proxied off;

注意: gzip 的開啟需適應特定的場景,比如大文件和圖片的傳輸就不是和開啟 gzip 功能,壓縮效果不明顯的同時還白白耗費系統的資源,所以使用時需要慎重考慮。

4. 案例實戰

4.1 expires 指令用法

首先準備 nginx.conf,中間簡單配置幾條 expires 指令用作測試:

...

http{
    server {
        listen 8000;
        location / {
            default_type text/plain;
            expires 10m;
            #expires -1h;
            return 200 '8000, server\n';
        }
    }
}

...

下面觀察請求結果:

# 使用 expires 10m 配置,可以看到Expires值正好為10分鐘后
[shen@shen ~]$ curl http://180.76.152.113:8000 -I
HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Thu, 06 Feb 2020 11:37:17 GMT
Content-Type: text/plain
Content-Length: 13
Connection: keep-alive
Expires: Thu, 06 Feb 2020 11:47:17 GMT
Cache-Control: max-age=600

# 使用 expires -1h 配置, -1h表示環境一個小時前過期了,所以返回Cache-Control的值為no-cache
[shen@shen ~]$ curl http://180.76.152.113:8000 -I
HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Thu, 06 Feb 2020 11:37:32 GMT
Content-Type: text/plain
Content-Length: 13
Connection: keep-alive
Expires: Thu, 06 Feb 2020 10:37:32 GMT
Cache-Control: no-cache

4.2 proxy_cache 緩存實驗

準備好 proxy_cache 緩存相關的配置,如下:

...

http {
    
    server {
        listen 8000;
        location / {
            default_type text/plain;
            return 200 '8000, server\n';
        }
    }

    server {
        listen 8001;
        location / {
            default_type text/plain;
            return 200 '8001, server\n';
        }
    }

    server {
        listen 8002;
        location / {
            default_type text/plain;
            return 200 '8002, server\n';
        }
    }
    
    # 定義上游服務器
    upstream backends {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
    }
    
    # proxy_cache_path 指令
    proxy_cache_path /root/test/cache levels=1:2 keys_zone=nginx_cache:10m max_size=10g inactive=60m use_temp_path=off;
    
    server {
       listen  80;

       location / {
          proxy_pass http://backends;
          proxy_cache nginx_cache;
          # 狀態碼為200和301的緩存1分鐘
          proxy_cache_valid 200 301 1m;
          # 其余的緩存10分鐘
          proxy_cache_valid any 10m;
          # response響應的頭信息中定義緩存的狀態(有沒有命中)
          proxy_cache_key "$host$uri$is_args$args";
          expires 1d;
          proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
          proxy_no_cache $http_pragma    $http_authorization;
          # add_header 響應添加緩沖命中結果
          add_header Nginx-Cache "$upstream_cache_status";
       }
    
}

...

我們通過 curl 命令向 Nginx 所在主機的 80端 請求,第一次請求轉發到8000端口,結果被緩存; 第2-3次請求時由緩存返回結果,所以仍然是8000端口的返回;等待超過1分鐘后,緩存失效,請求被轉發到8001端口進行處理,返回相應結果;最后再次請求80端口,依舊由緩存命中,返回8001端口的響應結果。參看日志記錄的 http 請求。

# 第一次請求,轉到8000端口響應,然后緩存
[shen@shen ~]$ curl http://180.76.152.113
8000, server
# 接下來請求全部由緩存命中
[shen@shen ~]$ curl http://180.76.152.113
8000, server
[shen@shen ~]$ curl http://180.76.152.113
8000, server
[shen@shen ~]$ curl http://180.76.152.113
8000, server
# 緩存失效,轉發到8001端口相應,并緩存結果
[shen@shen ~]$ curl http://180.76.152.113
8001, server
# 繼續命中緩存
[shen@shen ~]$ curl http://180.76.152.113
8001, server

查看請求的響應結果:

[root@server sbin]# tail -f ../logs/access.log

127.0.0.1 - - [06/Feb/2020:20:14:15 +0800] "GET / HTTP/1.0" 200 13 "-" "curl/7.29.0" "-""-"
103.46.244.69 - - [06/Feb/2020:20:14:15 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""MISS"
103.46.244.69 - - [06/Feb/2020:20:14:23 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""HIT"
103.46.244.69 - - [06/Feb/2020:20:14:26 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""HIT"
127.0.0.1 - - [06/Feb/2020:20:16:10 +0800] "GET / HTTP/1.0" 200 13 "-" "curl/7.29.0" "-""-"
103.46.244.69 - - [06/Feb/2020:20:16:10 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""EXPIRED"
103.46.244.69 - - [06/Feb/2020:20:16:22 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0" "-""HIT"

5. 小結

本節內容主要是介紹 Nginx 中的緩存功能。一個是針對瀏覽器的緩存控制,另一個是針對上游服務器對 http 請求進行緩存,以減輕上游服務器的負載,這在高流量場景下是非常必要的。接下來,我們完成兩個實驗,測試前面講到的緩存指令,并實際觀察緩存效果。