lua与nginx强强联合-openresty

openresty=nginx+lua_nginx_module+lualib的组合

lua_nginx_module学习性价比极高,非常值得花10分钟学习。

一、简单安装及第一个例子

yum install readline-devel pcre-devel openssl-devel gcc
https://openresty.org/download/ngx_openresty-1.9.7.1.tar.gz
tar -zxvf ngx_openresty-1.9.7.1.tar.gz
cd ngx_openresty-1.9.7.1
./configure && gmake && gmake install

未指定prefix将安装到/usr/local/openresty目录中,进入安装目录看到“bin, luajit, lualib, nginx”四个目录。

编辑nginx/conf/nginx.conf 插入location 

location /ip {
                default_type 'text/plain';
                content_by_lua 'ngx.say(ngx.var.remote_addr)';
 }

访问 http://hostname/ip   页面返回访问用户ip

二、编译安装及库引用

openresty是官方提供的集成包,有时候我们希望自己编译安装(附自动安装脚本,最好自己更新版本号)

#!/bin/bash 
yum -y install gcc wget unzip openssl openssl-devel pcre pcre-devel bc
tools_path=/usr/local/lua_nginx
mkdir -p $tools_path
install_path=/usr/local

# 软件包
wget -P $tools_path http://luajit.org/download/LuaJIT-2.0.4.tar.gz
wget -P $tools_path https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
wget -P $tools_path https://github.com/openresty/lua-nginx-module/archive/v0.9.17.tar.gz
wget -P $tools_path http://nginx.org/download/nginx-1.4.7.tar.gz
wget -P $tools_path http://waf.sec.uuzu.com/setup/waf-nginx-conf.zip

# 安装
tar -zxf $tools_path/LuaJIT-2.0.4.tar.gz -C $tools_path
tar -zxf $tools_path/v0.2.19.tar.gz -C $tools_path
tar -zxf $tools_path/v0.9.17.tar.gz -C $tools_path
tar -zxf $tools_path/nginx-1.4.7.tar.gz -C $tools_path

cd $tools_path/LuaJIT-2.0.4/ && make && make install
cd $tools_path/nginx-1.4.7/ && ./configure –prefix=$install_path/nginx –user=nobody –group=nobody –add-module=$tools_path/ngx_devel_kit-0.2.19 –add-module=$tools_path/lua-nginx-module-0.9.17 –with-http_ssl_module –with-http_stub_status_module –with-http_gzip_static_module –with-ipv6 –with-ld-opt="-Wl,-rpath,$LUAJIT_LIB" && make && make install

# 配置
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
#end

同样将上一段配置添加到nginx.conf中,一样可以成功返回访问用户ip。

lualib库引用(以redis库举例)

下载ngx_redis (lua文件),放到任意目录,在nginx.conf配置文件http标签内增加 

lua_package_path "/usr/local/nginx/conf/lualib/?.lua;;";

    location /total {
        default_type text/plain;
        content_by_lua '
            ngx.header.content_type="application/json;charset=utf8"

            local redis = require "resty.redis"
            local red = redis:new()

            red:set_timeout(1000) — 1 sec
            local ok,err = red:connect("127.0.0.1", 2002)
            if not ok then
                ngx.say("failed to connect:", err)
            end

            local total, err = red:get("total")
            if not total then
                ngx.say("failed to found", err)
            end
            ngx.say("今日已投票:", total)';
    }

ps:可使用content_by_lua_block替换单引号的方式来避免lua代码中的特殊符号的转译问题,init(rewrite|access)_by_lua_block同理,xxx_block的方式0.9.17 版才添加进来,注意版本号。

三、一些参考

https://github.com/openresty/lua-nginx-module  官方权威,文档超级详细

https://openresty.org/  同样官方权威

http://groups.google.com/group/openresty   邮件列表,提问可召唤春哥

https://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html   介绍详细的中文教程

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注