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))