nginx编译lua扩展

虽说是将lua作为nginx扩展编译进nginx 但是运行lua程序还得靠lua本身,而因为种种知道的不知道的原因导致了lua自身有些不足 因此出现了升级版的luajit来替换luajit。在测试过程中无论是lua还是luajit都行,但既然大家都说luajit都说好,那我们也就用luajit了。另,文章所有软件下载目录都是/root目录

//下载luajit
wget https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz
tar -xvf LuaJIT-2.1.0-beta3.tar.gz
cd LuaJIT-2.1.0-beta3
make && make install PREFIX=/usr/local/luajit

//配置环境变量
vi /etc/profile
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1

//刷新配置文件
source /etc/profile

nginx下的lua扩展和其他扩展有些差异 就是这玩意儿需要多个扩展来同时支持,即 ngx-devel-kit,lua-nginx-module扩展。

下载nginx,版本没有限制 用最新的就好了 当然如果是生产环境 还是维持原版本 省得加班修复bug

//相关扩展
wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1k.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
wget https://www.zlib.net/zlib-1.2.11.tar.gz
wget -O ngx-devel-kit.v0.3.1.tar.gz https://github.com/vision5/ngx_devel_kit/archive/refs/tags/v0.3.1.tar.gz
wget -O lua-nginx-module.v0.10.20.tar.gz https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.20.tar.gz

//解压
tar -xvf openssl-1.1.1k.tar.gz

tar -xvf pcre-8.44.tar.gz
tar -xvf zlib-1.2.11.tar.gz
tar -xvf ngx-devel-kit.v0.3.1.tar.gz
tar -xvf lua-nginx-module.v0.10.20.tar.gz

//下载nginx版本没有限制
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar xvf nginx-1.20.1.tar.gz
cd nginx-1.20.1

//新安装nginx方式 ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --modules-path=/usr/local/nginx/modules \
--conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --pid-path=/usr/local/nginx/logs/nginx.pid \
--lock-path=/usr/local/nginx/logs/nginx.lock --with-select_module --without-select_module --with-poll_module --with-threads \
--with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_gunzip_module \
--with-http_gzip_static_module --http-log-path=/usr/local/nginx/logs/access.log --http-client-body-temp-path=/usr/local/nginx/temp/client_body_temp \
--http-proxy-temp-path=/usr/local/nginx/temp/proxy_temp --http-fastcgi-temp-path=/usr/local/nginx/temp/fastcgi_temp \
--http-uwsgi-temp-path=/usr/local/nginx/temp/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/temp/scgi_temp --with-mail \
--with-mail=dynamic --with-mail_ssl_module --with-stream --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module \
--with-stream_ssl_preread_module --with-compat --with-pcre --with-pcre-jit --with-pcre=/root/pcre-8.44 --with-zlib=/root/zlib-1.2.11 \
--with-openssl=/root/openssl-1.1.1k --with-debug --add-module=/root/ngx_devel_kit-0.3.1 --add-module=/root/lua-nginx-module-0.10.20 make && make install

//基于现有nginx安装需要先通过nginx -V查看nginx原编译参数 若原始参数中已经编译了其他自定义扩展 则需要下载相关的扩展信息
./configure [原始编译参数] --add-module=/root/lua/ngx_devel_kit-0.3.1 --add-module=/root/lua/lua-nginx-module-0.10.20
make && make upgrade

通过/usr/local/nginx/sbin/nginx -v测试nginx是否安装成功 当然,该步骤可能会出现以下错误提示

nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

该提示表示nginx尝试加载lua配置 但是没有找到相关的文件 解决办法:

echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/liblua.conf
#liblua.conf为随意命名 根据是 /etc/ld.so.conf中的内容决定
ldconfig #重新加载相关配置文件

上述nginx全新安装后启动nginx会出现/usr/local/nginx/temp/****目录不存在的提示,只需要手动创建相关文件即可

detected a LuaJIT version which is not OpenResty's; many optimizations will be disabled and performance will be compromised 
(see https://github.com/openresty/luajit2 for OpenResty's LuaJIT or, even better, consider using the OpenResty releases from
https://openresty.org/en/download.html)
以上提示只是版本不推荐的说明 不用介意(它推荐一键安装即通过openstry这个平台进行安装)

新版的lua插件是按照组件方式进行开发设计,因此nginx此时并不能马上运行起来 还需要通过nginx加载lua核心包(lua-resty-core,lua-resty-lrucache)

wget -O lua-resty-core.tar.gz https://github.com/openresty/lua-resty-core/archive/refs/tags/v0.1.22.tar.gz
wget -O lua-resty-lrucache.tar.gz https://github.com/openresty/lua-resty-lrucache/archive/refs/tags/v0.11.tar.gz

tar -xvf lua-resty-core.tar.gz
tar -xvf lua-resty-lrucache.tar.gz

//在nginx配置文件http模块中引入lua包 lua包的lib目录为包的根目录
lua_package_path "/root/lua-resty-core-0.1.22/lib/?.lua;;/root/lua-resty-lrucache-0.11/lib/?.lua;;";
#命令中的;;为规定的分隔符

#测试nginx中的lua 在server节点中添加路由配置
location /lua-test {
  content_by_lua_block {
    ngx.header.content_type="text/plain"
    ngx.say("hi nginx, here is lua script")
  }
}
#重启nginx 进行测试
/usr/local/nginx/sbin/nginx -s reload
curl http://localhost/lua-test

nginx编译lua扩展

 

nginx编译lua扩展

 

浏览器中采用82端口仅因为环境中有多个nginx 需要区分

lua_package_path中的多个路径其实可以合并固定的路径 只是需要手动将具体的包文件进行合并,按照上述步骤操作后 应该已经明白了包的加载原理 具体操作不再啰嗦

 

上一篇:十分钟学会Lua一:基本语法&基础类型


下一篇:Lua元表(Metatable)