OpenResty
(又称ngx_openresty
)是一个基于NGINX
的可伸缩的WEB平台,由中国人章亦春发起,提供了很多高质量的第三方模块。
OpenResty
是一个强大的 Web 应用服务器,Web 开发人员可以使用Lua
脚本语言调动Nginx
支持的各种 C 以及Lua
模块,更主要的是在性能方面,OpenResty
可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。
OpenResty
的目标是让Web服务直接运行在NGINX
服务内部,充分利用NGINX
的非阻塞I/O模型,不仅对HTTP客户端请求,甚至对远程后端DB都进行一系列的高性能响应。
OpenResty
借助于Nginx
的事件驱动模型和非堵塞IO,以实现高性能的Web应用程序。OpenResty
使我们可以借助于Nginx
的异步非阻塞达到使用Lua
异步并发访问后端DB等服务。Nginx
采用的是master-worker
模型,也就是一个master
进程管理多个worker
进程,基本的时间处理都放在worker
进程中,master
进程负责全局初始化以及对worker
进行的管理。
OpenResty中,每个worker
进程使用一个LuaVM,当请求被分配到worker
时,将在这个LuaVM中创建一个coroutine
协程,协程之间数据隔离,每个协程都具有独立的全局变量。
官本
官网下载压缩包
解压,双击打开nginx,exe
即可,访问localhost:80
同样下载最新版的压缩包即可,上传至Linux服务器
tar -xzvf openresty-VERSION.tar.gz
cd openresty-VERSION/
./configure
make
sudo make install
注意:安装前需要安装一下需要的依赖
yum install pcre-devel openssl-devel gcc curl
默认, --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
添加环境变量
echo "export PATH=$PATH:/usr/local/openresty/nginx/sbin" >> /etc/profile
source /etc/profile
然后启动openresty,启动命令和nginx一致。(这里也可以直接进入到nginx
目录下,./sbin/nginx
直接启动)
nginx -c /usr/local/openresty/nginx/conf/nginx.conf
启动后查看一下服务
ps -ef | grep nginx
Lua
是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的。
curl -R -O http://www.lua.org/ftp/lua-5.4.3.tar.gz
tar zxf lua-5.4.3.tar.gz
cd lua-5.4.3
make all test
查看Lua版本
[root@localhost luatest]# lua -v
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
windows安装只需要下载windows的对应版本解压即可,将解压目录配置进入系统的PATH即可。
VSCode编写Lua
安装Lua Debug插件
菜鸟教程lua语法
修改nginx配置文件,默认在/usr/local/openresty/nginx/conf
目录下,
location / {
#root html;
#index index.html index.htm;
# 告诉浏览器返回的信息
default_type text/html;
content_by_lua_block{
ngx.say("hello world");
}
}
进入到sbin目录下,重启nginx,ngxin -s reload
如果代码过多会显得nginx的配置文件过于繁琐,所以我们可以将lua代码通过一个文件引入。
location / {
#root html;
#index index.html index.htm;
# 告诉浏览器返回的信息
default_type text/html;
content_by_lua_file /usr/local/openresty/nginx/conf/test.lua;
}
获取一个 uri 有两个方法:ngx.req.get_uri_args
、ngx.req.get_post_args
,二者主要的区别是参数来源有区别
-- 获取get请求参数
local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
ngx.say("[GET ] key:", k, " v:", v)
ngx.say("
")
end
-- 获取post请求时 请求参数
ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body
local arg = ngx.req.get_post_args()
for k,v in pairs(arg) do
ngx.say("[POST] key:", k, " v:", v)
ngx.say("
")
end
-- 获取header
local headers = ngx.req.get_headers()
for k,v in pairs(headers) do
ngx.say("[header] name:", k, " v:", v)
ngx.say("
")
end
-- 获取body信息
ngx.req.read_body()
local data = ngx.req.get_body_data();
ngx.say(data)
ngx.req.get_body_data()
读请求体,会偶尔出现读取不到直接返回 nil 的情况。如果请求体尚未被读取,请先调用 ngx.req.read_body (或打开 lua_need_request_body 选项强制本模块读取请求体,此方法不推荐)。
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 sec
local ok, err = red:connect("192.168.1.4", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
-- 请注意这里 auth 的调用过程
local count
count, err = red:get_reused_times()
if 0 == count then
ok, err = red:auth("admin")
if not ok then
ngx.say("failed to auth: ", err)
return
end
elseif err then
ngx.say("failed to get reused times: ", err)
return
end
ok, err = red:set("testkey", "testvalue")
if not ok then
ngx.say("failed to set itcast: ", err)
return
end
ngx.say("set result: ", ok)
-- 连接池大小是100个,并且设置最大的空闲时间是 10 秒
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.say("failed to set keepalive: ", err)
return
end
这里碰到redis的权限问题,需要启动redis的指定配置文件。