0
点赞
收藏
分享

微信扫一扫

lua-zlib模块安装、使用

Brose 2022-06-20 阅读 229

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 条评论