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 等都进行一致的高性能响应。
Centos为例
预编译安装
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
源码编译安装
1. 下载源码包 http://openresty.org/cn/download.html
2. 解压后,进入目录执行配置命令
./configure
make && make install
3. 执行编译命令后,出现目录/usr/local/openresty
1、修改/etc/profile,配置nginx环境变量
PATH=/usr/local/openresty/nginx/sbin:$PATH
export PATH
2、使profile生效
source /etc/profile
3、启动nginx
nginx
4、修改配置文件/usr/local/openresty/nginx/conf/nginx.conf
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_block {
ngx.say("hello, world
")
}
}
}
5、重启nginx
nginx -s reload
6、测试
curl http://localhost:8080
在conf目录中新建lua/hello.lua
ngx.say("Hello Lua!!
")
修改nginx.conf
server {
listen 8080;
location /lua {
default_type text/html;
content_by_lua_file conf/lua/hello.lua;
}
}
修改hello.lua
ngx.say(ngx.var.arg_a)
arg_a能获得参数a的值
http://192.168.7.188:8080/lua?a=zhangsan
修改hello.lua
local uri_args = ngx.req.get_uri_args()
for k, v in pairs(uri_args) do
if type(v) == "table" then
ngx.say(k, " : ", table.concat(v, ", "), "
")
else
ngx.say(k, ": ", v, "
")
end
end
可以在网页输出所有参数列表
http://192.168.7.188:8080/lua?a=22&b=33&c=88
local headers = ngx.req.get_headers()
ngx.say("Host : ", headers["Host"], "
")
ngx.say("user-agent : ", headers["user-agent"], "
")
ngx.say("user-agent : ", headers.user_agent, "
")
for k,v in pairs(headers) do
if type(v) == "table" then
ngx.say(k, " : ", table.concat(v, ","), "
")
else
ngx.say(k, " : ", v, "
")
end
end
ngx.req.read_body()
ngx.say("post args begin", "
")
local post_args = ngx.req.get_post_args()
for k, v in pairs(post_args) do
if type(v) == "table" then
ngx.say(k, " : ", table.concat(v, ", "), "
")
else
ngx.say(k, ": ", v, "
")
end
end
ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "
")
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "
")
ngx.say("ngx.req.raw_header : ", ngx.req.raw_header(), "
")
ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "
")
-- 引用mysql模块
local mysql = require "resty.mysql"
-- 获得数据库对象
local db = mysql:new()
-- 设置超时
db:set_timeout(1000)
-- 连接数据库 ok是正常结果,err是错误结果
local ok, err = db:connect{
host = "IP",
port = 端口,
database = "数据库名",
user = "账号",
password = "密码",
charset = "utf8"
}
if not ok then
ngx.say("连接失败", err)
return
end
ngx.say("连接成功")
-- 执行查询 res是查询结果
local res, err = db:query("查询语句")
if not res then
ngx.say("查询错误 ", err)
return
end
db:close()
-- 将查询结果转换为json
local cjson = require "cjson"
ngx.say(cjson.encode(res))
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(2000)
local ok,err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say("connect error: ", err)
return
end
red:set("键",值)
local value = red:get("键")
red:close()