lua-zlib模块安装、使用

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环境

make
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 
xKLD 
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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值