1. 程式人生 > >nginx靜態資源優化實踐

nginx靜態資源優化實踐

眾所周知,nginx是一款高效能的web和反向代理伺服器,具有非常強大的功能,以及非常優越的效能。 
本文只針對nginx處理靜態資源的優化,闡述具體實踐過程。

主要包括兩個方面:gizp壓縮、proxy cache快取。

1.開啟gzip壓縮功能 
gzip是一種壓縮技術,靜態資源的壓縮率在30%左右,原理是服務端壓縮後傳遞到瀏覽器進行解壓解析,絕大部分瀏覽器都支援。 
nginx開啟gzip配置

http {
     gzip  on;
     gzip_min_length 1k;
     gzip_buffers    16 64k;
     gzip_http_version 1.1;
     gzip_comp_level 4;
     gzip_types  text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
     gzip_vary on;
}

引數詳細說明:

  • gzip on; 開啟giz模組,預設是關閉的。
  • gzip_min_length 1k; 允許壓縮的頁面最小位元組數,預設是全部都壓縮,最好不要小於1k,因為小於1k的可能越壓越大。
  • gzip_buffers 4 16k; 設定系統獲取幾個單位的快取用於儲存gzip的壓縮結果資料流。4 16k代表以16k為單位,安裝原始資料大小以16k為單位的4倍申請記憶體。
  • gzip_http_version 1.1; 設定http協議版本,只對1.1版本進行壓縮。
  • gzip_comp_level 4; gzip壓縮比/壓縮級別,壓縮級別 1-9,級別越高壓縮率越大,當然壓縮時間也就越長(傳輸快但比較消耗cpu)。
  • gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;設定壓縮檔案型別,這裡指定了html、js、css。
  • gzip_vary on; 給http請求增加vary欄位, 不支援gzip的不進行壓縮處理。

在nginx中增加以上配置檔案,重啟之後再訪問,在請求頭中可以看到 Content-Encoding:gzip,說明已經起作用了。 
jquery-1.10.2.min.js的原始大小是92k,壓縮之後是32k 

2.配置proxy cache快取 
proxy cache快取是nginx將靜態資源存放到指定目錄,快取命中後直接返回,不需要再轉發到後端獲取,加快了請求速度同時也減輕了後端的壓力。 
在配置之前,先增加一個模組ngx_cache_purge,是用來手動清除快取的。

  • 下載並解壓purge模組
wget  https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
tar zxvf 2.3.tar.gz
  • 1
  • 2
  • 在nginx編譯中增加該模組
./configure --prefix=/data/nginx-1.9 --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --add-module=/data/src/ngx_cache_purge-2.3

make && make install
  • 1
  • 2
  • 3

nginx配置檔案增加proxy cache:

http {
    proxy_temp_path   /data/nginx-1.9/proxy_temp;
    proxy_cache_path  /data/nginx-1.9/proxy_cache levels=1:2 keys_zone=cache_one:100m inactive=2d max_size=2g;

    upstream backend {
        server 192.168.3.*:8083 weight=1;
        server 192.168.3.*:8083 weight=1;
    }

    server {
        listen       80;
        server_name  192.168.3.*;
        root   html;
        index  index.html index.htm index.jsp;

        location ~ /purge(/.*) {
            allow   127.0.0.1;
            allow   101.71.*.*;
            deny    all;
            proxy_cache_purge  cache_one $host$1$is_args$args;
            error_page 405 =200 /purge$1;
        }

        location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
            proxy_pass  http://backend;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header   X-Real-IP   $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_cache cache_one;
            proxy_ignore_headers Cache-Control;
            add_header Nginx-Cache $upstream_cache_status;
            proxy_cache_valid  200 304 301 302 8h;
            proxy_cache_valid 404 1m;
            proxy_cache_valid  any 2d;
            proxy_cache_key $host$uri$is_args$args;
            expires 30d;
        }
}

引數詳細說明:

  • proxy_temp_path:快取臨時目錄。後端的響應並不直接返回客戶端,而是先寫到一個臨時檔案中,然後被rename一下當做快取放在 proxy_cache_path。
  • proxy_cache_path:快取目錄,目錄裡的檔名是 cache_key 的MD5值。levels=1:2 表示採用2級目錄結構;keys_zone=cache_one:100m inactive=2d max_size=2g;快取區名稱為cache_one;快取的記憶體空間為100M,記憶體空間可多次使用;預設過期時間為2天,超過2天未被訪問檔案自動清除;最大檔案儲存為2G,超過後清除最少使用的資料。
  • proxy_cache:引用前面定義的快取區 cache_one。
  • proxy_ignore_headers:忽略Cache-Control的請求頭控制,依然進行快取。例如對請求頭設定cookie後,預設是不快取的,需要增加忽略配置。
  • proxy_cache_key:定義cache_key。
  • proxy_cache_valid:為不同的響應狀態碼設定不同的快取時間,比如200、302等正常結果可以快取的時間長點,而404、500等快取時間設定短一些,這個時間到了檔案就會過期,而不論是否剛被訪問過。
  • expires :在響應頭裡設定Expires:或Cache-Control:max-age,返回給客戶端的瀏覽器快取失效時間。
  • location ~ /purge(/.*) 是用於設定允許清除快取的IP地址。

看一下請求效果,設定成功後,可以檢視nginx的快取狀態,是否命中: Nginx-Cache:HIT。 

靜態檔案被快取後,更新時需要清除nginx cache,這裡以get訪問方式為例,清除成功提示。 

(完)