OpenResty 介绍
OpenResty是一个基于 Nginx 的 Web 平台,它集成了 Lua(Luajit)编程语言,可以通过在 Nginx 中嵌入 Lua 脚本来扩展和定制化Web应用。OpenResty 提供了一种高性能和可扩展的架构,使开发者能够轻松构建、扩展和管理复杂的Web应用。
OpenResty 的核心组件是 Nginx,Nginx 是一个高性能的HTTP和反向代理服务器。OpenResty 通过扩展 Lua 脚本引擎来增强 Nginx 的功能。Lua 是一种轻量级、高效的脚本编程语言,它被广泛用于各种领域,包括Web开发。
OpenResty提供了丰富的 Lua API,使开发者能够利用 Lua 编写高性能的 Web 应用。开发者可以编写 Lua 脚本来处理 HTTP 请求和响应、访问数据库、进行动态路由、实现缓存、进行访问控制等等。同时,OpenResty 还提供了一些常用的模块和第三方库,如 Redis、Memcached 等,方便开发者进行各种操作。
由于 OpenResty 的架构和性能优势,它在高流量的 Web 应用场景下表现出色。开发者可以利用 OpenResty 构建高性能的API服务器、实时消息推送系统、反向代理、负载均衡器等。另外,OpenResty 还支持热部署,可以在不停机的情况下更新和扩展应用。
总而言之,OpenResty 是一个功能强大、高性能、可扩展的 Web 平台,通过嵌入 Lua 脚本来扩展 Nginx 的功能,为开发者提供了灵活、快速和可靠的 Web 开发环境。
OpenResty 应用场景
- API 网关
- CDN 缓存
- Waf 防火墙
- Web 应用
OpenResty 安装
OpenResty 有多种安装方式:
- 操作系统的包管理器
- 源码编译
- docker 镜像
不推荐源码安装,不仅步骤繁琐,而且有许多的依赖,并且 OpenResty 官方对很多外部依赖打过补丁。推荐优先使用 apt-get、yum、brew 这些包管理工具来安装,下面以 Ubuntu 22 为例:
# 安装导入 GPG 公钥时所需的几个依赖包
sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates
# 导入 GPG 密钥
wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg
# 添加官方 APT 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null
# 更新 APT 索引
sudo apt-get update
# 安装 OpenResty
sudo apt-get -y install openresty
其他操作系统及版本可以参考官方文档
openresty -V 可以查看编译相关的参数,OpenResty 核心模块:
$ openresty -V
# 具体输出省略
resty-cli
resty-cli是 OpenResty 的命令行交互工具,它允许在命令行中执行和调试 Lua 脚本以及与 OpenResty 进行交互。使用 resty-cli,您可以快速测试和验证 Lua 代码的运行结果,以及与 Nginx 和 OpenResty 相关的功能。
resty 使用示例:
# help
$ resty -h
resty [options] [lua-file [args]]
Options:
-e PROG Run the inlined Lua code in "prog".
# 其他选项略
# print
$ resty -e 'print("hello")'
hello
# ngx.say 有换行符
$ resty -e 'ngx.say("hello")'
hello
# ngx.print 无换行符
$ resty -e 'ngx.print("hello")'
hello
# ngx.sleep
$ time resty -e 'ngx.sleep(3) print("done\n")'
done
real 0m3.085s
user 0m0.071s
sys 0m0.010s
# ngx.md5
$ resty -e 'ngx.say(ngx.md5("hello"))'
5d41402abc4b2a76b9719d911017c592
# shared dict
$ resty --shdict='dogs 1m' -e 'local dict = ngx.shared.dogs
dict:set("Tom", 56)
print(dict:get("Tom"))'
56
# 执行 lua 文件
$ resty example.lua
restydoc
restydoc 是 OpenResty 的文档查询工具,它提供了对 OpenResty 模块、指令和 Lua API 的快速查询和浏览功能。通过 restydoc,您可以方便地查阅 OpenResty 的相关文档,了解每个模块的功能、指令的用法以及 Lua API 的详细说明。
$ restydoc -h
# Nginx 指令
$ restydoc -s listen
# OpenResty 的 nginx 模块指令
$ restydoc -s content_by_lua
# 标准的 Lua 函数
$ restydoc -s string.find
# LuaJIT 的 Lua API 扩展
$ restydoc -s ffi.cdef
# OpenResty 自己的 Lua API 扩展
$ restydoc -s ngx.print
# 可以像查看整个 Nginx 模块的大型文档一样查看
$ restydoc ngx_http_rewrite_module
# 整个 Lua 模块
$ restydoc resty.mysql
# 指定 Lua 库名
$ restydoc lua-resty-lrucache
Test::Nginx 测试框架
Test::Nginx 是一个用于测试 Nginx 配置和 Lua 脚本的 Perl 模块。它提供了一系列的测试工具和函数,可以模拟 HTTP 请求,并对 Nginx 的行为进行断言和验证。Test::Nginx 的主要用途是自动化测试 Nginx 及其相关组件的配置和功能。
使用 Test::Nginx 进行测试通常需要以下步骤:
- 安装 Test::Nginx:首先需要在您的 Perl 环境中安装 Test::Nginx 模块。可以使用 CPAN 或其他 Perl 包管理工具来安装,执行相应命令即可完成。
- 编写测试脚本:使用 Test::Nginx 模块编写测试脚本,该脚本定义了要测试的 Nginx 配置和相应的断言。您可以使用 Test::Nginx 提供的函数来发送 HTTP 请求、设置请求头、检查响应内容等。
- 运行测试脚本:运行您编写的测试脚本以执行测试。Test::Nginx 会启动一个临时的 Nginx 实例,并加载您指定的配置文件和 Lua 脚本。然后,它将模拟 HTTP 请求并进行断言验证。
- 检查测试结果:根据测试脚本中的断言,Test::Nginx 将输出测试结果,显示每个断言的通过与否。这样您就可以检查 Nginx 在不同情况下的行为和响应是否符合预期。
通过 Test::Nginx,您可以自动化执行对 Nginx 配置和功能的测试,确保其在各种情况下的正常工作。它是一个有用的工具,特别适用于开发人员、运维人员和集成测试等领域。
官方仓库含有大量的测试用例,很多用法都可以在测试用例中找到。
HelloWorld
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# off 只能用于开发,不需要reload,可以使lua文件生效,生成环境不能使用,会影响性能
lua_code_cache off;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /helloworld {
content_by_lua_block {
ngx.say("Hello, world")
}
}
location /helloworld_file {
content_by_lua_file lualib/hello.lua;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
-- /usr/local/openresty/nginx/lualib.hello.lua
ngx.say('hello.lua')
# reload
$ nginx -s reload
# 验证
$ curl http://127.0.0.1/helloworld
Hello, world
$ curl http://127.0.0.1/helloworld_file
http://hello.lua
# lua_code_cache off; 只能用于开发,不需要reload,可以使修改的lua文件内容生效,生成环境不能使用,会影响性能