openResty介绍,用于方便地搭建能够处


OpenResty®

通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台

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® 中包含了多少软件。

参考 上路 学习如何从最简单的 hello world 开始使用 OpenResty® 开发 HTTP 业务,或前往 下载 直接获取 OpenResty® 的源代码包开始体验。

openResty入门案例

openresty中发起http请求

有些场景是需要nginx在进行请求转发

用户浏览器请求url访问到nginx服务器,但此请求业务需要再次请求其他业务;

如用户请求订单服务获取订单详情,可订单详情中需要返回商品信息,也就需要再请求商品服务获取商品信息;

这样就需要nginx需要有发起http请求的能力,而不是让用户浏览器再次请求商品信息

nginx服务发起http请求区分内部请求 和 外部请求

resty.http ,从可实现外部请求,而且使用很方便

local uri_args = ngx.req.get_uri_args()

local wd = uri_args["wd"]

local http = require("resty.http")

local httpc = http.new()

local resp = httpc:request_uri("http://t.weather.sojson.com/api/weather/city/"..wd,{

method = "GET"

})

local val = resp.body

ngx.say(val)

 

openresty中使用redis模块

在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的,操作redis,我们需要引入redis模块 require "resty.redis"

local function close_redis(red)

    if not red then

        return

    end

    -- 释放连接(连接池实现),毫秒

    local pool_max_idle_time = 10000

    -- 连接池大小

    local pool_size = 100

    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)

    local log = ngx_log

    if not ok then

        log(ngx_ERR, "set redis keepalive error : ", err)

    end

end

-- 连接redis

local redis = require('resty.redis')

local red = redis.new()

red:set_timeout(1000)

local ip = "127.0.0.1"

local port = "6379"

local pwd= "ok"

ok, err = red:connect(ip,port)

if not ok then

    ngx.say("failed to auth: ", err)

    return close_redis(red)

end

if not ok then

    return close_redis(red)

end

ok, err = red:auth(pwd)

if not ok then

    ngx.say("failed to auth: ", err)

    return close_redis(red)

end

red:select('0')

red:set("msg","test ngx hello")

local resp, err = red:get("msg")  

if not resp then  

    ngx.say("get msg error : ", err)  

    return close_redis(red)  

end

ngx.say("msg : ", resp)

close_redis(red)

获取POST请求参数

ngx.req.read_body()

local arg = ngx.req.get_post_args()

name=nil

pwd=nil

for k,v in pairs(arg) do

if k=="name" then

name=v

end

if k=="pwd" then

pwd = v

end

end

ngx.say("name : ", name)

ngx.say("pwd : ", pwd)

openresty中操作mysql

数据库信息

 获取页面参数完成数据库添加

 

--请求参数

ngx.req.read_body()

local arg = ngx.req.get_post_args()

deptname=nil

--获取数据

for k,v in pairs(arg) do

if k=="deptname" then

deptname = v

end

end

ngx.say("deptname : ", deptname)

--创建连接mysql模块

local mysql = require "resty.mysql"

-- connect to mysql;

local db, err = mysql:new()

if not db then

return false

end

db:set_timeout(1000)

--设置连接信息

local ok, err, errno, sqlstate = db:connect{

host = "127.0.0.1",

port = 3306,

database = "bye",

user = "root",

password = "ok"

}

--验证是否连接上

if not ok then

ngx.say("connect mysql failed")

return false

end

if db == false then

    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)

    return

end

ngx.say("----------插入数据部门----------------","<br/>")

--执行添加

res, err, errcode, sqlstate =

    db:query("insert into dept values (null,'"..deptname.."')")

if not res then

    ngx.say("insert failed")

    return

end

ngx.say("insert rows :", res.affected_rows,", id", res.insert_id, "<br/>")

查询数据并返回json

--请求参数

ngx.req.read_body()

local arg = ngx.req.get_post_args()

deptname=nil

--获取数据

for k,v in pairs(arg) do

if k=="deptname" then

deptname = v

end

end

ngx.say("deptname : ", deptname)

--创建连接mysql模块

local mysql = require "resty.mysql"

-- connect to mysql;

local db, err = mysql:new()

if not db then

return false

end

db:set_timeout(1000)

--设置连接信息

local ok, err, errno, sqlstate = db:connect{

host = "127.0.0.1",

port = 3306,

database = "bye",

user = "root",

password = "ok",

max_packet_size = 1024 * 1024

}

--验证是否连接上

if not ok then

ngx.say("connect mysql failed")

return false

end

if db == false then

    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)

    return

end

ngx.say("----------根据名称查询数据部门----------------","<br/>")

res, err, errcode, sqlstate =

    db:query("SELECT * FROM `dept` WHERE deptname LIKE '%"..deptname.."%'")

if not res then

    ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")

    return

end

local cjson = require "cjson"

ngx.say("result: ", cjson.encode(res))

 

相关内容