OpenResty 是一个基于 Nginx 的高性能 Web 平台,集成了 LuaJIT 和大量 Lua 库,允许通过 Lua 脚本扩展 Nginx 的功能。它由章亦春(agentzh)开发,广泛应用于构建动态 Web 应用、API 网关和微服务。


1. OpenResty 的核心特点

  1. 高性能

    • 基于 Nginx 和 LuaJIT,性能接近 C 语言。
  2. 动态脚本

    • 通过 Lua 脚本实现动态请求处理、访问控制、日志记录等功能。
  3. 丰富的模块

    • 集成了大量 Lua 模块(如 lua-resty-redislua-resty-mysql),方便与外部服务交互。
  4. 灵活性

    • 支持在 Nginx 的各个阶段(如访问控制、内容生成、日志记录)嵌入 Lua 脚本。
  5. 社区支持

    • 拥有活跃的社区和丰富的文档。

2. 安装 OpenResty

2.1 使用包管理器安装

以下以 Ubuntu 为例:

  1. 安装依赖:

    sudo apt-get install -y libpcre3-dev libssl-dev perl make build-essential curl
  2. 下载并安装 OpenResty:

    wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
    tar -zxvf openresty-1.21.4.1.tar.gz
    cd openresty-1.21.4.1
    ./configure
    make
    sudo make install
  3. 验证安装:

    /usr/local/openresty/nginx/sbin/nginx -v

2.2 使用 Docker 安装

  1. 拉取 OpenResty 官方镜像:

    docker pull openresty/openresty
  2. 运行容器:

    docker run -d --name my-openresty -p 80:80 openresty/openresty

3. 配置 OpenResty

OpenResty 的配置文件与 Nginx 类似,但可以通过 Lua 脚本扩展功能。

3.1 基本配置

创建一个简单的配置文件(nginx.conf):

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    server {
        listen 80;
        location / {
            default_type text/plain;
            content_by_lua_block {
                ngx.say("Hello, OpenResty!")
            }
        }
    }
}

3.2 启动 OpenResty

启动 OpenResty 并加载配置文件:

/usr/local/openresty/nginx/sbin/nginx -c /path/to/nginx.conf

访问 http://localhost,将看到 "Hello, OpenResty!"。


4. 使用 Lua 脚本

OpenResty 的核心功能是通过 Lua 脚本实现的。以下是一些常见的使用场景。

4.1 动态内容生成

location /hello {
    content_by_lua_block {
        local name = ngx.var.arg_name or "World"
        ngx.say("Hello, " .. name .. "!")
    }
}

访问 /hello?name=Lua,将看到 "Hello, Lua!"。

4.2 访问控制

location /secure {
    access_by_lua_block {
        local ip = ngx.var.remote_addr
        if ip == "192.168.1.1" then
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end
    }
    proxy_pass http://backend;
}

禁止 IP 192.168.1.1 访问 /secure

4.3 与 Redis 交互

使用 lua-resty-redis 模块与 Redis 交互:

  1. 安装 lua-resty-redis

    opm get openresty/lua-resty-redis
  2. 在配置中使用:

    location /redis {
        content_by_lua_block {
            local redis = require "resty.redis"
            local red = redis:new()
            red:set_timeout(1000) -- 1 second timeout
            local ok, err = red:connect("127.0.0.1", 6379)
            if not ok then
                ngx.say("Failed to connect to Redis: ", err)
                return
            end
            red:set("key", "value")
            local res, err = red:get("key")
            ngx.say("Value from Redis: ", res)
        }
    }

5. 动态加载配置

OpenResty 支持动态加载配置,无需重启服务。

5.1 使用 nginx -s reload

修改配置文件后,重新加载配置:

/usr/local/openresty/nginx/sbin/nginx -s reload

5.2 使用 Lua 脚本动态更新

通过 Lua 脚本动态更新配置:

location /update {
    content_by_lua_block {
        local new_config = [[
            worker_processes  2;
            events {
                worker_connections  2048;
            }
        ]]
        local ok, err = ngx.config.reload(new_config)
        if not ok then
            ngx.say("Failed to reload config: ", err)
        else
            ngx.say("Config reloaded successfully")
        end
    }
}

6. 与 Nginx 集成

OpenResty 可以作为 Nginx 的扩展,处理动态请求。

6.1 配置 Nginx

在 Nginx 配置文件中添加反向代理规则:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

6.2 重启 Nginx

重启 Nginx 以应用配置:

sudo systemctl restart nginx

7. 总结

OpenResty 是一个功能强大且灵活的 Web 平台,特别适合构建高性能的动态 Web 应用和 API 网关。通过 Lua 脚本,可以实现高度定制化的功能,同时保持与 Nginx 的兼容性。无论是独立使用还是与 Nginx 集成,OpenResty 都能提供高效的解决方案。

标签: Nginx

添加新评论