Nginx / 系统运维 / 网站服务

基于包管理器安装的Nginx添加Lua模块

浅时光博客 · 2月18日 · 2025年 · · 3.6k 次已读

一、所需模块简述


LuaJIT解析器:

LuaJIT 是 Lua 语言的高性能即时编译器(Just-In-Time Compiler,简称 JIT)。它显著提升了 Lua 脚本的执行速度,使 Lua 在需要高性能的应用场景中表现出色。LuaJIT 解析器具备以下几个关键特性:

  1. 即时编译(JIT)LuaJIT 能将 Lua 代码在运行时编译成本地机器码,大幅减少解释执行带来的性能损耗。这使得 LuaJIT 在执行复杂计算或需要高吞吐量的任务时表现优异。
  2. 兼容性高:LuaJIT 完全兼容标准 Lua 5.1,支持大部分 Lua 5.2 和 5.3 的特性。这意味着现有的 Lua 代码大多数情况下可以无缝迁移到 LuaJIT 上运行。
  3. 轻量级和嵌入式:LuaJIT 保持了 Lua 的轻量级特文章来源(Source):浅时光博客性,适合嵌入到各种应用程序中,如游戏引擎、网络服务器等,提供脚本扩展能力。
  4. 高效的 FFI(外部函数接口):LuaJIT 提供了强大的 FFI 接口,允许 Lua 代码直接调用 C 函数和操作 C 数据结构,进一步提升了性能和灵活性。
  5. 跨平台支持: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 主要特性和优势包括:

  1. 高性能:依托于 LuaJIT 的高效执行,lua-nginx-module 能在保持 Nginx 高吞吐量的同时,提供复杂的逻辑处理能力。
  2. 灵活的配置扩展:通过 Lua 脚本,开发者可以在 Nginx 配置中添加自定义的逻辑,如动态路由、访问控制、内容过滤等,超越了传统配置指令的限制。
  3. 事件驱动编程:lua-nginx-module 支持基于 Nginx 事件模型的异步编程,适合处理高并发和 I/O 密集型任务,如非阻塞的网络请求和数据库操作。
  4. 丰富的 API:模块提供了丰富的 Nginx API,允许 Lua 脚本访问请求和响应的各个部分,操作 HTTP 头、处理 Cookies、管理会话等。
  5. 集成第三方库:通过 LuaRocks 等包管理工具,开发者可以方便地集成各种第三方 Lua 库,扩展 Nginx 的功能,如缓存机制、加密算法、数据解析等。
  6. 简化复杂任务:某些复杂的逻辑处理,如动态内容生成、A/B 测试、限流策略等,通过 Lua 脚本可以更简洁、高效地实现,减少对多个中间件的依赖。
  7. 社区和文档支持: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启动报如下错误

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!


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/18489.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

0 条回应

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