vlambda博客
学习文章列表

lua-nginx-module 编译坑多?看看这里!

本文主要介绍lua-nginx-module编译过程

nginx是一个高性能的反向代理服务器,lua是一个小巧的脚本语言,利用lua-nginx-module模块可以使用lua处理nginx请求。

nginx + lua 到底能做什么?举几个简单例子:

1.  前置身份鉴权
2.  入口层记录错误日志
3.  同时转发请求到后端多个服务
4.  异构(lua + redis比java+redis并发能力好得多)
5.  .....

下面将一步步介绍如何编译带lua-nginx-module的nginx。

1.下载源码

编译带lua-nginx-module模块的nginx,需要用到下面6个源码包。

1.luajit2-2.1-20201027.tar.gz2.lua-nginx-module-0.10.19.tar.gz3.lua-resty-core-0.1.21.tar.gz [非必须]4.lua-resty-lrucache-0.10.tar.gz [非必须]5.nginx-1.19.5.tar.gz6.ngx_devel_kit-0.3.1.tar.gz

2. 编译LuaJIT

lua-nginx-module 依赖LuaJIT 2.x,ngx_devel_kit,所以编译带lua-nignx-module模块的nginx之前必须先编译LuaJIT,具体的要求可以看下面官网的说明原文。

1. LuaJIT can be downloaded from the latest release of OpenResty's LuaJIT fork. The official LuaJIT 2.x releases are also supported, although performance will be significantly lower for reasons elaborated above2. Download the latest version of the ngx_devel_kit (NDK) module HERE3. Download the latest version of ngx_lua HERE4. Download the latest supported version of Nginx HERE (See Nginx Compatibility)

解压、编译并安装LuaJIT

sudo tar zxvf luajit2-2.1-20201027.tar.gzsudo make install PREFIX=/usr/local/LuaJIT

这里指定安装的路径为/usr/local/LuaJIT,如果成功编译将可以看到如下结果:

3. 编译nginx

首先安装nginx必要的依赖pcre pcre-devel zlib zlib-devel openssl-devel:

sudo apt-get install libpcre3 libpcre3-devsudo apt-get install zlib1g-devsudo apt-get install openssl libssl-dev # 如果是Centos系统,则使用下面的命令# yum install pcre pcre-devel# yum install zlib zlib-devel# yum install openssl-devel

然后解压需要的源码包:

sudo tar zxvf nginx-1.19.5.tar.gzsudo tar zxvf ngx_devel_kit-0.3.1.tar.gzsudo tar zxvf lua-nginx-module-0.10.19.tar.gz

编译nginx这里有个坑,官网的说明文档是设置LUAJIT_LIBLUAJIT_INC这两个变量即可,即下面的命令:

 export LUAJIT_LIB=/path/to/luajit/lib export LUAJIT_INC=/path/to/luajit/include/luajit-2.1

但是实测发现,这个方案并不行,lua-nginx-module的config还是走了auto-discovery的流程,由于上面自己指定了LuaJIT的安装路径,auto-discovery并不能发现LuaJIT,在nginx configure的时候,就会报下面这个错误:

checking for LuaJIT 2.x ... not found ./configure: error: unsupported LuaJIT version; ngx_http_lua_module requires LuaJIT 2.x.

最后无奈,我将这两个变量直接写死在lua-nginx-module的config中,即:

# 直接声明这两个变量LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.1LUAJIT_LIB=/usr/local/LuaJIT/lib
ngx_lua_opt_I=ngx_lua_opt_L=luajit_ld_opt=
ngx_feature_name=ngx_feature_run=nongx_feature_incs=ngx_feature_test=
# 使得config走if流程if [ -n "$LUAJIT_INC" -o -n "$LUAJIT_LIB" ]; then....

配置nginx编译选项:

sudo ./configure \--prefix=/usr/local/nginx \--sbin-path=/usr/local/nginx/nginx \--conf-path=/usr/local/nginx/nginx.conf \--pid-path=/usr/local/nginx/nginx.pid \--error-log-path=/usr/local/nginx/logs/error.log \--with-http_ssl_module \--with-ld-opt="-Wl,-rpath,/usr/local/LuaJIT/lib" \--add-module=/usr/local/src/ngx_devel_kit-0.3.1 \--add-module=/usr/local/src/lua-nginx-module-0.10.19

如果配置成功,将可以看到如下信息:

lua-nginx-module 编译坑多?看看这里!

执行编译:

sudo make

编译成功的话,可以看到如下信息:

安装nginx,配置指定的nginx安装路径为:/usr/local/nginx。

4. 编译lua-resty-core

lua-resty-core 提供了很多api,在使用nginx + lua 开发时用的最多,所以将以这个为例编译nginx lua依赖库,lua-resty-core依赖lua-resty-lrucache模块,所以这两个模块要一起安装:

sudo tar zxvf lua-resty-core-0.1.21.tar.gzsudo tar zxvf lua-resty-lrucache-0.10.tar.gz
cd lua-resty-core-0.1.21sudo make install PREFIX=/usr/local/LuaLIBcd ../lua-resty-lrucache-0.10sudo make install PREFIX=/usr/local/LuaLIB

这里将这两个模块都安装在/usr/local/LuaLIB。

5. 编写lua指令处理nginx请求

nginx编译完成之后就可以使用lua脚本来处理nginx请求了,先上一个Hello World示例,调整nginx.conf:

http { # 指定lua模块路径,多个之间";"分隔,其中";;"表示默认搜索路径,默认到nginx的根目录下找 lua_package_path "/usr/local/LuaLIB/lib/lua/?.lua;;"; include mime.types; default_type application/octet-stream;
sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; # 使用lua-resty-core输出一个字符串 location /lua { default_type 'text/html'; content_by_lua 'ngx.say("Hi Lua")'; } location / { root html; index index.html index.htm; } }}

请求/lua可以看到如下效果,就说明nginx + lua-nginx-module编译成功了。

关于更多的 lua-resty-core api可以查看下面官网的文档:

https://github.com/openresty/lua-resty-core




▖如果推文对您有帮助,麻烦帮忙点个﹝在看


推荐阅读: