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文件了。
转载请注明:SuperIT » Nginx 添加nginx_lua_module模块