Nginx gzip static靜態壓縮
1. 目的
Nginx的動態壓縮是對每個請求先壓縮再輸出,這樣造成虛擬機器浪費了很多cpu,解決這個問題可以利用nginx模組Gzip Precompression,這個模組的作用是對於需要壓縮的檔案,直接讀取已經壓縮好的檔案(檔名為加.gz),而不是動態壓縮,對於不支援gzip的請求則讀取原檔案。
2. 介紹
1) 安裝配置
nginx預設安裝ngx_http_gzip_module,採用的是chunked方式的動態壓縮,靜態壓縮需要使用http_gzip_static_module這個模組,進行pre-compress。
模組 ngx_http_gzip_static_module 允許傳送以“.gz”作為副檔名的預壓縮檔案,以替代傳送普通檔案。需要指定 --with-http_gzip_static_module編譯選項:
./configure --with-http_gzip_static_module make make install |
若是nginx已安裝過,需要把已配置過的引數一起編譯,可以用nginx_home/sbin/nginx –V(大寫)檢視。安裝前請確認nginx是否關閉:nginx-s stop 強制關閉;nginx -s quit 安全關閉。
Nginx配置檔案:
location ~* \.(json)$ { gzip_static on; gzip_proxied expired no-cache no-store private auth; } |
a) 檔案可以使用 gzip 命令來進行壓縮,或任何其他相容的命令。建議壓縮檔案和原始檔案的修改日期和時間保持一致。
b) gzip_static配置優先順序高於gzip。
c) 開啟nginx_static後,對於任何檔案都會先查詢是否有對應的gz檔案。
d) gzip_types設定對gzip_static無效。
e) gzip static預設適用HTTP 1.1。
2) Location配置規則
a) ~ 波浪線表示執行一個正則匹配,區分大小寫
b) ~* 表示執行一個正則匹配,不區分大小寫
c) ^~ ^~表示普通字元匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄
d) = 進行普通字元精確匹配
e) @ "@" 定義一個命名的 location,使用在內部定向時,例如error_page, try_files
location 匹配的優先順序
a) = 精確匹配會第一個被處理。如果發現精確匹配,nginx停止搜尋其他匹配。
b) 普通字元匹配,正則表示式規則和長的塊規則將被優先和查詢匹配,也就是說如果該項匹配還需去看有沒有正則表示式匹配和更長的匹配。
c) ^~ 則只匹配該規則,nginx停止搜尋其他匹配,否則nginx會繼續處理其他location指令。
d) 最後匹配理帶有"~"和"~*"的指令,如果找到相應的匹配,則nginx停止搜尋其他匹配;當沒有正則表示式或者沒有正則表示式被匹配的情況下,那麼匹配程度最高的逐字匹配指令會被使用。
3) Gzip自動壓縮
為了方便生產環境自動生成壓縮檔案,寫了一條命令自動完成這些事情:
1. 根據檔案字尾名遍歷需要壓縮的檔案
2. 對比檔案的修改時間
3. 自動呼叫gzip生成壓縮檔案
find ./ -type f -printf '%TY %Tm %Td %TH %TM %TS\t%p\n'| grep -iE '\.(html|txt|css|js)$'| awk -F'\t' '{ gz_file=$2 ".gz"; stat_cmd="stat -c \"%Y\" " gz_file; exist_cmd="[ -e \"" gz_file "\" ] && echo 1 || echo 0"; exist_cmd | getline gz_file_exist; if (gz_file_exist) { stat_cmd | getline last_modify_timestamp; } else { last_modify_timestamp=0; } if (last_modify_timestamp < mktime($1)) { system("gzip -c9 " $2 " > " gz_file); print gz_file " [created]"; } }' |