nginx安装配置Lua模块的支持

简介: 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中。

相关文章
|
11天前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解
|
19天前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
192 0
|
23天前
|
应用服务中间件 Linux nginx
Jetson 环境安装(四):jetson nano配置ffmpeg和nginx(亲测)之编译错误汇总
这篇文章是关于在Jetson Nano上配置FFmpeg和Nginx时遇到的编译错误及其解决方案的汇总。
63 4
|
4天前
|
应用服务中间件 API nginx
nginx配置反向代理404问题
【10月更文挑战第18天】本文介绍了使用Nginx进行反向代理的配置方法,解决了404错误、跨域问题和302重定向问题。关键配置包括代理路径、请求头设置、跨域头添加以及端口转发设置。通过调整`proxy_set_header`和添加必要的HTTP头,实现了稳定的服务代理和跨域访问。
nginx配置反向代理404问题
|
26天前
|
XML 前端开发 JavaScript
Nginx 安装配置
10月更文挑战第5天
82 4
Nginx 安装配置
|
24天前
|
编解码 Ubuntu 应用服务中间件
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
本文介绍了在NVIDIA Jetson Nano上配置FFmpeg和Nginx的步骤,包括安装、配置和自启动设置。
110 1
Jetson 环境安装(三):jetson nano配置ffmpeg和nginx(亲测)
|
8天前
|
缓存 负载均衡 应用服务中间件
Nginx配置
【10月更文挑战第22天】在实际配置 Nginx 时,需要根据具体的需求和环境进行调整和优化。同时,还需要注意配置文件的语法正确性和安全性。
27 7
|
17天前
|
前端开发 JavaScript 应用服务中间件
终极 Nginx 配置指南
本文介绍了Nginx的基本配置及其优化方法。首先,通过删除注释简化了Nginx的默认配置文件,使其更易于理解。接着,文章将Nginx配置文件分为全局块、events块和http块三部分进行详细解释。此外,还提供了如何快速上线网站、解决前端history模式404问题、配置反向代理、开启gzip压缩、设置维护页面、在同一IP上部署多个网站以及实现动静分离的具体配置示例。最后,附上了Nginx的基础命令,包括安装、启动、重启和关闭等操作。
|
22天前
|
负载均衡 应用服务中间件 nginx
Nginx的6大负载均衡策略及权重轮询手写配置
【10月更文挑战第9天】 Nginx是一款高性能的HTTP服务器和反向代理服务器,它在处理大量并发请求时表现出色。Nginx的负载均衡功能可以将请求分发到多个服务器,提高网站的吞吐量和可靠性。以下是Nginx支持的6大负载均衡策略:
103 7
|
23天前
|
缓存 前端开发 应用服务中间件
CORS跨域+Nginx配置、Apache配置
CORS跨域+Nginx配置、Apache配置
96 7