nginx靜態資源優化實踐
阿新 • • 發佈:2019-02-10
眾所周知,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訪問方式為例,清除成功提示。
(完)