OpenResty初步使用

OpenResty

OpenResty ™ 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。


OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。


OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。


目前openresty的组件包括:http://openresty.org/en/components.html


安装

您必须将这些库 perl 5.6.1+, libreadline, libpcre, libssl安装在您的电脑之中。 对于 Linux来说, 您需要确认使用 ldconfig 命令,让其在您的系统环境路径中能找到它们。


Debian 和 Ubuntu 用户

推荐您使用 apt-get安装以下的开发库:
apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential

Fedora 和 RedHat 用户

推荐您使用yum安装以下的开发库:
yum install readline-devel pcre-devel openssl-devel gcc


./configure

下载 预编译包,然后在进入 openresty-VERSION/ 目录, 然后输入以下命令配置:


./configure
默认, --prefix=/usr/local/openresty 程序会被安装到/usr/local/openresty目录。

您可以指定各种选项,比如
./configure --prefix=/opt/openresty \
            --with-luajit \
            --without-http_redis2_module \
            --with-http_iconv_module \
            --with-http_postgres_module

试着使用 ./configure --help 查看更多的选项。

配置文件(./configure script)运行出错可以到 build/nginx-VERSION/objs/autoconf.err 找到。 VERSION 的地方必须与OpenResty版本号相对应, 比如 1.11.2.1。

接着:
make

make install

安装完成后的目录大概是这样的
drwxr-xr-x.  2 root root   4096 9月   1 15:45 bin
drwxr-xr-x.  6 root root   4096 9月   1 15:45 luajit
drwxr-xr-x.  6 root root   4096 9月   1 15:45 lualib
drwxr-xr-x. 11 root root   4096 9月   1 15:46 nginx
drwxr-xr-x. 41 root root   4096 9月   1 15:45 pod
-rw-r--r--.  1 root root 157757 9月   1 15:45 resty.index
drwxr-xr-x.  3 root root   4096 9月   1 15:45 site

配置nginx

进入xx/openresty/nginx/conf目录
编辑nginx.conf文件
1.在http模块下加入:(路径替换成自己的)
    lua_package_path "/opt/openresty/lualib/?.lua;;";  #lua 模块  
    lua_package_cpath "/opt/openresty/lualib/?.so;;";  #c模块  

2.在server模块下引入,将所有需要lua处理的单独放在一个文件中
include ../conf/myconf/luatest.conf;

luatest.con配置如下
location ~ /openapi/test/.* {
    default_type 'text/html';
#    content_by_lua 'ngx.say("hello")';   
    content_by_lua_file conf/myconf/lua/redis.lua;  
}

redis.lua 脚本处理了一个非常常见的业务场景,就是使用nginx直接访问redis,脚本文件redis.lua内容如下
local function close_redis(red)
    if not red then
        return
    end

--    local ok, err = red:close()  
--    if not ok then  
--        ngx.say("close redis error : ", err)  
--    end  
    --释放连接(连接池实现)
    ngx.say("aaa") 
    local pool_max_idle_time = 10000 --毫秒  
    local pool_size = 100 --连接池大小  
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)  
    if not ok then  
       ngx.say("set keepalive error : ", err)  
    end  
end
    --
local redis = require("resty.redis")
--创建实例
local red = redis:new()
--设置超时(毫秒
red:set_timeout(1000)
--建立连接
local ip = "192.168.0.43"
local port = 6381
local ok, err = red:connect(ip, port)
--调用API获取数据
local resp, err = red:get("DB_SMS:openresty")
if not resp then 
    ngx.say("get msg error : ", err)  
    return close_redis(red)  
end
ngx.say(resp)
close_redis(red)

这样,openresty就算入门了。

使用

性能对比,直接通过nginx访问redis和直接访问应用服务器

通过nginx

OpenResty初步使用_第1张图片


直接访问应用服务器

OpenResty初步使用_第2张图片

其他配置案例

mysql使用案例

local function close_mysql(db)
    if not db then
        return
    end

    --(连接池实现)
    local pool_max_idle_time = 10000 --毫秒  
    local pool_size = 100 --连接池大小  
    local ok, err = db:set_keepalive(pool_max_idle_time, pool_size)  
    if not ok then  
       ngx.say("set mysql keepalive error : ", err)
       return
    end  
end

local function getUrlResourceName(strurl)  
    local ts = string.reverse(strurl)  
    local param1, param2 = string.find(ts, "/")  -- 这里以"/"为例  
    local m = string.len(strurl) - param2 + 1     
    local result = string.sub(strurl, m+1, string.len(strurl))
    return result  
end  

local mysql = require "resty.mysql"
local db, err = mysql:new()
if not db then
    ngx.say("failed to instantiate mysql: ", err)
    return
end
db:set_timeout(1000)
local ok, err, errcode, sqlstate = db:connect{
    host = "192.168.0.109",
    port = 3306,
    database = "platform_qfang",
    user = "root",
    password = "123456",
    max_packet_size = 1024 * 1024 }
if not ok then
    ngx.say("failed to connect: ", err, ": ", errcode, " ", sqlstate)
    return
end
local uri= getUrlResourceName(ngx.var.uri)
local res, err, errcode, sqlstate =
    db:query("select FName from t_base_position where fid='"..uri.."'",1)
if not res then
    ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
    return
end
--local cjson = require "cjson"
--ngx.say("result,json: ", cjson.encode(res))
local size=table.getn(res)
if size>0 then
    ngx.say("result:",res[1].FName)
else
    ngx.say("no result")
end
close_mysql(db)


你可能感兴趣的:(nginx)