相关文章推荐
俊秀的大葱  ·  python2 中 unicode 和 ...·  5 月前    · 
读研的充电器  ·  phpmailer ...·  1 年前    · 
长情的电池  ·  深入理解C# ...·  1 年前    · 

github: https://github.com/brimworks/lua-zlib

在nginx上对gzip数据进行解压需要使用lua,借助一个库:lua-zlib, lua是一个和C语言结合紧密的脚本语言,实际上lua-zlib就是一个C语言编写的库,我们现在需要做的就是将其编译成一个动态链接库zlib.so,让lua来引用。

注:lua-zlib这个库可以对gzip解压,无法压缩成gzip,只能压缩成deflate。

编译该库时需要lua环境,由于安装了openresty(内置了lua环境),所以无需单独安装lua环境。编译时通过LUA_INCLUDE_DIR、LUA_LIBRARIES指定openresty中的lua路径即可。

1、安装:

根据官网说明,需要确认安装zlib、并且需要使用cmake编译。

1.1)检查centos上是否安装zlib:

$ rpm -qa zlib
zlib-1.2.3-29.el6.x86_64

如果没有,需要先安装zlib。

1.2)安装cmake:

首先检查gcc、g++、make是否安装;

gcc -v
g++ -v
make -v

如果没有通过如下命令安装:yum install -y gcc gcc-c++ make automake

然后,安装cmake:

cd /usr/local
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar -xvzf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./bootstrap
gmake
gmake install
检查cmake是否安装成功:
$ cmake --version
cmake version 2.8.10.2

1.3)lua-zlib安装:

1)下载:

cd /usr/local
wget https://github.com/brimworks/lua-zlib/archive/master.zip
unzip lua-zlib-master.zip

2)编译:

cd /usr/local/lua-zlib-master
cmake -DLUA_INCLUDE_DIR=/usr/local/openresty/luajit/include/luajit-2.1 -DLUA_LIBRARIES=/usr/local/openresty/luajit/lib -DUSE_LUAJIT=ON -DUSE_LUA=OFF

注:编译时指定openresty中的lua环境

cp zlib.so /usr/local/openresty/lualib/zlib.so

参考: https://www.bbsmax.com/A/1O5E8PnbJ7/

https://groups.google.com/forum/#!topic/openresty/MrBCqVn19lE

2、使用lua-zlib:

2.1)在lua脚本中使用:

更多示例可以参考github。

local src_dir, build_dir = ...
src_dir = src_dir or "./"
build_dir = build_dir or "/usr/local/openresty/lualib/"
package.path  = src_dir .. "?.lua;" .. package.path
package.cpath = build_dir .. "?.so;" .. package.cpath
local lz    = require("zlib")
local test_string = "aaaaaaaaaaaaaaaaa"
local deflated = lz.deflate()(test_string, "finish")
print(deflated)
local inflated = lz.inflate()(deflated, "finish")
print(inflated)
$ lua test.lua 
aaaaaaaaaaaaaaaaa

2.2)在openresty中使用lua-zlib:

worker_processes  8;
events {
    worker_connections  1024;
http {
    include       mime.types;
    default_type  text/html;
    log_format  main  '$remote_addr [$time_local] "$request" '
                      '"$http_x_forwarded_for"';
    access_log  /data/logs/nginx/access.log  main;
    error_log   /data/logs/nginx/error.log warn;
    underscores_in_headers on;
    server {
        listen       80;
        server_name  localhost;
        access_log  /data/logs/nginx/access.log  main;
        location /test {
          echo "hello, world!";
          content_by_lua '
            local zlib = require "zlib"
	    local stream = zlib.deflate()("123456","finish")
            ngx.say(stream)

注:在openresty中遇到的问题:

guard:12: writing a global lua variable ('zlib') which may lead to race conditions between concurrent requests, so prefer the use of 'local' variables

解答:https://github.com/openresty/openresty/issues/510

最近学习lua+nginx。在项目中要使用nginx的反向代理,从中遇见诸多麻烦!最蛋疼的是使用的平台是windows,哎!这套东西在window的相关文档资料很少!写写关于lua使用zlib压缩和解压的问题。 有两种方式可以完成 第一种:使用lua-zlib 看了一下别人的方式,http://blog.csdn.net/kowity/article/details/7229815; 最近需要使用 Lua 给 Wireshark 写个插件(dissector),苦于基于 C 的文档实在是太少了,干脆就用 Lua 来写。但是 Lua 也真是够“轻量”的,官方都没有个支持 zlib 压缩/解压的库。最后终于找到了 lua-zlib (URL:https://github.com/brimworks/lua-zlib),可以支持实时的流(Stream)压缩/解压。 _G:指向全局table 设置一下 _G的元表和元方法,通过重写 __newindex和 ___index元方法的方式来做到禁止新建全局变量和访问不存在的全局变量时提示错误。 setmetatable( __newindex = function(_, key) print("attempt to add a new value to global, key: " .. key) __index = 因为需要在windows下写一个测试客户端,之前用Lua写了一个,前天调试的时候出现了问题,找了很久才发现原来来自服务端的包可能是经过zlib进行压缩的,自然而然就需要在这个Lua的测试客户端中引入zlib的库了!1.到http://luaforge.net/projects/luazlib/中下载已经写好的luazlib的接口文件;2.到http://www.winimage.com/zLibDll/zlib125.zip下载windows下的zlib库,进行编译但是出现错误,在网上搜到了一个解决方法(以 上次的文章(http://blog.csdn.net/kowity/article/details/7229815)讲述了上个在 Lua 中调用 zlib 压缩、解压功能的库。其实通过使用 Lua 的 alien 库就可以直接调用外部 dll 中的函数,并不需要专门为 Lua 写一 有一个埋点收集系统,架构是Nginx+Flume。web,小程序,App等客户端将数据报送至Nginx,Nginx将请求写入本地文件,然后Flume读取日志文件的数据,将日志写入Kafka。这个架构本来没什么问题,但是部署在K8s容器就有问题了,当前一个Nginx后面是3个Flume,Nginx根据渠道将日志写入web.log,mp.log,app.log,3个log文件各对应一个Flume将数据写入Kafka,遇到的问题首先是health check问题,K8s一个容器只能提供1个health ch ==================================================================1、查看 zlib在centos 中是否存在?rpm -qa | grep zlib 显示:zlib-devel-1.2.3-29.el6.x86_64zlib-1.2.3-29.el6.x86_64...