lua-nginx-module 模块可以将Lua的强大功能嵌入NGINX服务器。

下载Nginx源码

如果已安装Nginx,需要查看当前安装版本的编译参数:

  1. $ /usr/local/nginx/sbin/nginx -V
  2. nginx version: nginx/1.12.2
  3. built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
  4. built with OpenSSL 1.0.1e-fips 11 Feb 2013
  5. TLS SNI support enabled
  6. configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre

其中configure arguments这个参数是非常重要的,我们在后面安装Lua模块的时候,需要以这个为基础,增加新的参数。

如果还没有安装Nginx,上面可以忽略。

Nginx下载页面:http://nginx.org/en/download.html

这里我们以 nginx/1.12.2 为例。需要获取源码:

  1. $ cd /opt/
  2. $ wget http://nginx.org/download/nginx-1.12.2.tar.gz
  3. $ tar -zxvf nginx-1.12.2.tar.gz

安装lua-nginx-module

需要先安装LuaJIT,并依赖ngx_devel_kit。

安装LuaJIT

LuaJIT官网:http://luajit.org/

我们安装最新稳定版(截止到2018-12-23):

  1. $ wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
  2. $ tar -zxvf LuaJIT-2.0.5.tar.gz
  3. $ cd LuaJIT-2.0.5
  4. $ make install PREFIX=/usr/local/LuaJIT

安装成功最后一行输出会提示:

  1. ==== Successfully installed LuaJIT 2.0.5 to /usr/local/LuaJIT ====

/etc/profile 文件末尾加入环境变量:

  1. export LUAJIT_LIB=/usr/local/LuaJIT/lib
  2. export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

然后:

  1. $ source /etc/profile

安装ngx_devel_kit

项目地址:https://github.com/simplresty/ngx_devel_kit

下载并解压,不需要安装:

  1. $ cd /opt/
  2. $ wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.0.tar.gz
  3. $ tar zxvf v0.3.0.tar.gz
  4. $ ls | grep ngx_devel_kit
  5. ngx_devel_kit-0.3.0

安装lua-nginx-module

项目地址:https://github.com/openresty/lua-nginx-module

下载并解压,不需要安装:

  1. $ cd /opt/
  2. $ wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
  3. $ tar zxvf v0.10.13.tar.gz
  4. $ ls | grep lua-nginx
  5. lua-nginx-module-0.10.13

编译Nginx

需要安装pcre依赖库

  1. $ yum install readline-devel pcre-devel openssl-devel

Nginx编译参数配置:

  1. $ cd /opt/nginx-1.12.2/
  2. $ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-module=/opt/ngx_devel_kit-0.3.0 --add-module=/opt/lua-nginx-module-0.10.13

这里因为已经安装了Nginx,所以这里的参数是从Nginx -V的输出里获取的,并追加了新的参数:

  1. --with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-module=/opt/ngx_devel_kit-0.3.0 --add-module=/opt/lua-nginx-module-0.10.13

运行上面的./configure后进行编译安装:

  1. $ make -j2
  2. $ make install

make install后,会覆盖之前安装的Nginx。

测试lua-nginx-module

/usr/local/nginx/conf/nginx.confserver代码块里加入如下代码:

  1. location /hello {
  2. default_type 'text/plain';
  3. return 200 'hello echo!';
  4. }
  5. location /hello_lua {
  6. default_type 'text/plain';
  7. content_by_lua 'ngx.say("hello, lua!")';
  8. }

注意:重新编译 Nginx 二进制,Nginx 需要停止重启。而普通配置更新则 reload 即可:

  1. $ kill -QUIT `cat /usr/local/nginx/logs/nginx.pid` && /usr/local/nginx/sbin/nginx

如果支持service nginx restart,则可以这样重新启动:

  1. $ service nginx restart && /usr/local/nginx/sbin/nginx -s reload

然后curl测试:

  1. $ curl http://127.0.0.1/hello
  2. hello echo!
  3. $ curl http://127.0.0.1/hello_lua
  4. hello, lua!

防盗版声明:本文系原创文章,发布于公众号飞鸿影的博客(fhyblog)及博客园,转载需作者同意。


编译动态模块

lua-nginx-module 支持以动态模块方式加载,详见:https://github.com/openresty/lua-nginx-module#building-as-a-dynamic-module 。Nginx版本需要 >=1.9.11

  1. $ cd /opt/nginx-1.12.2/
  2. $ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-ld-opt=-Wl,-rpath,/usr/local/LuaJIT/lib --add-dynamic-module=/opt/ngx_devel_kit-0.3.0 --add-dynamic-module=/opt/lua-nginx-module-0.10.13
  3. $ make -j2
  4. $ make install

相比静态编译,参数--add-module改成了--add-dynamic-module

编译成功后,会把模块安装在nginx/modules/目录。查看:

  1. $ ls /usr/local/nginx/modules/
  2. ndk_http_module.so ngx_http_lua_module.so

接下来我们需要在nginx.conf配置中加入以下两行,实现动态调用模块:

  1. load_module /usr/local/nginx/modules/ndk_http_module.so;
  2. load_module /usr/local/nginx/modules/ngx_http_lua_module.so;

注意:load_module指令不能放在 http{} 里面:

  1. worker_processes 1;
  2. load_module xxx;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. }

接下来可以按上面的 测试lua-nginx-module 小节测试。唯一不同的是无需使用kill -QUIT退出Nginx,直接使用nginx -s reload热重启就行了。

关于Nginx编译动态模块

NGINX 从 1.9.11 版本起,引入了一个新的模块加载方式:动态加载。这意味着模块可以根据配置文件,在 NGINX 运行时动态的加载。同样,也可以通过修改配置文件然后 Reload NGINX 来卸载模块。从此不再需要替换nginx文件即可增加第三方扩展。

如果是相同机器,可以直接把已编译好的so文件复制到另外一台机器,直接修改nginx.conf即可载入相应模块,这样可以节省编译时间及可能产生的问题。

注意:不是所有模块都可以转换成动态模块。目前官方只有几个模块支持动态加载,第三方模块需要升级支持才可编译成模块:

  1. $ ./configure --help | grep dynamic
  2. --with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module
  3. --with-http_image_filter_module=dynamic
  4. enable dynamic ngx_http_image_filter_module
  5. --with-http_geoip_module=dynamic enable dynamic ngx_http_geoip_module
  6. --with-http_perl_module=dynamic enable dynamic ngx_http_perl_module
  7. --with-mail=dynamic enable dynamic POP3/IMAP4/SMTP proxy module
  8. --with-stream=dynamic enable dynamic TCP/UDP proxy module
  9. --with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
  10. --add-dynamic-module=PATH enable dynamic external module
  11. --with-compat dynamic modules compatibility

模块API对于静态模块和动态模块是一致的,但是 config 文件和编译方法略微不同。详见:https://gist.github.com/undirectlookable/2a39cc85b16e2218f162#file-nginx_static_to_dynamic_modules-zh-cn-md

参考

1、Nginx编译安装Lua模块遇到的大坑 - 刘信坚的博客 - CSDN博客

https://blog.csdn.net/qq_38974634/article/details/81625075

2、Nginx安装lua-nginx-module模块 - 微信-大数据从业者 - 博客园

https://www.cnblogs.com/felixzh/p/8709201.html

3、nginx启动、重启、重新加载配置文件和平滑升级 - 蝈蝈的博客 - CSDN博客

https://blog.csdn.net/gnail_oug/article/details/52754491

4、[译] NGINX - 将静态模块转换为动态模块

https://gist.github.com/undirectlookable/2a39cc85b16e2218f162

5、How to Compile Dynamic Modules for NGINX Plus

https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/

6、Nginx 添加nginx_lua_module模块 | 封尘网

https://www.58jb.com/html/182.html

7、NGINX 加载动态模块(NGINX 1.9.11开始增加加载动态模块支持) - Tinywan - 博客园

https://www.cnblogs.com/tinywan/p/6965467.html

Nginx编译安装lua-nginx-module的更多相关文章

  1. nginx编译安装

    Nginx编译安装 1.nginx官网:http://wiki.nginx.org/Install下载:http://nginx.org/en/download.html 2.编译安装# wget h ...

  2. nginx编译安装支持lua脚本

    一.准备编译环境 1.操作系统:CentOS7.6 2.安装编译所需安装包 yum install gcc pcre pcre-devel zlib zlib-devel openssl openss ...

  3. Nginx编译安装第三方模块http_substitutions_filter_module2222

    Nginx编译安装第三方模块http_substitutions_filter_module Rming -- 阅读 安装 Http 编译 module filter nginx 模块 >> ...

  4. Nginx编译安装第三方模块http_substitutions_filter_module

    Nginx编译安装第三方模块http_substitutions_filter_module 分类:服务器技术  作者:rming  时间:-- . >>ngx_http_substitu ...

  5. 在 CentOS7最小化 下的编译安装:Nginx 1.5.2 + PHP 5.5.7 + MySQL 5.6.10

    1.安装Nginx: 安装包目录 mkdir -p /Data/tgzcd /Data/tgz 安装编译依赖 yum install wget yum install pcre yum install ...

  6. LNMP平台搭建之一:nginx编译安装

    参考博客:https://www.cnblogs.com/zhang-shijie/p/5294162.html   jack.zhang 一.环境说明 系统环境:centos6.5 [root@lo ...

  7. Nginx编译安装:

    第三方模块 在nginx.org   --------  wiki  找 --add-module=   添加 Nginx编译安装: 安装开发环境 ]# yum groupinstall " ...

  8. Nginx之编译安装的nginx加入systemctl

    编译安装的nginx需要添加rc.local 编译安装后设置 /usr/lib/systemd/system/nginx.service [Unit] Description=nginx After= ...

  9. [nginx]编译安装及安全优化

    nginx配置-最后整理版 nginx_upstream_check_module nginx-module-vts nginx打补丁 nginx编译安装 - 下载 cd /usr/local/src ...

随机推荐

  1. 20155312 张竞予 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 目录 基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 实验总结与体会 实践过程记录 (1)简单应用SET工具建 ...

  2. Struts2内建拦截器

    params拦截器 负责将请求参数设置为Action属性 staticParams拦截器 将配置文件中action元素的子元素param参数设置为Action属性 servletConfig拦截器 将 ...

  3. 移动端canvas文字图片合成并生成图片(canvas宽度自适应移动端屏幕)

    这是我之前做的一个关于文字图片合成的代码,供大家参考,不足支出还望体谅:具体的注释在代码里都有,有什么不懂了可以留言互相交流.<!DOCTYPE html> <html lang=& ...

  4. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

  5. 【收藏】JS获取鼠标的X,Y坐标位置

    JS的方法: <html> <head> <meta http-equiv="Content-Type" content="text/htm ...

  6. <笔记>Apache+PHP+MYSQL配置

    (1)Apache的the requested operation has failed错误: cmd—输入netstat –ano,可看到80端口已被进程占用,PID为4 打开任务管理器—〉查看—〉 ...

  7. 初识Dubbo+Zookeeprt搭建SOA项目

    由于工作中天天和Dubbo打交道,天天写对外服务,所以有必要自己动手搭建一个Dubbo+zookeeper项目来更更深层次的认识Dubbo 首先了解一下SOA: 英文名称(Service Orient ...

  8. hbuilder下用plus.barcode.Barcode做二维码扫描,当二维码容器的高度设置过低时,启动扫描会发生闪退

    解决办法: 将固定高度改为百分比

  9. 设置npm的registry

    .原npm地址 npm config set registry http://registry.npmjs.org .设置国内镜像 a.通过config命令 npm config set regist ...

  10. Python中用random产生随机数的用法

    >>>random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 >>>random.unifo ...