15《Nginx 入門教程》Nginx中的緩存與壓縮配置

1. Nginx中的緩存介紹

由于 Nginx 是在網(wǎng)站的所有其他后臺(tái)服務(wù)的最前線,它接收的請(qǐng)求和流量是后臺(tái)服務(wù)的數(shù)倍甚至數(shù)十倍之多整袁。因此菠齿,用好 Nginx 的緩存功能對(duì)于大型網(wǎng)站而言至關(guān)重要。Nginx 中的緩存功能優(yōu)勢(shì)如下:

  • 提升所有客戶端體驗(yàn)
  • 有效降低上游服務(wù)器的負(fù)載
  • 減少上游服務(wù)器之間的流量消耗

Nginx 的 Web 緩存服務(wù)主要由 proxy_cache 相關(guān)指令集和 fastcgi_cache 相關(guān)指令集構(gòu)成坐昙,前者用于反向代理時(shí)绳匀,對(duì)后端內(nèi)容源服務(wù)器進(jìn)行緩存,后者主要用于對(duì) FastCGI 的動(dòng)態(tài)程序進(jìn)行緩存炸客。兩者的功能基本上一樣疾棵。強(qiáng)大的緩存功能也成為了 Nginx 吸引眾多用戶的重要因素之一。

2. Nginx中緩存指令

2.1 expires指令

Nginx 中的 expires 指令通過控制 HTTP 相應(yīng)中的" Expires" 和 "Cache-Control"的頭部值痹仙,達(dá)到控制瀏覽器緩存時(shí)間的效果是尔。指令格式如下:

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

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

  • epoch: 指定"Expires"的值為1, 即 January,1970,00:00:01 GMT;
  • max: 指定"Expires"的值為31 December2037 23:59:59GMT, "Cache-Control"的值為10年;
  • -1:指定"Expires"的值為當(dāng)前服務(wù)器時(shí)間-1s开仰,即永遠(yuǎn)過期;
    off:不修改"Expires"和"Cache-Control"的值
  • time中出現(xiàn)@表示具體的時(shí)間拟枚,比如@18h30m表示的是下午6點(diǎn)半;

官方的示例如下:

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

2.2 proxy 模塊中的 cache 相關(guān)指令

Nginx 的 proxy 模塊中定義了許多和 cache 相關(guān)的模塊,這是配置 http 請(qǐng)求代理的緩存功能恩溅。

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

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
代碼塊1234567

proxy_cache_path 指令中有較多的參數(shù)蜒滩,部分重要參數(shù)說明如下:

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

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

  • proxy_cache_key: 配置緩存的關(guān)鍵字奶稠,格式如下:
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
代碼塊123

示例:

proxy_cache_key "$host$request_uri $cookie_user";
代碼塊1
  • proxy_cache_valid: 配置緩存什么樣的響應(yīng)俯艰,緩存多長(zhǎng)時(shí)間。注意锌订,如果只設(shè)置了緩存時(shí)間蟆炊,只緩存只針對(duì)相應(yīng)碼200, 301和302的請(qǐng)求 。格式如下:
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
代碼塊123

示例:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

# 只設(shè)置了緩存時(shí)間瀑志,只對(duì)200涩搓,301和302有效
proxy_cache_valid 5m;

proxy_cache_valid 200 302 10m;
proxy_cache_valid 301      1h;

# any表示所有相應(yīng)碼
proxy_cache_valid any      1m;

代碼塊123456789101112
  • proxy_cache_methods: 對(duì)哪種 method 的請(qǐng)求使用緩存返回響應(yīng)。
Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location
代碼塊123

3. Nginx中的壓縮配置

Nginx 的壓縮配置主要是用在與瀏覽交互中劈猪,對(duì)網(wǎng)頁昧甘、css、js等靜態(tài)資源進(jìn)行壓縮战得,通過消耗 cpu 的計(jì)算資源來節(jié)約大量的帶寬充边,提高傳輸效率,給用戶良好的體驗(yàn)常侦。Nginx 中的 ngx_http_gzip_module 就是專門處理這里壓縮功能的模塊浇冰。其中部分重要指如下:

  • gzip: 是否打開 gzip 壓縮功能;
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location

  • gzip_buffers: 設(shè)置壓縮所需要的緩沖區(qū)大小;
Syntax: gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location

  • gzip_comp_level: 設(shè)置壓縮級(jí)別,從1-9;越大壓縮率越高聋亡,同時(shí)消耗cpu資源也越多;
Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location

  • gzip_types:需要壓縮的文件格式 text/html默認(rèn)會(huì)壓縮肘习,不用添加;
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

一個(gè)常見的壓縮配置如下:

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

注意: gzip 的開啟需適應(yīng)特定的場(chǎng)景漂佩,比如大文件和圖片的傳輸就不是和開啟 gzip 功能,壓縮效果不明顯的同時(shí)還白白耗費(fèi)系統(tǒng)的資源罪塔,所以使用時(shí)需要慎重考慮投蝉。

4. 案例實(shí)戰(zhàn)

4.1 expires 指令用法

首先準(zhǔn)備 nginx.conf,中間簡(jiǎn)單配置幾條 expires 指令用作測(cè)試:

...

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

...

下面觀察請(qǐng)求結(jié)果:

# 使用 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表示環(huán)境一個(gè)小時(shí)前過期了瘩缆,所以返回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 緩存實(shí)驗(yàn)

準(zhǔn)備好 proxy_cache 緩存相關(guān)的配置,如下:

...

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';
        }
    }
    
    # 定義上游服務(wù)器
    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;
          # 狀態(tài)碼為200和301的緩存1分鐘
          proxy_cache_valid 200 301 1m;
          # 其余的緩存10分鐘
          proxy_cache_valid any 10m;
          # response響應(yīng)的頭信息中定義緩存的狀態(tài)(有沒有命中)
          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 響應(yīng)添加緩沖命中結(jié)果
          add_header Nginx-Cache "$upstream_cache_status";
       }
    
}

...


我們通過 curl 命令向 Nginx 所在主機(jī)的 80端 請(qǐng)求佃蚜,第一次請(qǐng)求轉(zhuǎn)發(fā)到8000端口庸娱,結(jié)果被緩存; 第2-3次請(qǐng)求時(shí)由緩存返回結(jié)果着绊,所以仍然是8000端口的返回;等待超過1分鐘后涌韩,緩存失效畔柔,請(qǐng)求被轉(zhuǎn)發(fā)到8001端口進(jìn)行處理氯夷,返回相應(yīng)結(jié)果臣樱;最后再次請(qǐng)求80端口,依舊由緩存命中腮考,返回8001端口的響應(yīng)結(jié)果雇毫。參看日志記錄的 http 請(qǐng)求。

# 第一次請(qǐng)求踩蔚,轉(zhuǎn)到8000端口響應(yīng)棚放,然后緩存
[shen@shen ~]$ curl http://180.76.152.113
8000, server
# 接下來請(qǐng)求全部由緩存命中
[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
# 緩存失效,轉(zhuǎn)發(fā)到8001端口相應(yīng)馅闽,并緩存結(jié)果
[shen@shen ~]$ curl http://180.76.152.113
8001, server
# 繼續(xù)命中緩存
[shen@shen ~]$ curl http://180.76.152.113
8001, server

查看請(qǐng)求的響應(yīng)結(jié)果:

[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"

代碼塊12345678910

5. 小結(jié)

本節(jié)內(nèi)容主要是介紹 Nginx 中的緩存功能飘蚯。一個(gè)是針對(duì)瀏覽器的緩存控制,另一個(gè)是針對(duì)上游服務(wù)器對(duì) http 請(qǐng)求進(jìn)行緩存福也,以減輕上游服務(wù)器的負(fù)載局骤,這在高流量場(chǎng)景下是非常必要的。接下來暴凑,我們完成兩個(gè)實(shí)驗(yàn)峦甩,測(cè)試前面講到的緩存指令,并實(shí)際觀察緩存效果现喳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凯傲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗦篱,更是在濱河造成了極大的恐慌冰单,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灸促,死亡現(xiàn)場(chǎng)離奇詭異球凰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腿宰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門呕诉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吃度,你說我怎么就攤上這事甩挫。” “怎么了椿每?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵伊者,是天一觀的道長(zhǎng)英遭。 經(jīng)常有香客問我,道長(zhǎng)亦渗,這世上最難降的妖魔是什么挖诸? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮法精,結(jié)果婚禮上多律,老公的妹妹穿的比我還像新娘。我一直安慰自己搂蜓,他們只是感情好狼荞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帮碰,像睡著了一般相味。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殉挽,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天丰涉,我揣著相機(jī)與錄音,去河邊找鬼斯碌。 笑死一死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的输拇。 我是一名探鬼主播摘符,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼策吠!你這毒婦竟也來了逛裤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后脆侮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝙砌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跋理。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片择克。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖前普,靈堂內(nèi)的尸體忽然破棺而出肚邢,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布骡湖,位于F島的核電站贱纠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏响蕴。R本人自食惡果不足惜谆焊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浦夷。 院中可真熱鬧辖试,春花似錦、人聲如沸军拟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懈息。三九已至,卻和暖如春摹恰,著一層夾襖步出監(jiān)牢的瞬間辫继,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工俗慈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姑宽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓闺阱,卻偏偏與公主長(zhǎng)得像炮车,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酣溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容