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:
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:
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可能会令人费解,其实你可以把它们理解成输入输出接口,可以修改成文件,数据库等等形式。
别高兴太早,当你运行时,很可能会遇到如下错误:
libzlib.so: cannot open shared object file.
实际上这是因为如下zlib.lua代码的缘故:
local C = ffi.load 'zlib'
运行时,ffi.load会自动补全文件名,如果是Windows,则加载zlib.dll文件,如果是Linux,则加载libzlib.so,但实际上在Linux下,ZLIB扩展的名字是libz.so,而非libzlib.so。
知道的问题的原委,我们自然就知道如何修改代码了:
local C if ffi.os == "Windows" then C = ffi.load "zlib" else C = ffi.load "z" end
有时候我们不推荐直接修改第三方库的代码,因为这样的话,每次第三库更新代码,我们都要做对应的修改,一旦忘记就会出错,这时候可以考虑做一个软连接别名。








