封尘网

让学习成为一种习惯!

Nginx 添加nginx_lua_module模块

其实直接使用openresty可能会更加简单、但是我希望自己通过实验去掌握Nginx添加第三方模块的方法。所以就有了以下记录。

整合Lua的原因:
•同步非阻塞
•语法简单,类似javascript
•适合访问量大需要高性能且逻辑相对简单的服务
•结合nginx使用方便

系统:Centos6.5_x86_64
Nginx:1.12.2
LuaJIT:2.0.5
lua-nginx-module:0.10.11

软件包下载地址:

http://luajit.org/download/LuaJIT-2.0.5.tar.gz
https://github.com/simplresty/ngx_devel_kit/releases
https://github.com/openresty/lua-nginx-module/releases
http://nginx.org/download/nginx-1.12.2.tar.gz

安装依赖包,避免编译出错:

yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel gcc g++ gcc-c++ gd-devel

安装配置LuaJIT:因为nginx_lua_module需要它来解析Lua

tar xf LuaJIT-2.0.5.tar.gz 
cd LuaJIT-2.0.5 
make install prefix=/usr/local/luajit 
make install

添加一个用户:

useradd -s /sbin/nginx -M nginx

编译Nginx,这里使用动态加载模块的方法。自1.9.11开始,nginx支持动态加载模块,但是需要在编译时指定类似如:—add-dynamic-module=

tar xf lua-nginx-module-0.10.11.tar.gz 
tar xf nginx-1.12.2.tar.gz 

cd nginx-1.12.2 
./configure \ 
--prefix=/opt/nginx \ 
--sbin-path=/usr/sbin/nginx \ 
--conf-path=/etc/nginx/nginx.conf \ 
--pid-path=/var/run/nginx.pid \ 
--lock-path=/var/lock/nginx.lock \ 
--user=nginx \ 
--group=nginx \ 
--with-http_ssl_module \ 
--with-http_gzip_static_module \ 
--with-http_realip_module \ 
--with-http_stub_status_module \ 
--with-http_sub_module \ 
--add-dynamic-module=../ngx_devel_kit-0.3.0 \ 
--add-dynamic-module=../lua-nginx-module-0.10.11 

make && make install

安装成功后需要引入模块不然是没效果的。

在nginx.conf配置中加入以下两行,实现动态调用模块,不能放在http{}中。

load_module /opt/nginx/modules/ndk_http_module.so; 
load_module /opt/nginx/modules/ngx_http_lua_module.so;

检查Nginx的配置时出现以下异常:

[root@nginx-01 nginx-1.12.2]# nginx -t 
nginx: [emerg] dlopen() "/opt/nginx/modules/ngx_http_lua_module.so" failed (libluajit-5.1.so.2: cannot open shared object file: No such file or directory) in /etc/nginx/nginx.conf:9 
nginx: configuration file /etc/nginx/nginx.conf test failed

原因是找不到文件,其它文件已经安装了,只是它的路径和文件名不同,所以做一个软连接即可。

解决方法:

[root@nginx-01 nginx-1.12.2]# find / -name "libluajit-5.1.so" 
/usr/local/lib/libluajit-5.1.so 
[root@nginx-01 nginx-1.12.2]# ln -sf /usr/local/lib/libluajit-5.1.so /lib64/libluajit-5.1.so.2

接下来就是测试效果:

示例:
简化一下配置文件,并添加一个目录和测试文件;

[root@nginx-01 conf.d]# egrep -v "^#|^$" ../nginx.conf 
worker_processes  1; 
load_module /opt/nginx/modules/ndk_http_module.so; 
load_module /opt/nginx/modules/ngx_http_lua_module.so; 
events { 
    worker_connections  1024; 
} 
http { 
    include       mime.types; 
    default_type  application/octet-stream; 
    sendfile        on; 
    keepalive_timeout  65; 
    include conf.d/*.conf; 
}

创建目录:

mkdir -p /etc/nginx/conf.d/lua

添加一个配置文件: app.conf

server { 
    listen       80; 
    server_name  localhost; 
    charset utf-8; 

    location / { 
        default_type "text/html"; 
        #content_by_lua 'ngx.say("<h1>Nginx Lua Hello World!</h1>")'; 
        content_by_lua_file /etc/nginx/conf.d/lua/test.lua; 
    } 
    location /add { 
        default_type "text/html"; 
        set $res ''; 

        rewrite_by_lua ' 
            local a = tonumber(ngx.var.arg_a) or 0 
            local b = tonumber(ngx.var.arg_b) or 0 
            ngx.var.res = a + b 
            '; 

        content_by_lua ' 
            ngx.say(ngx.var.res) 
        '; 
    } 
}

同时添加一个lua的测试文件:/etc/nginx/conf.d/lua/test.lua 内容如下:

ngx.say("<h1>hello world</h1>");

启动Nginx,并测试效果:

效果:

[root@nginx-01 conf.d]# curl http://10.0.10.20 
<h1>hello world</h1> 

[root@nginx-01 conf.d]# curl 'http://10.0.10.20/add?a=9&b=89' 
98

可以看到Nginx可以处理到lua文件了。

提醒:本文最后更新于 621 天前,文中所描述的信息可能已发生改变,请谨慎使用。