nginx 帶寬_Nginx的Gzip功能

程序員自由之路 | 作者

urlify.cn/eyuUVr | 來源

什么是HTTP壓縮

有時候客戶端和服務器之間會傳輸比較大的報文數據,這時候就占用較大的網絡帶寬和時長。為了節省帶寬,加速報文的響應速速,可以將傳輸的報文數據先進行壓縮,然后再進行傳輸。
HTTP支持多種報文壓縮算法,下面是一個普通的請求頭,從Accept-Encoding字段可以看出支持gzip、deflate和br壓縮算法。本文我們重點講使用Gzip算法對報文進行壓縮,比如Gzip來壓縮HTML,Javascript, CSS文件,壓縮完后能大大減少網絡傳輸的數據量,提高了用戶顯示網頁的速度。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflate, brAccept-Language: zh-CN,zh;q=0.9Cache-Control: max-age=0Connection: keep-aliveHost: localhost:8000If-Modified-Since: Tue, 21 Apr 2020 14:09:01 GMTIf-None-Match: "5e9efe7d-264"Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

任何技術都是雙面的,HTTP壓縮雖然能減少帶寬占用加快響應速度,但是因為需要額外的壓縮和解壓的過程,所以會占用些客戶端或服務器端的計算資源。

了解HTTP的讀者知道,可以對HTTP的報文體進行編碼加密。其實HTTP壓縮是一種特殊的編碼方式,使用這種編碼方式可以將報文大大減少,使用對應的解法方式又能還原最初的報文。(我們可以看出,其實壓縮技術的本質就是一種編碼方式)

HTTP壓縮的使用場景

從上面對于HTTP壓縮的介紹可以看出,這種技術是一種優化技術,常常用于壓縮服務器端返回的報文以達到節省帶寬加速響應的目的。

下面簡單介紹一個HTTP使用Gzip壓縮的過程。

  • 瀏覽器發送Http request 給Web服務器, request 中有Accept-Encoding: gzip, deflate, br。(告訴服務器,瀏覽器支持gzip壓縮)
  • Web服務器接到request后, 先生成原始的Response, 其中有原始的Content-Type和Content-Length。
  • Web服務器通過Gzip,來對Response進行編碼, 編碼后header中有Content-Type和Content-Length(壓縮后的大小), 并且增加了Content-Encoding:gzip. 然后把Response發送給瀏覽器。
  • 瀏覽器接到Response后,根據Content-Encoding:gzip來對Response進行解碼。獲取到原始response后, 然后顯示出網頁。

客戶端也可以發送壓縮數據給服務端,通過代碼將請求數據解壓即可,規范起見同樣要在請求中加入Content-Encoding:gzip

用Nginx實現HTTP壓縮

Nginx提供了對HTTP Gzip壓縮的支持,這邊我們就來看看適應Nginx怎么對返回報文進行壓縮。

Nginx中通過ngx_http_gzip_module模塊、ngx_http_gzip_static_module模塊和ngx_http_gunzip_module模塊來對Gzip功能進行支持。一般情況下Nginx默認會編譯
這些模塊,可以通過nginx -V命令看下你安裝的nginx是否包含了這些模塊。

Gzip相關的指令可以在配置文件的http塊、server塊或者location塊中。

ngx_http_gzip_module模塊

ngx_http_gzip_module模塊主要負責Gzip功能的開啟和設置,對響應數據進行在線實時壓縮。該模塊包含以下主要指令。

#?開啟或者關閉Gzip功能,默認情況下,該指令設置為off,即不啟用Gzip功能。只有將該指令設置為on時,其他指令設置才有效gzip on | off#?設置Gzip壓縮文件使用緩存空間的大小#?默認值是:gzip_buffers 32 4k|16 8kgzip_buffers number size;#?該指令用于設定Gzip壓縮程度,包括級別1到級別9。#?級別1表示壓縮程度最低,壓縮效率最高;級別9表示壓縮程度最高,壓縮效率最低,最費時間。#?默認是1gzip_comp_level level#?針對不同種類客戶端發起的請求,可以選擇性地開啟和關閉Gzip功能。#?支持正則表達式,其中,regex 根據客戶端的瀏覽器標志(User-Agent,UA)進行設置。gzip_disable regex ...;#?該設置使用了正則表達式,其可以匹配UC字符串中包含MSIE 4、MSIE 5和MSIE6的所有瀏覽器。#?響應這些瀏覽器發出的請求時,Nginx服務器不進行Gzip壓縮。gzip_disable MSIE [4-6].;#?早期的一些瀏覽器或者HTTP客戶端,可能不支持Gzip自解壓,因此用戶有時會看到亂碼,所以針#?對不同的HTTP協議版本,需要選擇性地開啟或者關閉Gzip功能。該指令用于設置開啟Gzip功能的最低HTTP協議版本。#?默認設置為1.1版本,即只有客戶端使用1.1及以上版本的HTTP協議時,才使用Gzip功能對響應輸出數據進行壓縮。#?從目前來看,絕大多數的瀏覽器都支持Gzip自解壓,一般采用默認值即可.zip_http_version 1.0 | 1.1;#?該指令設置頁面的字節數,當響應頁面的大小大于該值時,才啟用Gzip功能。#?建議設置成gzip_min_length 1024;gzip_min_length length;#?用于設置Nginx服務器是否對后端服務器返回的結果進行Gzip壓縮;#?一般情況下,后端都是用來做restAPI接口,返回的數據量不會太大,不建議進行壓縮#?真的需要對后端返回的數據進行壓縮是可以再看下這塊的內容gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;#?設置MIME類型,被設置的類型將被壓縮,默認值是:text/html#?該變量還可以取“*”,表示對所有MIME類型的頁面數據進行Gzip壓縮#?一般可以設置成:gzip_types text/plain application/javascript text/css text/xmlgzip_types mime-type ...;#?開啟后的效果是在響應頭部添加了Accept-Encoding: gzipgzip_vary on | off;

ngx_http_gzip_static_module模塊

ngx_http_gzip_static_module模塊主要負責搜索和發送經過Gzip功能預壓縮的數據。這些數據以“.gz”作為后綴名存儲在服務器上。如果客戶端請求的數據在之前被壓縮過,并且客戶端瀏覽器支持Gzip壓縮,就直接返回壓縮后的數據。

該模塊與ngx_http_gzip_module模塊的不同之處主要在于,該模塊使用的是靜態壓縮,在HTTP響應頭部包含Content-Length頭域來指明報文體的長度,用于服務器可確定響應數據長度的情況;而后者默認使用Chunked編碼的動態壓縮,其主要適用于服務器無法確定響應數據長度的情況,比如大文件下載的情形,這時需要實時生成數據長度。

該模塊指令的使用和ngx_http_gzip_static_module模塊類似,這邊就不再具體展開了。大家可以參考官方文檔

該模塊是Nginx服務器的可選HTTP模塊,如果要使用,必須在Nginx程序配置時添加--with-http_gzip_static_module指令。

ngx_http_gunzip_module模塊

Nginx服務器支持對響應輸出數據流進行Gzip壓縮,這對客戶端瀏覽器來說,需要有能力解壓和處理Gzip壓縮數據,但如果客戶端本身不支持該功能,就需要Nginx服務器在向其發送數據之前先將該數據解壓。這些壓縮數據可能來自于后端服務器壓縮產生或者Nginx服務器預壓縮產生。ngx_http_gunzip_module模塊便是用來針對不支持Gzip壓縮數據處理的客戶端瀏覽器,對壓縮數據進行解壓處理的.

同樣,對這個模塊的指令使用就不具體展開了,大家可以參考官方文檔

現代的瀏覽器一般都支持壓縮功能,所以這個模塊使用到的幾率較小。

配置列子

gzip????????????on;gzip_min_length?1000;gzip_proxied????expired?no-cache?no-store private auth;gzip_types??????text/plain application/xml;

為了使得Nginx服務器能夠在全局范圍內應用Gzip壓縮功能,可以將Gzip配置放在了http全局塊中。如果要對各個虛擬主機差別性對待,我們可以在對應的server
塊中添加各自的Gzip配置指令;

閱讀延伸

平時開發的應用中可能不是所有的應用都使用了Nginx,看看其他Web服務器怎么開啟對HTTP壓縮的支持。

1. Spring Boot中內嵌的Tomcat開啟壓縮功能

Tomcat作為servet容器+http server,也是支持gzip壓縮的。使用傳統的Tomcat的話,我們只需要在server.xml配置開啟HTTP壓縮即可。
在embed版本下需要通過代碼來配置。spring-boot內置的tomcat是embed版本,通過內置的autoconfig機制已經做了一些默認tomcat配置,但是對于一些不常用/高級的配置,spring-boot并沒有提供入口。

不過由于spring bean的特性,可以覆蓋默認裝配的bean,包括tomcat相關的配置。使用TomcatConnectorCustomizer接口可以開啟壓縮配置。

public?class?ConnC1?implements?TomcatConnectorCustomizer{????@Override????public?void?customize(Connector connector)?{????????ProtocolHandler protocolHandler = connector.getProtocolHandler();????????if(protocolHandler?instanceof?Http11NioProtocol){????????????Http11NioProtocol http11NioProtocol = (Http11NioProtocol)protocolHandler;????????????http11NioProtocol.setCompression("on");//default off????????????http11NioProtocol.setCompressibleMimeType();????????????http11NioProtocol.setCompressionMinSize(2048);//default 2048(B)????????????http11NioProtocol.setMaxKeepAliveRequests(1);//default 200????????}????}}

關于Tomcat對于HTTP壓縮的支持,大家可以從Tomcat的CompressionConfig這個類開始尋找線索。

其實如果只是簡單開啟對壓縮功能的支持的話,只要在Spring Boot做下面的配置即可:

server:??compression:????enabled: true????min-response-size:?1024????mime-types:???????application/json

問題

歡迎大家留言說說Gzip功能還有哪些常用場景~

980fba891f6f4ad4fd37f190d82edf49.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537455.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分享朋友圈QQ空間需要哪些參數

shareTitle(分享標題 , shareDes(分享描述 , shareImg(分享圖片地址, shareUrl(分享地址, shareType(分享類型,微信朋友:WEIXIN、微信朋友圈:WEIXIN_CIRCLE、QQ:QQ)

【今日頭條】【抖音火山】前端開發實習生

今日頭條成立于2012年,致力于成為最懂你的信息平臺,連接人與信息,促進內容的創作和交流。通過技術,來改變整個內容生產、消費領域。 5年的時間內,我們已經成為了一個估值過百億美元,用戶數億,DA…

程序員真的是吃青春飯的嗎?(獻給即將進入職場的程序員們)

又有學生問我:程序員真的是吃青春飯的嗎?我是不是做到三十歲就該考慮轉型了? 我告訴他們: 這是中國的記者們用統計數字造下的一個彌天大謊,當我們看到微軟集團內的許多白發程序員在兢兢業業地工作的時候,我…

這一年多來,阿里Blink測試體系如何從0走向成熟?

2019獨角獸企業重金招聘Python工程師標準>>> 摘要: 引言 Apache Flink是面向數據流處理和批處理的分布式開源計算框架,2016年阿里巴巴引入Flink框架,改造為Blink。2017年,阿里整合了所有流計算產品,決定以B…

numpy中一些常見計算

文章目錄 numpy中的一些常見計算代碼方差標準差參考文獻numpy中的一些常見計算 代碼 import numpy as np from scipy import stats# 示例數據 data = np.array([1, 2,

system函數_自學C++基礎教程【函數】

函數的概念一個函數由:函數的返回值類型、函數名、參數表、函數體 這4個部分組成。int Add( int _a , int _b ) {return _a _b; }該函數 Add 完成對兩個整型數據的求和功能。函數的調用方式: 函數名(參數表);…

寧波政務云資源的介紹與申請

介紹 如圖所示: 寧波政務云分公共服務區與資源共享區。 公共服務區 公共服務區,一般部署允許互聯網訪問的系統,數據不敏感,不重要的,可對外開發的系統。 該區允許互聯網訪問,不允許訪問資源共享區&…

redis查數據

1 連接服務 12345[rootredis1-20 ~]# telnet 127.0.0.1 6380Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is ^].#用telnet也能登錄,但是無法查看key的value12[rootredis1-20 src]# ./redis-cli -p 6380#redis可能有好幾個服務,要指定端…

python幫助文檔在哪_python文檔在哪里

對于Python中一些不清楚的模塊,可以通過文檔學習如何使用,但是python文檔在哪里呢?這個問題我們可以使用Python命令進行查看。方法一 在python命令行輸入以下內容help(time) # 很詳細的模塊文檔 help(time.localtime()) # 很詳細的函數文檔 h…

政務云公共服務區與資源共享區數據交換的方式

上文《寧波政務云資源的介紹與申請》介紹過,公共服務區與資源共享區是不能互訪的,只能是資源共享區單向訪問公共服務區。 我有一項目,要能互聯網訪問,又要訪問“寧波大數據共享平臺”的接口,“寧波大數據共享平臺”在…

Java程序員的IntelliJ IDEA使用教程

前言 博主是Java程序員,以前一直都用myeclipse來開發的,說實話感覺myeclipse毫無美感可言,后來經過同事介紹,認識了IDEA,一眼就相中了IDEA黑色的主題風格,自此就拋棄了舊愛myeclipse。當時還不懂IDEA功能上…

python中random函數用法_random函數的用法

展開全部 用法: 1、隨2113機生成(0,1)之間的浮點數 random.random() 2、隨機生成100-200的整數5261 random.randint(100,200) 3、隨機產生范圍為410210間隔為2的數 random.randrange(0,11,2) 注:這里輸出(0,2,4,6,8,10…

提防易怒的危機

我工作多年,多年來認識一些官場、商場的人。 我與他們相處時,深深體會到太忙、太累的主管,常呈現的狀態是“易怒”。 這些人精神繃得太緊,體力透支,睡眠不足,開會太久,長期都在趕進度。 易怒…

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水題 代碼: #include<bits/stdc.h> using namespace std; int main(){int k;scanf("%d",&k);char s1[1010],s2[1010];scanf("%s%s",s1,s2);int same0;int ns…

python random()*10的值不可能是_Python

Python 生成隨機數、隨機字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- import random import string # 隨機整數&#xff1a; print random.randint(1,50) # 隨機選取0到100間的偶數&#xff1a; print random.randrange(0, 101, 2) # 隨機浮點數&#xff1a; print rand…

Prince2與PMP的區別

p2有7個原則&#xff0c;7個主題&#xff0c;7個流程&#xff0c;即37二十一。 P2有26個管理產品模板。 2009版本是經典版本&#xff0c;2017版本與2009版本內容基本沒變&#xff0c;梳理了目錄&#xff0c;使內容更加有可讀性。 P2是非常好的項目管理方法論&#xff0c;任何…

html實體編碼_深入研究瀏覽器解析和XSS有效負載編碼

翻譯文章&#xff0c; 原文&#xff1a;Deep dive into browser parsing and XSS payload encoding[1]這篇博客文章將深入探討HTML&#xff0c;URL和JavaScript的規范和解析器&#xff0c;以及它們之間的交互如何在跨站點腳本轉義中有所作為。對于您而言&#xff0c;這可能很難…

2021-02-03-延長一天時間的有效方法

方法1&#xff1a;給對的事情花時間 分清事情輕重緩急&#xff0c;做了對的事情會讓人感到開心。有個原則&#xff0c;就是事后回想這件事&#xff0c;會讓自己感到開心。 比如玩了一晚上游戲和學習&#xff0c;可能更多人的開心是后者。 比如健身運動與長時間學習&#xff…

[洛谷P1341]無序字母對

題目大意&#xff1a;給一張無向圖&#xff0c;找一條字典序最小的歐拉路徑 題解&#xff1a;若圖不連通或有兩個以上的奇數點&#xff0c;則沒有歐拉路徑&#xff0c;可以$dfs$&#xff0c;在回溯時把這個節點加入答案 卡點&#xff1a;沒有在回溯時加入答案&#xff0c;導致出…

產品部門四大角色——PM/PD/UE/UI

按照產品從規劃到最終成型的任務流方向&#xff0c;從抽象到具體、商業到技術的過程&#xff0c;涉及產品經理、產品設計師、用戶體驗師、視覺設計師四個角色。 PM&#xff1a;產品經理&#xff0c;俗稱老大。一個產品&#xff0c;首先由PM來分析細分市場、目標客戶的訴求&…