nginx安装配置Lua模块的支持

一、先来看几个概念问题

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 的时候 中途编译过程中报如下错误:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /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 命令的时候 报如下错误(如果没有 请忽略以下错误的解决方案 直接看后面的):

|----------------------------------------------------------------------------------------------------------------------------------------------|
| 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中。

相关推荐
泽虞13 分钟前
《LINUX系统编程》笔记p3
linux·运维·服务器·c语言·笔记·面试
苹果醋32 小时前
Java并发编程-Java内存模型(JMM)
java·运维·spring boot·mysql·nginx
dingcb1682 小时前
4090服务器无法sudo apt update 问题解决
运维·服务器
头发那是一根不剩了2 小时前
服务器硬盘进行分区和挂载
linux·运维·服务器
心一信息3 小时前
如何通过华为无线控制器添加一个名为yunwei的无线网络
运维·网络·华为
TDengine (老段)3 小时前
TDengine IDMP 运维指南(4. 使用 Docker 部署)
运维·数据库·物联网·docker·时序数据库·tdengine·涛思数据
三婶儿3 小时前
在没有客户端的客户环境下,如何用 Python 一键执行 MySQL 与达梦数据库 SQL
运维·后端·python
xcs194053 小时前
AI 自动化编程 trae 体验2 帮我分析一个项目
运维·自动化
彬彬醤4 小时前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
Sadsvit6 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos