美文网首页
OpenResty入门

OpenResty入门

作者: shark没有辣椒 | 来源:发表于2023-12-06 19:55 被阅读0次

描述

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会得到如下响应:

图3

总结

本文简单的介绍了OpenResty在mac os环境下的安装及使用。OpenResty是一个兼具开发效率和性能的服务端开发平台,虽然它基于Nginx去实现,但其适用范围早已远远超出了反向代理和负载均衡。它可以让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型。

目前,国内的很多公司都在特定的场景下使用OpenResty,大多用来处理入口流量,比如负载均衡、安全校验、降级、限流、缓存等。虽然OpenResty是一个广泛应用的技术,但不是一个热门的技术。

OpenResty理论上可以实现各种复杂的web应用,但Lua语言是一门小众的语言,不适合业务逻辑比较重的场景,适合一些轻量级的性能高的WEB服务。

相关文章

网友评论

      本文标题:OpenResty入门

      本文链接:https://www.haomeiwen.com/subject/qvmjgdtx.html