Openresty怎么使用

发布时间:2022-02-18 16:16:19 作者:iii
来源:亿速云 阅读:192
# OpenResty怎么使用

## 什么是OpenResty

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,由章亦春(agentzh)创建。它集成了大量精良的 Lua 库、第三方模块以及大多数依赖项,可以方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

与传统 Nginx 相比,OpenResty 的主要特点是:
- 通过 LuaJIT 实现高性能 Lua 脚本执行
- 支持在 Nginx 的各个处理阶段嵌入 Lua 代码
- 提供丰富的 Lua 库和 Nginx 模块生态

## 安装OpenResty

### Linux系统安装

推荐使用官方预编译包安装(以Ubuntu为例):

```bash
# 安装依赖
sudo apt-get install libpcre3-dev libssl-dev perl make build-essential curl

# 添加OpenResty仓库
wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"

# 安装OpenResty
sudo apt-get update
sudo apt-get install openresty

MacOS安装

brew install openresty/brew/openresty

Windows安装

从官网下载预编译的Windows版本zip包,解压后即可使用。

基本目录结构

安装完成后,主要目录结构如下:

/usr/local/openresty/
├── bin/             # 可执行文件
├── luajit/          # LuaJIT相关
├── lualib/          # Lua库
├── nginx/           # Nginx核心
├── pod/             # 文档
└── site/            # 示例和工具

启动与停止服务

# 启动
openresty -p `pwd` -c conf/nginx.conf

# 停止
openresty -s stop -p `pwd` -c conf/nginx.conf

# 重新加载配置
openresty -s reload -p `pwd` -c conf/nginx.conf

基础配置示例

创建一个简单的 nginx.conf

worker_processes  1;
error_log logs/error.log;

events {
    worker_connections 1024;
}

http {
    server {
        listen 8080;
        
        location / {
            default_type text/html;
            content_by_lua_block {
                ngx.say("<h1>Hello, OpenResty!</h1>")
            }
        }
        
        location /test {
            content_by_lua_file lua/test.lua;
        }
    }
}

Lua脚本集成

内联Lua代码

location /inline {
    content_by_lua_block {
        local name = ngx.var.arg_name or "anonymous"
        ngx.say("Hello, ", name)
    }
}

外部Lua文件

创建 lua/test.lua

local args = ngx.req.get_uri_args()
local res = { 
    message = "Hello from Lua file",
    args = args 
}

ngx.say(ngx.json.encode(res))

常用功能模块

访问MySQL数据库

location /mysql {
    content_by_lua_block {
        local mysql = require "resty.mysql"
        local db, err = mysql:new()
        
        if not db then
            ngx.say("failed to instantiate mysql: ", err)
            return
        end
        
        db:set_timeout(1000) -- 1秒超时
        
        local ok, err, errcode, sqlstate = db:connect{
            host = "127.0.0.1",
            port = 3306,
            database = "test",
            user = "root",
            password = "",
            charset = "utf8"
        }
        
        if not ok then
            ngx.say("failed to connect: ", err, ": ", errcode, " ", sqlstate)
            return
        end
        
        local res, err, errcode, sqlstate = db:query("select * from users limit 10")
        if not res then
            ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
            return
        end
        
        ngx.say("result: ", require("cjson").encode(res))
    }
}

Redis操作

location /redis {
    content_by_lua_block {
        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.say("failed to connect: ", err)
            return
        end
        
        local res, err = red:get("some_key")
        if not res then
            ngx.say("failed to get key: ", err)
            return
        end
        
        ngx.say("value: ", res)
    }
}

性能优化技巧

  1. 启用Lua代码缓存

    lua_code_cache on; # 生产环境必须开启
    
  2. 使用共享内存字典

    http {
       lua_shared_dict my_cache 128m;
    }
    
  3. 避免阻塞操作

    • 使用cosocket进行非阻塞网络IO
    • 避免在Lua代码中执行长时间CPU运算
  4. 合理使用阶段

    • 根据需求选择适当的处理阶段(init_by_lua, rewrite_by_lua等)

调试与日志

-- 记录不同级别日志
ngx.log(ngx.ERR, "error message")
ngx.log(ngx.WARN, "warning message")
ngx.log(ngx.INFO, "info message")

-- 打印请求信息
ngx.say("HTTP Method: ", ngx.var.request_method)
ngx.say("Request URI: ", ngx.var.request_uri)

实际应用场景

  1. API网关

    • 路由转发
    • 鉴权验证
    • 限流熔断
  2. Web应用防火墙

    • 恶意请求拦截
    • SQL注入防护
  3. 实时数据处理

    • 日志分析
    • 数据聚合
  4. 微服务聚合

    • 多个后端服务结果聚合
    • 协议转换

学习资源推荐

  1. 官方文档:https://openresty.org/en/
  2. LuaJIT文档:http://luajit.org/
  3. 开源项目示例:
    • Kong API网关
    • Orange网关
  4. 书籍:《OpenResty最佳实践》

总结

OpenResty通过将Nginx的高性能与Lua的灵活性相结合,为开发者提供了构建高效Web服务的强大工具。从简单的动态内容生成到复杂的微服务网关,OpenResty都能胜任。掌握其核心概念和常用模块后,你可以轻松构建出高性能的Web应用和服务。

随着对OpenResty的深入理解,你会发现它在处理高并发、低延迟场景下的独特优势,是现代化Web架构中不可或缺的重要组件。 “`

推荐阅读:
  1. OpenResty--------核心执行阶段篇
  2. openresty lua获取微秒和毫秒

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

openresty

上一篇:cp命令如何使用

下一篇:什么是二分查找

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》