Nginx发行版OpenResty
OpenResty 是一个基于 Nginx 的高性能 Web 平台,集成了 LuaJIT 和大量 Lua 库,允许通过 Lua 脚本扩展 Nginx 的功能。它由章亦春(agentzh)开发,广泛应用于构建动态 Web 应用、API 网关和微服务。
1. OpenResty 的核心特点
高性能:
- 基于 Nginx 和 LuaJIT,性能接近 C 语言。
动态脚本:
- 通过 Lua 脚本实现动态请求处理、访问控制、日志记录等功能。
丰富的模块:
- 集成了大量 Lua 模块(如
lua-resty-redis
、lua-resty-mysql
),方便与外部服务交互。
- 集成了大量 Lua 模块(如
灵活性:
- 支持在 Nginx 的各个阶段(如访问控制、内容生成、日志记录)嵌入 Lua 脚本。
社区支持:
- 拥有活跃的社区和丰富的文档。
2. 安装 OpenResty
2.1 使用包管理器安装
以下以 Ubuntu 为例:
安装依赖:
sudo apt-get install -y libpcre3-dev libssl-dev perl make build-essential curl
下载并安装 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
验证安装:
/usr/local/openresty/nginx/sbin/nginx -v
2.2 使用 Docker 安装
拉取 OpenResty 官方镜像:
docker pull openresty/openresty
运行容器:
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 交互:
安装
lua-resty-redis
:opm get openresty/lua-resty-redis
在配置中使用:
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 都能提供高效的解决方案。