激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - Nginx - Nginx服務器中使用gzip壓縮的相關配置解析

Nginx服務器中使用gzip壓縮的相關配置解析

2019-11-05 12:01jevien Nginx

這篇文章主要介紹了Nginx服務器中使用gzip壓縮的相關配置解析,包括對gzip請求處理相關的壓縮配置,需要的朋友可以參考下

gzip壓縮
使用 gzip 壓縮可以降低網站帶寬消耗,同時提升訪問速度。
主要在nginx服務端將頁面進行壓縮,然后在瀏覽器端進行解壓和解析,
目前大多數流行的瀏覽器都遲滯gzip格式的壓縮,所以不用擔心。
默認情況下,Nginx的gzip壓縮是關閉的,同時,Nginx默認只對text/html進行壓縮
主要配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
gzip on;#開啟
gzip_http_version 1.0;#默認1.1
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;#壓縮的文件類型
 
gzip_buffers 16 8k;#設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間
 
# Disable gzip for certain browsers.
gzip_disable “MSIE [1-6].(?!.*SV1)”;#ie6不支持gzip,需要禁用掉ie6,可惡啊!!!!

注意: 其中的gzip_http_version的設置,它的默認值是1.1,就是說對HTTP/1.1協議的請求才會進行gzip壓縮
如果我們使用了proxy_pass進行反向代理,那么nginx和后端的upstream server之間是用HTTP/1.0協議通信的。

gzip參數說明:
決定是否開啟gzip模塊
param:on|off
example:gzip on;

gzip_buffers
設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間
param1:int 增加的倍數
param2:int(k) 后面單位是k
example: gzip_buffers 4 8k;

gzip_comp_level
設置gzip壓縮等級,等級越底壓縮速度越快文件壓縮比越小,反之速度越慢文件壓縮比越大
param:1-9
example:gzip_com_level 1;

gzip_min_length
當返回內容大于此值時才會使用gzip進行壓縮,以K為單位,當值為0時,所有頁面都進行壓縮
param:int
example:gzip_min_length 1000;

gzip_http_version
用于識別http協議的版本,早期的瀏覽器不支持gzip壓縮,用戶會看到亂碼,所以為了支持前期版本加了此選項,目前此項基本可以忽略
param: 1.0|1.1
example:gzip_http_version 1.0

gzip_proxied
Nginx做為反向代理的時候啟用,
param:off|expired|no-cache|no-sotre|private|no_last_modified|no_etag|auth|any]
expample:gzip_proxied no-cache;
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 – 無條件壓縮所有結果數據

gzip_types
設置需要壓縮的MIME類型,非設置值不進行壓縮
param:text/html|application/x-javascript|text/css|application/xml
example:gzip_types text/html;

gzip_vary on;
和http頭有關系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮

Nginx與Gzip請求
一般線程的Nginx的Gzip模塊都是和Response相關的Gzip,但如果需要的是和Request相關的Gzip呢?來看下面:
方案

第一個選擇是使用lua-zlib:

?
1
2
3
4
5
6
7
8
9
10
11
12
local zlib = require "zlib"
 
local encoding = ngx.req.get_headers()["Content-Encoding"]
 
if encoding == "gzip" then
  local body = ngx.req.get_body_data()
 
  if body then
    local stream = zlib.inflate()
    ngx.req.set_body_data(stream(body))
  end
end

第二個選擇是通過LuaJIT的FFI庫來包裝ZLIB模塊,官方教程里有一些現成的可供參考的的例子,不過例子里介紹的是Deflate,而不是Gzip,自己用FFI封裝Gzip的話又有點小復雜,好在別人已經做了相關的工作,那就是lua-files:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
local ffi = require "ffi"
local zlib = require "zlib"
 
local function reader(s)
  local done
  return function()
    if done then return end
    done = true
    return s
  end
end
 
local function writer()
  local t = {}
  return function(data, sz)
    if not data then return table.concat(t) end
    t[#t + 1] = ffi.string(data, sz)
  end
end
 
local encoding = ngx.req.get_headers()["Content-Encoding"]
 
if encoding == "gzip" then
  local body = ngx.req.get_body_data()
 
  if body then
    local write = writer()
    zlib.inflate(reader(body), write, nil, "gzip")
    ngx.req.set_body_data(write())
  end
end

如上例子代碼源自zlib_test.lua,乍看上去,代碼里的reader和writer可能會令人費解,其實你可以把它們理解成輸入輸出接口,可以修改成文件,數據庫等等形式。

別高興太早,當你運行時,很可能會遇到如下錯誤:

?
1
libzlib.so: cannot open shared object file.

實際上這是因為如下zlib.lua代碼的緣故:

?
1
local C = ffi.load 'zlib'

運行時,ffi.load會自動補全文件名,如果是Windows,則加載zlib.dll文件,如果是Linux,則加載libzlib.so,但實際上在Linux下,ZLIB擴展的名字是libz.so,而非libzlib.so。

知道的問題的原委,我們自然就知道如何修改代碼了:

?
1
2
3
4
5
6
7
local C
 
if ffi.os == "Windows" then
  C = ffi.load "zlib"
else
  C = ffi.load "z"
end

有時候我們不推薦直接修改第三方庫的代碼,因為這樣的話,每次第三庫更新代碼,我們都要做對應的修改,一旦忘記就會出錯,這時候可以考慮做一個軟連接別名。

測試

開篇說過,接口都是用PHP做的,不過請求里的Gzip數據是用LUA處理的,如何讓PHP使用LUA處理后的數據呢?不同的語言似乎是個難題,好在Nginx有Phases一說,PHP作為FastCGI模塊工作在content階段,LUA可以工作在access階段,這樣它們就和諧了:

?
1
2
3
4
5
6
location ~ \.php$ {
  access_by_lua_file /path/to/lua/file;
 
  include fastcgi.conf;
  fastcgi_pass 127.0.0.1:9000;
}

那么lua-zlib和lua-files兩種方案效率如何?下面是我用PHP寫的測試腳本:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
$url = 'http://url';
 
$header = implode("\r\n", array(
  'Content-Type: application/x-www-form-urlencoded',
  'Content-Encoding: gzip',
  'Connection: close',
));
 
$content = gzencode(http_build_query(array(
  'foo' => str_repeat('x', 100),
  'bar' => str_repeat('y', 100),
)));
 
$options = array(
  'http' => array(
    'protocol_version' => '1.1',
    'method' => 'POST',
    'header' => $header,
    'content' => $content,
  ),
);
 
$context = stream_context_create($options);
 
for ($i = 0; $i < 1000; $i++) {
  file_get_contents($url, false, $context);
}
 
?>

很多人寫測試腳本的時候,喜歡在開始結束部分加上時間,這樣相減就得到了代碼實際運行的時間,其實這是不必要的,利用Linux自帶的time就可以獲取運行時間:

?
1
shell> time php /path/to/php/file

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国内久久久久 | 色污视频在线观看 | 国产福利不卡一区二区三区 | 亚洲日本欧美 | 精品国产一区二区三区免费 | 久久亚洲网 | 国内成人自拍视频 | 成人国产精品齐天大性 | 日韩app| 91av久久| 国产一级毛片高清 | 在线播放av网址 | 97久久人人超碰caoprom | 毛片视频网站在线观看 | 羞羞答答影院 | 久久综合九色 | 九艹在线 | 精品视频 久久久 | 中国免费一级毛片 | 91成人一区 | 天天夜干 | av电影免费播放 | 成年性羞羞视频免费观看 | 亚洲视频高清 | 九九视频精品在线观看 | 黑人一区| 日韩精品一区二区在线 | 久久亚洲春色中文字幕久久 | 黄色aaa视频| www69xxxxx| 午夜天堂在线视频 | 99爱视频在线观看 | 国产精品久久久免费看 | 久久99免费观看 | 最新se94se在线欧美 | 1000部精品久久久久久久久 | 久久久资源网 | 一级做a爱片毛片免费 | 亚洲国产成人久久成人52 | 日韩午夜一区二区三区 | 久久久久久艹 |