描述
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
安装
由于我平时使用mac os系统比较多,就介绍下mac os系统下的安装。
mac下可以直接使用以下brew命令进行安装。其他系统可根据官方文档进行安装。
brew install openresty/brew/openresty
通过brew安装OpenResty后,通过以下命令启动OpenResty,然后在浏览器访问http://localhost,结果如下图所示,说明安装成功
/usr/local/opt/openresty/nginx/sbin/nginx
图1
hello world
接下来我们编写一个hello world,在OpenResty安装目录下,新建data文件夹,然后在data目录下新建logs和conf文件夹,分别用来保存日志和配置文件。
cd /usr/local/opt/openresty
mkdir data
cd data
mkdir logs/ conf/
接着,我们在 conf 目录下创建一个 nginx.conf 文件 代码如下
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 9000;
location / {
default_type text/html;
content_by_lua '
ngx.say("<p>Hello, World!</p>")
';
}
}
}
然后我们通过以下命令重新启动OpenResty,-p指定工作目录,-c指定配置文件,然后访问http://localhost:9000,会出现如下界面。
/usr/local/opt/openresty/nginx/sbin/nginx -s stop
/usr/local/opt/openresty/nginx/sbin/nginx -p /usr/local/opt/openresty/data -c /usr/local/opt/openresty/data/conf/nginx.conf
图2
以上例子我们通过ngx.say往客户端输出了一个响应文本,实现了hello world的功能。
简单交互
接下来我们编写一个简单接口,可以从请求中读取入参,并通过redis查询数据,最后返回响应结果。首先把nginx.conf的配置修改如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location /lookup {
default_type application/json;
content_by_lua_block {
-- 获取请求参数
local args = ngx.req.get_uri_args()
local key = args["key"]
if not key then
ngx.status = 400
ngx.say("Missing 'key' parameter")
return ngx.exit(400)
end
-- 连接到 Redis
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1秒超时
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.status = 500
ngx.say("Failed to connect to Redis: ", err)
return ngx.exit(500)
end
-- 从 Redis 中获取数据
local result, err = red:get(key)
if not result then
ngx.status = 500
ngx.say("Failed to get value from Redis: ", err)
return ngx.exit(500)
end
if result == ngx.null then
ngx.status = 404
ngx.say("Key not found in Redis")
return ngx.exit(404)
end
-- 返回 Redis 中获取的值
ngx.say("Value for key '", key, "': ", result)
-- 关闭 Redis 连接
local ok, err = red:set_keepalive(10000, 100)
if not ok then
ngx.log(ngx.ERR, "Failed to set Redis keepalive: ", err)
end
}
}
}
}
然后重载配置文件:
/usr/local/opt/openresty/nginx/sbin/nginx -s reload
这个例子中,我们监听了 /lookup 路径,并且假设请求中会包含一个名为 key 的参数。然后,OpenResty将根据这个参数在Redis中查找对应的值,并将结果返回给客户端。在浏览器中我们访问http://localhost:8080/lookup?key=key1会得到如下响应:
总结
本文简单的介绍了OpenResty在mac os环境下的安装及使用。OpenResty是一个兼具开发效率和性能的服务端开发平台,虽然它基于Nginx去实现,但其适用范围早已远远超出了反向代理和负载均衡。它可以让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型。
目前,国内的很多公司都在特定的场景下使用OpenResty,大多用来处理入口流量,比如负载均衡、安全校验、降级、限流、缓存等。虽然OpenResty是一个广泛应用的技术,但不是一个热门的技术。
OpenResty理论上可以实现各种复杂的web应用,但Lua语言是一门小众的语言,不适合业务逻辑比较重的场景,适合一些轻量级的性能高的WEB服务。
网友评论