首頁 > 軟體

一篇文章讀懂nginx的gzip_static模組

2022-05-13 21:51:04

Nginx支援靜態和動態兩種包體gzip壓縮方式,分別對應模組ngx_http_gzip_static,ngx_http_gzip。

我們知道gzip是CPU密集型的應用,實時動態壓縮比較消耗CPU資源。另外,如果使用gzip,則sendfile零拷貝技術無法使用。為進一步提高Nginx的效能,我們可以使用靜態gzip壓縮,提前將需要壓縮的檔案壓縮好,當客服請求到達時,直接傳送壓縮好的.gz檔案,如此就減輕了伺服器CPU的壓力,提高了效能。預設ngx_http_gzip_static模組並未啟用,需要重新編譯。

#注:根據需要自行新增其它引數
./configure --with-http_gzip_static_module

準備.gz檔案:所有待壓縮的檔案,需要保留原始檔和.gz檔案,在相同WEB目錄。如下,以index.html為例。

#壓縮保留原始檔的方法:
[root@test01 html]# gzip -c index.html > index.html.gz
[root@test01 html]# ll index.*
-rw-r--r--. 1 root root 620 Jun 23  2021 index.html
-rw-r--r--. 1 root root 401 Jun 23  2021 index.html.gz

使用touch同步原始檔和.gz檔案的修改時間。檔案修改時間對應Last-Modified響應欄位,HTTP快取中使用很廣泛,同步二者時間,目的是保持快取過期判斷的一致性。

touch index.html.gz -r index.html

新增組態檔:

gzip_static on;

gzip_static優先順序高於gzip,$gzip_ratio對於gzip_static不生效,如果gzip_static失效,如缺少.gz,則gzip會生效。

gzip_static生效時,和gzip不同,Content-Encoding和Cotent-Length可以同時存在,因為響應在傳送前已經明確其大小。

實際執行的效果:

[root@test01 html]# curl test --compressed -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 23 Feb 2022 04:14:02 GMT
Content-Type: text/html
Content-Length: 401
Last-Modified: Wed, 23 Jun 2021 06:31:52 GMT
Connection: keep-alive
ETag: "60d2d558-191"
Content-Encoding: gzip

也可以考慮用always引數

gzip_static always;

always的語意是不考慮使用者端是否支援gzip解壓【注:依據是使用者端傳送的Accept-Encoding】,Nginx都將傳送.gz檔案,而on則是當用戶端不支援gzip解壓時,則傳送原始檔案。

下面是gzip_static on,curl啟用壓縮和不啟用壓縮的對比,可以看到僅當curl啟用壓縮才傳送.gz檔案。

[root@test01 html]# curl test --compressed -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 23 Feb 2022 07:27:43 GMT
Content-Type: text/html
Content-Length: 401
Last-Modified: Wed, 23 Jun 2021 06:31:52 GMT
Connection: keep-alive
ETag: "60d2d558-191"
Content-Encoding: gzip

[root@test01 html]# curl test  -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 23 Feb 2022 07:27:49 GMT
Content-Type: text/html
Content-Length: 620
Last-Modified: Wed, 23 Jun 2021 06:31:52 GMT
Connection: keep-alive
ETag: "60d2d558-26c"
Accept-Ranges: bytes

下面是設定為gzip_static always,curl啟用壓縮和不啟用壓縮的對比,可以發現無論curl是否啟用壓縮,都將傳送.gz檔案。

[root@test01 html]# curl test -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 23 Feb 2022 07:32:56 GMT
Content-Type: text/html
Content-Length: 401
Last-Modified: Wed, 23 Jun 2021 06:31:52 GMT
Connection: keep-alive
ETag: "60d2d558-191"
Content-Encoding: gzip #使用者端沒啟用壓縮,返回的內容仍然是gzip壓縮的

[root@test01 html]# curl test --compressed -I
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Wed, 23 Feb 2022 07:33:05 GMT
Content-Type: text/html
Content-Length: 401
Last-Modified: Wed, 23 Jun 2021 06:31:52 GMT
Connection: keep-alive
ETag: "60d2d558-191"
Content-Encoding: gzip

[root@test01 html]# curl test --compressed
<!DOCTYPE html>
<html lang="en">
<head>
<title>stream ssl test!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>stream ssl test!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/" rel="external nofollow"   >nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/" rel="external nofollow"   >nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

#因為沒有啟用壓縮,所以.gz檔案無法解壓,將被當做二進位制檔案輸出,有Warning提示。
[root@test01 html]# curl test 
Warning: Binary output can mess up your terminal. Use "--output -" to tell 
Warning: curl to output it to your terminal anyway, or consider "--output 
Warning: <FILE>" to save to a file.
[root@test01 html]# 

Chrome中也可以通過控制Accept-Encoding的傳送,模擬是否需要響應的包體壓縮,看下圖:

總之,gzip_static是對gzip的補充,通過簡單的設定,就能使Nginx提供更好的效能。

參考:gzip_static

相關文章:一文讀懂nginx gzip

總結

到此這篇關於一篇文章讀懂nginx中gzip_static模組的文章就介紹到這了,更多相關nginx gzip_static模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com