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

安装依赖包,避免编译出错:
  1. yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel gcc g++ gcc-c++ gd-devel 


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

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


添加一个用户:

  1. useradd -s /sbin/nginx -M nginx 


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

  1. tar xf lua-nginx-module-0.10.11.tar.gz 
  2. tar xf nginx-1.12.2.tar.gz 
  3.  
  4. cd nginx-1.12.2 
  5. ./configure \ 
  6. --prefix=/opt/nginx \ 
  7. --sbin-path=/usr/sbin/nginx \ 
  8. --conf-path=/etc/nginx/nginx.conf \ 
  9. --pid-path=/var/run/nginx.pid \ 
  10. --lock-path=/var/lock/nginx.lock \ 
  11. --user=nginx \ 
  12. --group=nginx \ 
  13. --with-http_ssl_module \ 
  14. --with-http_gzip_static_module \ 
  15. --with-http_realip_module \ 
  16. --with-http_stub_status_module \ 
  17. --with-http_sub_module \ 
  18. --add-dynamic-module=../ngx_devel_kit-0.3.0 \ 
  19. --add-dynamic-module=../lua-nginx-module-0.10.11 
  20.  
  21. make && make install 


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

  1. #在nginx.conf配置中加入以下两行,实现动态调用模块,不能放在http{}中。 
  2. load_module /opt/nginx/modules/ndk_http_module.so; 
  3. load_module /opt/nginx/modules/ngx_http_lua_module.so; 


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

  1. [root@nginx-01 nginx-1.12.2]# nginx -t 
  2. 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 
  3. nginx: configuration file /etc/nginx/nginx.conf test failed 

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

  1. 解决方法: 
  2. [root@nginx-01 nginx-1.12.2]# find / -name "libluajit-5.1.so" 
  3. /usr/local/lib/libluajit-5.1.so 
  4. [root@nginx-01 nginx-1.12.2]# ln -sf /usr/local/lib/libluajit-5.1.so /lib64/libluajit-5.1.so.2 


接下来就是测试效果:

  1. 示例: 
  2. 简化一下配置文件,并添加一个目录和测试文件; 
  3. [root@nginx-01 conf.d]# egrep -v "^#|^$" ../nginx.conf 
  4. worker_processes  1; 
  5. load_module /opt/nginx/modules/ndk_http_module.so; 
  6. load_module /opt/nginx/modules/ngx_http_lua_module.so; 
  7. events { 
  8.     worker_connections  1024; 
  9. http { 
  10.     include       mime.types; 
  11.     default_type  application/octet-stream; 
  12.     sendfile        on; 
  13.     keepalive_timeout  65; 
  14.     include conf.d/*.conf; 


创建目录:

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

 

  1. 添加一个配置文件: app.conf 
  2.  
  3. server { 
  4.     listen       80; 
  5.     server_name  localhost; 
  6.     charset utf-8; 
  7.  
  8.     location / { 
  9.         default_type "text/html"; 
  10.         #content_by_lua 'ngx.say("<h1>Nginx Lua Hello World!</h1>")'; 
  11.         content_by_lua_file /etc/nginx/conf.d/lua/test.lua; 
  12.     } 
  13.     location /add { 
  14.         default_type "text/html"; 
  15.         set $res ''; 
  16.  
  17.         rewrite_by_lua ' 
  18.             local a = tonumber(ngx.var.arg_a) or 0 
  19.             local b = tonumber(ngx.var.arg_b) or 0 
  20.             ngx.var.res = a + b 
  21.             '; 
  22.  
  23.         content_by_lua ' 
  24.             ngx.say(ngx.var.res) 
  25.         '; 
  26.     } 


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

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


启动Nginx,并测试效果:

  1. 效果: 
  2. [root@nginx-01 conf.d]# curl http://10.0.10.20 
  3. <h1>hello world</h1> 
  4.  
  5. [root@nginx-01 conf.d]# curl 'http://10.0.10.20/add?a=9&b=89
  6. 98 


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