1. 程式人生 > 實用技巧 >Nginx靜態資源

Nginx靜態資源

一 Nginx靜態資源概述

1.1 靜態資源型別

Nginx作為靜態資源Web伺服器部署配置, 傳輸非常高效, 常常用於靜態資源處理,請求以及動靜分離。通常非伺服器動態執行生成的檔案屬於靜態資源。
型別 種類
瀏覽器端渲染 HTML、CSS、JS
圖片 JPEG、GIF、PNG
視訊 FLV、MP4
檔案 TXT及其他型別檔案

1.2 靜態資源場景

簡單靜態站點場景:

靜態站點加速場景:

二 靜態資源優化配置

2.1 sendfile

預設情況下,Nginx會自行處理檔案傳輸,並在傳送之前將檔案複製到緩衝區中。啟用sendfile指令跳過了將資料複製到緩衝區的步驟,並允許將資料從一個檔案描述符直接複製到另一個檔案描述符。同時,為了防止一個快速連線完全佔用工作程序,也可以使用sendfile_max_chunk指令限制單個sendfile()呼叫中傳輸的資料量。
語法:sendfile on | off; 預設:sendfile off; 可配置段:http,server,location,if in location 配置示例:
location /mp3 {
    #...
    sendfile        on;
    sendfile_max_chunk    1m;
    #...
}

2.2 tcp_nopush

將tcp_nopush指令與sendfile on;指令一起使用,可以使NGINX在sendfile()獲取資料塊之後立即在一個數據包中傳送HTTP響應頭。即在sendfile開啟情況下,提高網路包的"傳輸效率"。
語法:tcp_nopush on | off; 預設:tcp_nopush off; 可配置段:http, server, location 配置示例:
location /mp3 {
    #...
    sendfile   on;
    tcp_nopush on;
    #...
}

2.3 tcp_nodelay

tcp_nodelay指令允許覆蓋Nagle的演算法,該演算法最初設計用於解決慢速網路中小資料包的問題。該演算法將許多小資料包合併為一個較大的資料包,並以200毫秒的延遲傳送資料包。如今,在提供大型靜態檔案時,無論資料包大小如何,都可以立即傳送資料。延遲也會影響線上應用程式(ssh,線上遊戲,線上交易等)。預設情況下,tcp_nodelay指令設定為on,這意味著禁用了Nagle的演算法。此指令僅用於keepalive連線。因此tcp_nodelay提高網路包的"實時性"。
語法:tcp_nodelay on | off; 預設:tcp_nodelay on; 可配置段:http, server, location 配置示例:
location /mp3  {
    #...
    tcp_nodelay       on;
    keepalive_timeout 65;
    #...
}

三 靜態資源壓縮選項

3.1 gzip壓縮配置

Nginx將響應報文傳送至客戶端之前可以啟用壓縮功能,這能夠有效地節約頻寬,並提高響應至客戶端的速度。 語法:gzip on | off; 預設值:gzip off; 可配置段:http, server, location, if in location 配置示例:
location /mp3  {
   #...
       gzip    on;
       #...
  }

3.2 gzip壓縮比配置

語法:gzip_comp_level level; 預設值:gzip_comp_level 1; 可配置段:http, server, location 配置示例:
location /mp3  {
    #...
    gzip    on;
    gzip_comp_level 6;
    #...
}
提示:
  • 過高的壓縮比比較耗費服務端效能。
  • 隨著壓縮級別的升高,壓縮比有所提高,但到了級別6後,很難再提高;
  • 隨著壓縮級別的升高,處理時間明顯變慢;
  • gzip很消耗cpu的效能,高併發情況下cpu達到100%。

3.3 gzip壓縮協議版本配置

語法:gzip_http_version 1.0 | 1.1; 預設值:gzip_http_version 1.1; 可配置段:http, server, location 配置示例:
location /mp3  {
    #...
    gzip    on;
    gzip_comp_level 6;
gzip_http_version 1.1;
    #...
}
提示:也可不設定,目前主流幾乎都是v1.1版本協議。

3.4 gzip預壓縮配置

Nginx的動態壓縮是對每個請求先壓縮再輸出,會造成服務端一定程度的CPU消耗,因此可以利用nginx模組Gzip Precompression模組。同時nginx預設安裝ngx_http_gzip_module,採用的是chunked方式的動態壓縮,靜態壓縮需要使用http_gzip_static_module模組,進行pre-compress。對需要壓縮的檔案,直接讀取已經壓縮好的檔案(檔名為加.gz),而不是動態壓縮,對於不支援gzip的請求則讀取原檔案,即預壓縮。 語法:gzip_static on | off | always; 預設值:gzip_static off; 可配置段:http, server, location 配置示例:
location /mp3  {
    #...
gzip_static  on;
gzip_proxied expired no-cache no-store private auth;
    #..
}
注意: 檔案可以使用gzip命令來進行壓縮,或任何其他相容的命令,建議壓縮檔案和原始檔案的修改日期和時間保持一致。 gzip_static配置優先順序高於gzip。 開啟nginx_static後,對於任何檔案都會先查詢是否有對應的gz檔案。 gzip_types設定對gzip_static無效。 gzip static預設適用HTTP 1.1。

3.5 gzip_buffers壓縮緩衝配置

設定系統獲取幾個單位的快取用於儲存gzip的壓縮結果資料流。如果沒有設定,預設值是申請跟原始資料相同大小的記憶體空間去儲存gzip壓縮結果。 語法:gzip_buffers number size; 預設值:gzip_buffers 32 4k|16 8k; 可配置段:http, server, location 配置示例:
location /mp3  {
       #...
   gzip_buffers 32 4k
       #...
   }
示例解釋:如上32 4K表示按照記憶體頁(one memory page)大小以4K為單位(即一個系統中記憶體頁為4K),申請32倍的記憶體空間。

3.6 gzip_disable例外配置

針對特定的情況,排除在壓縮之外,即不壓縮。 語法:gzip_disable regex ...; 可配置段:http, server, location 配置示例:
location /mp3  {
    #...
gzip on;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_disable "MSIE [1-6]\.";
    #...
}
示例釋義:關閉IE6及以下的瀏覽器壓縮。

3.7 gzip_min_length特定的大小壓縮配置

當返回內容大於此值時才會使用gzip進行壓縮,單位為位元組,當值為0時,所有頁面都進行壓縮。 語法:gzip_min_length length; 預設值:gzip_min_length 20; 可配置段:http, server, location 配置示例:
location /mp3  {
    #...
gzip on;
gzip_buffers 4 16k;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_disable "MSIE [1-6]\.";
    #...
}

3.8 gzip_types壓縮型別配置

語法:gzip_types mime-type ...; 預設值:gzip_types text/html; 可配置段:http, server, location
location /myhome  {
    #...
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_disable "MSIE [1-6]\.";
    #...
}

3.9 gzip_proxied反向代理壓縮配置

Nginx作為反向代理的時候啟用,開啟或者關閉後端伺服器返回的結果,匹配的前提是後端伺服器必須要返回包含"Via"的header頭。 語法:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; 預設值:gzip_proxied off; 可配置段:http, server, location 引數釋義:
  • off:關閉所有的代理結果資料的壓縮
  • expired:如果header頭中包含 "Expires" 頭資訊,啟用壓縮;
  • no-cache:如果header頭中包含 "Cache-Control:no-cache" 頭資訊,啟用壓縮;
  • no-store:如果header頭中包含 "Cache-Control:no-store" 頭資訊,啟用壓縮;
  • private:如果header頭中包含 "Cache-Control:private" 頭資訊,啟用壓縮;
  • no_last_modified:如果header頭中不包含 "Last-Modified" 頭資訊,啟用壓縮;
  • no_etag:如果header頭中不包含 "ETag" 頭資訊,啟用壓縮;
  • auth:如果header頭中包含 "Authorization" 頭資訊,啟用壓縮;
  • any:無條件啟用壓縮。

四 靜態資源壓縮配置

4.1 建立站點目錄

[root@master ~]# mkdir /usr/share/nginx/gzip/
[root@master gzip]# ls -l
總用量 19464
-rwxr-xr-x  1 root root 6639904 11月 23 21:01 vmlinuz-3.css
-rwxr-xr-x  1 root root 6639904 11月 23 21:01 vmlinuz.html
-rwxr-xr-x. 1 root root 6639904 11月  9 2018 vm.png

配置虛擬機器

[root@master gzip]# vi /etc/nginx/conf.d/gzip.conf
server {
    listen 80;
    server_name  192.168.1.220;
    sendfile on;
    access_log  /var/log/nginx/gzip.access.log  main;
    error_log   /var/log/nginx/gzip.error.log  warn;
    location / {
        root /usr/share/nginx/gzip;
        index  index.html;

        gzip on;
        gzip_min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_disable "MSIE [1-6]\.";
        gzip_types text/plain application/json application/x-javascript application/javascript text/css application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif imag
e/png;
    }
}
[root@master gzip]# nginx -t -c /etc/nginx/nginx.conf
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@master gzip]# nginx -s reload
[root@master gzip]# 

4.3 確認驗證

使用curl測試站點是否啟用gzip:
[root@master gzip]# curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.1.220/vmlinuz-3.css"
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 23 Nov 2020 13:08:41 GMT
Content-Type: text/css
Last-Modified: Mon, 23 Nov 2020 13:01:35 GMT
Connection: keep-alive
ETag: W/"5fbbb2af-655120"
Content-Encoding: gzip

[root@master gzip]# curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.1.220/vm.png"
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 23 Nov 2020 13:10:23 GMT
Content-Type: image/png
Content-Length: 6639904
Last-Modified: Thu, 08 Nov 2018 23:43:22 GMT
Connection: keep-alive
ETag: "5be4ca1a-655120"
Accept-Ranges: bytes

[root@master gzip]# curl -I -H "Accept-Encoding: gzip, deflate" "http://192.168.1.220/vmlinuz.html"
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 23 Nov 2020 13:10:32 GMT
Content-Type: text/html
Last-Modified: Mon, 23 Nov 2020 13:01:35 GMT
Connection: keep-alive
ETag: W/"5fbbb2af-655120"
Content-Encoding: gzip