一、先来看几个概念问题

1.1 为什么需要?

nginx官方自带了非常多的核心模块,再加上第三方的模块能够满足我们大部分的业务需要,但是业务的需求、业务的场景变化需要添加一些额外的功能,如果自己去开发一个nginx模块相对来说比较笨重,我们可以使用lua脚本直接内嵌到nginx当中实现一些业务逻辑,完成一些特殊的功能需求。

1.2 什么是Lua?

Lua是一种轻量级、可嵌入式的脚本语言,可以非常容易的嵌入到其他语言中使用。用标准C语言编写并以源代码形式开放。设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。另外Lua提供了协程并发,即以同步调用的方式进行异步执行,从而实现并发,比起回调机制的并发来说代码更容易编写和理解,排查问题也会容易。

Lua编写过的项目:

  • 魔兽世界

  • 仙剑奇侠传5

  • 金庸群侠传lua版本

1.3 什么是ngx_lua?

ngx_lua是nginx的一个模块,将Lua嵌入到nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到nginx中运行,即 nginx变成了一个web容器。这样开发人员就可以使用Lua语言开发高性能的web应用了。

1.4 部分应用场景

理论上可以使用ngx_lua开发各种复杂的web应用,不过Lua是一种脚本/动态语言,不适合业务逻辑比较重的场景,适合小巧的应用场景,代码行数保持在几十行到几千行。目前见到的一些应用场景如下:

  • web应用:会进行一些业务逻辑处理,甚至进行耗CPU的模板渲染,一般流程:mysql/redis/http获取数据、业务处理、产生JSON/XML/模板渲染内容,比如京东的列表页/商品详情页。

  • 接入网关:实现如数据校验前置、缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控等功能,比如京东的交易大nginx节点、无线部门开发的无线网关、单品页统一服务、实时价格、动态服务。

  • web防火墙:可以进行IP/URL/UserAgent/Referer黑名单、限流等功能。

  • 缓存服务器:可以对响应内容进行缓存,减少到后端的请求,从而提升性能。

二、安装nginx的lua模块支持

2.1 安装lua脚本语言

# 1、步骤一:下载并安装lua

wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz  #下载lua脚本语言 

     tar -zxvf LuaJIT-2.0.5.tar.gz  # 解压

      

     cd LuaJIT-2.0.5 # 进入解压后的lua文件夹

      

     make && make install PREFIX=/usr/local/LuaJIT #编译并安装lua脚本语言 PREFIX=lua脚本语言安装到的目录 可以自己随意更改

      

      

      

# 2、步骤二:配置环境变量

vim /etc/profile

# 加入下面2行lua的环境变量,注意自己lua的安装路径

export LUAJIT_LIB=/usr/local/LuaJIT/lib

export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

# 保存后,使用以下命令 使当前窗口的环境变量立即生效    

source /etc/profile

# 查看当前lua语言的版本

lua -v # 成功输出lua语言的版本的话,则表示lua语言安装成功

2.2 下载并解压ngx_devel_kit模块和lua-nginx-module模块

备注说明:

  • NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。  NDK提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量。

  • lua-nginx-module模块:使nginx中能直接运行lua脚本

# 注意:我这里都是下载到/root目录下了

# 下载

wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz

wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz

# 解压

tar -zxvf ngx_devel_kit-0.3.0.tar.gz 

tar -zxvf lua-nginx-module-0.10.9rc7.tar.gz

2.3 重新编译nginx加入lua模块的支持

nginx -V 查看当前nginx已经编译安装好的配置模块

我这里的配置如下:

--user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/root/lnmp1.6/src/openssl-1.1.1c --with-openssl-opt='enable-weak-ssl-ciphers'

进入之前安装nginx的源码包目录,需要重新编译安装nginx(在nginx -V得到的配置下,加入ngx_devel_kit-0.3.0和ua-nginx-module-0.10.2的目录),最终的配置如下:

# 啰嗦一句。。。下面的步骤是在nginx的源码包目录进行的,下面的./configure可执行文件在nginx源码包目录中有

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/root/lnmp1.6/src/openssl-1.1.1c --with-openssl-opt='enable-weak-ssl-ciphers' --add-module=/root/lua-nginx-module-0.10.9rc7 --add-module=/root/ngx_devel_kit-0.3.0

# 就是在nginx原有编译安装配置好的基础上增加了--add-module=/your path/lua-nginx-module-0.10.9rc7和--add-module=/your path/ngx_devel_kit-0.3.0

开始编译并安装(编译安装后新产生的nginx不会把之前配置好的nginx.conf文件中的配置给覆盖掉 放心)

# 开始编译并且安装

make && make install

问题一:如果执行 make && make install 的时候 中途编译过程中报如下错误:

QQ截图20210412204830.png

/root/lua-nginx-module-0.10.9rc7/src/ngx_http_lua_module.c: In function ‘ngx_http_lua_merge_srv_conf’:

/root/lua-nginx-module-0.10.9rc7/src/ngx_http_lua_module.c:1022:37: error: passing argument 2 of ‘SSL_CTX_sess_set_get_cb’ from incompatible pointer type [-Werror]

                                     ngx_http_lua_ssl_sess_fetch_handler);

                                     ^

In file included from src/event/ngx_event_openssl.h:15:0,

                 from src/core/ngx_core.h:83,

                 from /root/lua-nginx-module-0.10.9rc7/src/ddebug.h:13,

                 from /root/lua-nginx-module-0.10.9rc7/src/ngx_http_lua_module.c:11:

/root/lnmp1.6/src/openssl-1.1.1c/.openssl/include/openssl/ssl.h:720:6: note: expected ‘struct SSL_SESSION * (*)(struct ssl_st *, const unsigned char *, int,  int *)’ but argument is of type struct SSL_SESSION * (*)(struct SSL *, u_char *, int,  int *)’

 void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx,

      ^

cc1: all warnings being treated as errors

make[1]: *** [objs/addon/src/ngx_http_lua_module.o] Error 1

make[1]: Leaving directory `/root/lnmp1.6/src/nginx-1.16.1'

make: *** [build] Error 2

[root@izm5e8vp7zjro140az4o97z nginx-1.16.1]#

产生的报错原因:我们在编译配置的时候指定了--with-openssl=/root/lnmp1.6/src/openssl-1.1.1c,而lua-nginx-module模块和openssl 1.1.1不兼容 有冲突,所以我们换成openssl 1.0.2(如果没有 就自行下载源码包并解压,然后重新指定--with-openssl=openssl1.0.2的版本目录路径)就好了

解决该问题的方案(重新指定nginx编译参数中的--with-openssl选项为openssl 1.0.2版本)最终nginx的编译配置如下:

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/root/lnmp1.6/src/openssl-1.0.2s --with-openssl-opt='enable-weak-ssl-ciphers' --add-module=/root/lua-nginx-module-0.10.9rc7 --add-module=/root/ngx_devel_kit-0.3.0

# 上面这一步执行完成后 再次执行 编译并安装 即:

make && make install

一炷香的时间过后......(开个玩笑^_^)

再次执行 nginx -V 命令

作用:查看当前nginx已经编译安装好的配置模块(主要查看ngx_devel_kit和lua-nginx-module模块是否已经安装上)

问题二:如果执行 nginx -V 命令的时候 报如下错误(如果没有 请忽略以下错误的解决方案 直接看后面的):

123.png

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

产生该报错的原因一般有如下2个:

  • 一个是 操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可。

  • 另外一个原因就是 已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件。

所以安装共享库后要注意共享库路径设置问题= = 

解决该问题的方案如下:

# 执行这一步 将 /usr/local/LuaJIT/lib 添加到 /etc/ld.so.conf文件中

echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf

# 执行这一步 相当于 重新读取/etc/ld.so.conf文件中的内容

ldconfig

再次执行 nginx -V 命令查看ngx_devel_kit和lua-nginx-module模块是否已经安装上:(如果顺利的话)

--user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/root/lnmp1.6/src/openssl-1.0.2s --with-openssl-opt=enable-weak-ssl-ciphers --add-module=/root/lua-nginx-module-0.10.9rc7 --add-module=/root/ngx_devel_kit-0.3.0

PS:上面列出的nginx编译安装好的配置中 看到了ngx_devel_kit和lua-nginx-module模块已经被安装进nginx中了,经过一番折腾后,终于 让nginx支持使用Lua模块了,现在我们可以使用Lua脚本语言给nginx开发自己想要的扩展功能了  ^_^ 大功告成了= = 

三、验证nginx使用Lua语言

在nginx中的nginx.conf配置文件中的一个server段代码里面,加入以下代码:

location /lua{

        default_type 'text/plain';

        content_by_lua 'ngx.say("hello,lua!!!")';

        }

保存退出后,重启nginx

浏览器访问 www.yourdomain.com/lua  或者 ip地址/lua  如果浏览器输出 hello,lua!!!  则表示成功~~

尾声补充、关于上面中解决问题出现的 ldconfig 命令的说明

ldconfig命令的用途:主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 从而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表。

如果共享库文件安装到了/lib或/usr/lib(很多开源的共享库都会安装到该目录下)目录下,那么只需要执行一下 ldconfig 命令。

如果共享库文件安装到了其它“非/lib或/usr/lib“目录下,那么在执行 ldconfig 命令前,还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91342.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91342.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91342.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧矿山低光照识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析,核心技术参数与架构引用自《陌讯技术白皮书》,禁止未经授权的转载与商用。一、行业痛点:智慧矿山的视觉识别困境矿山场景的视觉监控一直面临多重技术挑战:井下巷道长期处于低光照环境(光照…

AI赋能操作系统:通往智能运维的未来

一、具备AI能力的操作系统未来的操作系统如果具备了AI能力,那将彻底改变我们管理和保护服务器的方式。一旦AI能力被充分集成并启用,自动优化、安全检测和漏洞修复的潜力将变得无比巨大且切实可行。想象一下未来的服务器管理:不再需要人工夜以…

sqli-labs:Less-13关卡详细解析

1. 思路🚀 本关的SQL语句为: $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入类型:字符串型(单引号、括号包裹)、POST请求提示:参数…

微软发布Microsoft Sentinel数据湖国际版

在网络安全威胁持续升级的背景下,微软宣布推出Microsoft Sentinel数据湖(国际版),以突破性架构重塑企业安全运营能力。该产品目前已进入公开预览阶段,标志着安全信息与事件管理(SIEM)领域正式迈…

力扣面试150题--只出现一次的数字II

Day 92 题目描述思路 初次思路:想不出来 哈哈哈指挥hash 就不放出来丢人了 题解思路:这个做法是每次确定一个位是否为答案为1 的位 具体是这样的:由于除了答案外每个数字都会出现3次,那么我们不考虑答案的情况,那么一个…

cacti的RCE

一、环境搭建 1、安装docker curl -fsSL https://get.docker.com | sh 验证docker是否正确安装 docker version 验证docker compose是否可用 docker compose version 2、在GitHub上拉取 vulhub 首先先装一个proxychains网络代理工具,如果直接拉取的话速度会…

Spark SQL 的 SQL 模式和 DSL模式

下面我将详细讲解如何使用 Spark SQL 分别通过 SQL 模式和 DSL(Domain Specific Language)模式实现 WordCount 功能。WordCount 是大数据处理中的经典案例,主要功能是统计文本中每个单词出现的次数。准备工作首先需要初始化 SparkSession&…

03 基于sklearn的机械学习-线性回归、损失函数及其推导

线性回归 分类的目标变量是标称型数据,回归是对连续型的数据做出预测。 一、标称型数据(Nominal Data) 标称型数据属于分类数据(Categorical Data) 的一种,用于描述事物的类别或属性,没有顺序或…

TTS语音合成|f5-tts语音合成服务器部署,实现http访问

p; 上篇文章分享了如何使用GPT-SoVITS实现一个HTTP服务器,并通过该服务器提供文本到语音(TTS)服务。今天,我们将进一步探讨如何部署另一个强大的TTS模型——f5-tts。这个模型在自然语音生成方面表现出色,具有高度的可…

【Golang】Go语言指针

Go语言指针 文章目录Go语言指针一、指针1.1、Go语言中的指针1.1.1、指针地址和指针类型1.1.2、指针取值1.1.3、空指针1.1.4、new和make1.1.5、new1.1.6、make1.1.7、new与make的区别一、指针 区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全…

EMC的一些简单常识

ESD测试比对 & 需要做到动作 试验: -780系统,板子直流地 和 PE连接(主板PE & DC-分开,但是前端板PE & DC-连接),只能承受1K接触放电。 -780系统,板子直流地 和 PE分开(主…

Day4||vue-计算属性

一.定义概念:基于现有的数据,计算出来的新属性。依赖的数据变化,自动重新计算。语法:声明需要放在computed的配置项中,一个计算属性对于一个函数。使用起来和普通属性一样使用{{计算属性名}}计算属性->可以将一段求…

编程算法在金融、医疗、教育、制造业等领域的落地案例

随着人工智能与大数据技术的迅猛发展,编程算法已从理论研究走向实际应用,在金融、医疗、教育、制造业等多个关键领域实现了深度落地。这些算法不仅提升了业务效率,还推动了行业智能化转型。本文将系统性地分析编程算法在四大核心领域的典型应…

vue npm install卡住没反应

install某个插件的时候,发现卡住不动,可以尝试以下解决方法 1.使用–verbose查看安装详情 npm install consola --verbose2.更换淘宝镜像(一般都是淘宝镜像正式过期问题) 查看当前镜像 npm config get registry更换淘宝镜像 第一种…

【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)

今天,我们就来聊聊如何在Unity中使用CharacterController组件,让角色能够灵活移动,在游戏世界里像风一样自由奔跑吧。废话不多说,走,让我们马上来一探究竟!目录:1.准备模型2.动画的处理3.为角色…

AI Agent开发学习系列 - langchain之LCEL(4):Memory

Memory的添加方式 from operator import itemgetterfrom langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import RunnableLambda, RunnablePassthrough from l…

向Coze学习,我们把这些工作流也开源了

要说现在最火的工作流是什么,那非视频工作流莫属了。我每天也都能接到不少咨询短视频工作流的需求。 这大半年来我们团队也制作和整理了超过 100 工作流,其中很大一部分都是现在最火的视频工作流。 为了向Coze开源致敬,这次我们斑码团队也决…

Git 从零开始:完整项目上传指南

一、准备工作 1. 安装 Git Windows:下载安装包macOS:在终端运行 brew install gitLinux: # Ubuntu/Debian sudo apt update && sudo apt install git# CentOS/Fedora sudo yum install git2. 配置用户信息(首次使用&am…

【AI】入门级提示词模板:适用于ChatGPT、文心一言等主流模型

入门级提示词模板:适用于 ChatGPT、文心一言等主流模型**在当下这个人工智能飞速发展的时代,ChatGPT、文心一言等主流大模型已经广泛地融入到我们的工作与生活当中。不管是创作文章、生成代码,还是进行数据分析、获取创意灵感,这些…

如何解决 undetected_chromedriver 启动慢问题

要解决 undetected_chromedriver 启动慢的问题,可以从以下几个方面优化配置和代码: 1. 指定本地 Chrome 二进制路径 避免自动搜索 Chrome 路径,直接指定位置: driver uc.Chrome(browser_executable_pathrC:\Program Files\Google…