zoukankan      html  css  js  c++  java
  • Nginx编译安装lua-nginx-module

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

    下载Nginx源码

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

    $ /usr/local/nginx/sbin/nginx -V
    nginx version: nginx/1.12.2
    built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
    built with OpenSSL 1.0.1e-fips 11 Feb 2013
    TLS SNI support enabled
    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 为例。需要获取源码:

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

    安装lua-nginx-module

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

    安装LuaJIT

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

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

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

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

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

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

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

    然后:

    $ source /etc/profile
    

    安装ngx_devel_kit

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

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

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

    安装lua-nginx-module

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

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

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

    编译Nginx

    需要安装pcre依赖库

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

    Nginx编译参数配置:

    $ cd /opt/nginx-1.12.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的输出里获取的,并追加了新的参数:

    --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后进行编译安装:

    $ make -j2
    $ make install
    

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

    测试lua-nginx-module

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

    location /hello { 
        default_type 'text/plain';
        return 200 'hello echo!';
    }
    
    location /hello_lua { 
        default_type 'text/plain'; 
        content_by_lua 'ngx.say("hello, lua!")'; 
    }
    

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

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

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

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

    然后curl测试:

    $ curl http://127.0.0.1/hello
    hello echo!
    
    $ curl http://127.0.0.1/hello_lua
    hello, lua!
    

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


    编译动态模块

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

    $ cd /opt/nginx-1.12.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
    
    $ make -j2
    $ make install
    

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

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

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

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

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

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

    worker_processes  1;
    
    load_module xxx;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
    
    }
    

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

    关于Nginx编译动态模块

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

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

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

    $ ./configure --help | grep dynamic
      --with-http_xslt_module=dynamic    enable dynamic ngx_http_xslt_module
      --with-http_image_filter_module=dynamic
                                         enable dynamic ngx_http_image_filter_module
      --with-http_geoip_module=dynamic   enable dynamic ngx_http_geoip_module
      --with-http_perl_module=dynamic    enable dynamic ngx_http_perl_module
      --with-mail=dynamic                enable dynamic POP3/IMAP4/SMTP proxy module
      --with-stream=dynamic              enable dynamic TCP/UDP proxy module
      --with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
      --add-dynamic-module=PATH          enable dynamic external module
      --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

  • 相关阅读:
    周记
    读书笔记
    我是一只IT小小鸟
    回车键完全替代模拟鼠标单击事件
    去除Flexgrid表格的隔行底色为白的样式
    Flexgrid中的sortable设为false的时候abbr属性也不存在的原因及解决办法
    Flexigrid列之间的拖拉线条在某些浏览器中不能很好地与栏目边缘重合解决方法介绍
    用基于openssl产生的密钥实现PHP和.NET端的RSA加解密互通
    CSS3轮播图
    淘宝放大镜
  • 原文地址:https://www.cnblogs.com/52fhy/p/10164553.html
Copyright © 2011-2022 走看看