一、所需模块简述
LuaJIT解析器:
LuaJIT 是 Lua 语言的高性能即时编译器(Just-In-Time Compiler,简称 JIT)。它显著提升了 Lua 脚本的执行速度,使 Lua 在需要高性能的应用场景中表现出色。LuaJIT 解析器具备以下几个关键特性:
- 即时编译(JIT):LuaJIT 能将 Lua 代码在运行时编译成本地机器码,大幅减少解释执行带来的性能损耗。这使得 LuaJIT 在执行复杂计算或需要高吞吐量的任务时表现优异。
- 兼容性高:LuaJIT 完全兼容标准 Lua 5.1,支持大部分 Lua 5.2 和 5.3 的特性。这意味着现有的 Lua 代码大多数情况下可以无缝迁移到 LuaJIT 上运行。
- 轻量级和嵌入式:LuaJIT 保持了 Lua 的轻量级特
文章来源(Source):浅时光博客 性,适合嵌入到各种应用程序中,如游戏引擎、网络服务器等,提供脚本扩展能力。 - 高效的 FFI(外部函数接口):LuaJIT 提供了强大的 FFI 接口,允许 Lua 代码直接调用 C 函数和操作 C 数据结构,进一步提升了性能和灵活性。
- 跨平台支持:LuaJIT 支持多种操
原文链接:https://dqzboy.com 作系统和硬件平台,包括 Windows、Linux、macOS 以及多种嵌入式系统,使其应用范围广泛。
由于其卓越的性能和灵活性,LuaJIT 成为了许多高性能应用和框架的首选脚本引擎。
LuaJIT官网地址为:http://luajit.org/
lua-nginx-module:
lua-nginx-module 是一个将 Lua 语言深度集成到 Nginx 服务器中的模块。它基于 LuaJIT,允许开发者在 Nginx 的各个阶段编写 Lua 脚本,从而实现高度定制化的功能和灵活的配置。lua-nginx-module 主要特性和优势包括:
- 高性能:依托于 LuaJIT 的高效执行,lua-nginx-module 能在保持 Nginx 高吞吐量的同时,提供复杂的逻辑处理能力。
- 灵活的配置扩展:通过 Lua 脚本,开发者可以在 Nginx 配置中添加自定义的逻辑,如动态路由、访问控制、内容过滤等,超越了传统配置指令的限制。
- 事件驱动编程:lua-nginx-module 支持基于 Nginx 事件模型的异步编程,适合处理高并发和 I/O 密集型任务,如非阻塞的网络请求和数据库操作。
- 丰富的 API:模块提供了丰富的 Nginx API,允许 Lua 脚本访问请求和响应的各个部分,操作 HTTP 头、处理 Cookies、管理会话等。
- 集成第三方库:通过 LuaRocks 等包管理工具,开发者可以方便地集成各种第三方 Lua 库,扩展 Nginx 的功能,如缓存机制、加密算法、数据解析等。
- 简化复杂任务:某些复杂的逻辑处理,如动态内容生成、A/B 测试、限流策略等,通过 Lua 脚本可以更简洁、高效地实现,减少对多个中间件的依赖。
- 社区和文档支持:lua-nginx-module 拥有活跃的社区和丰富的文档资源,开发者可以方便地获取支持和最佳实践,快速上手并解决问题。
应用场景:
- 动态内容处理:根据请求动态生成或修改内容,实现个性化服务。
- API 网关:处理复杂的路由、认证、限流等功能,作为微服务架构中的入口。
- 实时监控和日志处理:实时分析和处理日志数据,监控系统状态。
- 安全防护:实现自定义的安全策略,如 IP 黑白名单、请求过滤等。
将 Lua 的功能嵌入到 Nginx HTTP 服务器中。该模块是OpenResty的核心组件
二、安装必须依赖
RedHat、CentOS 或 Fedora
pkg_manager=""
if command -v dnf &> /dev/null; then
export pkg_manager="dnf"
elif command -v yum &> /dev/null; then
export pkg_manager="yum"
fi
$pkg_manager install gcc-c++ pcre-devel zlib-devel make unzip libuuid-devel redhat-rpm-config.noarch openssl-devel
Ubuntu or Debian Ubuntu 或 Debian
sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip uuid-dev
三、编译安装模块
1、下载对应NG源码
- 请根据您的 nginx 版本,选择对应版本的源码进行下载,跨越版本会导致插件无法正常工作,可能会需要您重新编译
[root@localhost ~]# NG_VER=$(nginx -v 2>&1 | awk -F "/" '{ print $2 }')
[root@localhost ~]# echo ${NG_VER}
1.24.0
mkdir -p /opt/soft/ && cd $_
wget https://nginx.org/download/nginx-${NG_VER}.tar.gz | tar -xz
tar -xf nginx-${NG_VER}.tar.gz
2、下载安装模块
(1)安装LuaJIT解析器
# 把模块放在一个目录下,不要删除
mkdir -p /opt/soft/ && cd $_
# 使用以下命令克隆(下载)只读公共 git 存储库
git clone https://luajit.org/git/luajit.git
# 进入项目目录
cd luajit
# 执行编译和安装:
make && make install

(2)安装lua-nginx-module
# 把模块放在一个目录下,不要删除
mkdir -p /opt/soft/ && cd $_
# 定义版本
LUA_VERSION="0.10.27"
# 下载并解压
wget -O- https://github.com/openresty/lua-nginx-module/archive/v${LUA_VERSION}.tar.gz | tar -xz
# 更改目录名称
mv lua-nginx-module-${LUA_VERSION} lua-nginx-module
3、编译加载配置
# 保存编译选项
nginx -V 2>&1 | grep configure | sed -e 's/^configure arguments: //' -e 's/ --add-module.*$//' -e 's/ --add-dynamic-module.*$//' -e "s/'/\"/g" > /tmp/nginx_build_options.txt
# 进入到我们下载的Nginx源码解压后的目录下,然后通过下面的命令快速执行
cd /opt/soft/nginx-${NG_VER}
# 导入环境变量,告诉 Nginx 去哪里找 LuaJIT
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1
# 使用编译选项
eval "./configure $(cat /tmp/nginx_build_options.txt) --add-module=/opt/soft/lua-nginx-module"
4、构建模块
注意:注意只需要make不要进行make install,不然会覆盖原来的所有信息
[root@localhost ~]# cd /opt/soft/nginx-${NG_VER}
[root@localhost nginx-1.24.0]# make
5、替换Nginx文件
- 注意:我们可以先执行构建完成的nginx执行文件,确保模块添加进去了
./objs/nginx -V 2>&1 | grep lua-nginx-module

如果测试出现下面的报错:
./objs/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解决方案
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
(1)安装lua-resty
必须安装这个,不然nginx启动报如下错误

- 所需LUA API程序如下:
- lua-resty-core:https://github.com/openresty/lua-resty-core
- lua-resty-lrucache:https://github.com/openresty/lua-resty-lrucache
mkdir -p /opt/soft/ && cd $_
git clone https://github.com/openresty/lua-resty-core.git
cd lua-resty-core
make install LUA_LIB_DIR=/usr/local/share/lua/5.1
cd /opt/soft/
git clone https://github.com/openresty/lua-resty-lrucache.git
cd lua-resty-lrucache
make install LUA_LIB_DIR=/usr/local/share/lua/5.1
(2)备份旧nginx执行文件
注意:如果网站对用户影响不大,那么可直接停止nginx进行替换,否则建议低峰期或者平滑方式进行升级!
# 停止nginx
systemctl stop nginx
# 备份老的nginx文件
mv /usr/sbin/nginx /opt/nginx_`date +%F`
(3)拷贝新的nginx执行文件
# 拷贝新的nginx文件
cd /opt/soft/nginx-${NG_VER}
cp objs/nginx /usr/sbin/
# 重启nginx
systemctl start nginx
四、访问测试
- 在nginx配置的
server代码块里加入如下代码:
server {
listen 80;
server_name localhost;
location /hello_lua {
content_by_lua 'ngx.say("hello, lua!")';
}
}
# 重载配置并访问lua路径
nginx -t
nginx -s reload
curl http://127.0.0.1/hello_lua
hello, lua!

必须 注册 为本站用户, 登录 后才可以发表评论!