简介
在官网上对 OpenResty 是这样介绍的(openresty.org):
“OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。”
“OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。”
“OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。”
从以上官网描述里我们可以知道,OpenResty 官网对其定位是以 Nginx 为核心集成 Lua,打造一个兼具开发效率和高性能的服务端开发平台。
OpenResty 的核心是基于 Nginx 的一个 C 模块(lua-Nginx-module),该模块将 LuaJIT 嵌入到 Nginx 服务器中,并对外提供一套完整的 Lua API,透明地支持非阻塞 I/O,提供了轻量级线程、定时器等高级抽象。
我们可以用 Lua 语言来进行字符串和数值运算、查询数据库、发送 HTTP 请求、执行定时任务、调用外部命令等,还可以用 FFI 的方式调用外部 C 函数。这基本上可以满足服务端开发需要的所有功能。
掌握好了 OpenResty,我们就可以同时拥有脚本语言的开发效率和迭代速度,以及 Nginx C 模块的高并发和高性能优势。
下面为大家介绍本文大纲:
- OpenResty 的 hello world 该怎么写
- 快速上手 Lua 脚本语言
- OpenResty 用到的 Nginx 知识
- OpenResty 在网关安全中如何应用
OpenResty 的 hello world 该怎么写
OpenResty 的安装
OpenResty 的安装有多种方法,比如使用操作系统的包管理器、源码编译或者 docker 镜像。推荐优先使用 yum、apt-get、brew 这类包管理系统,来安装 OpenResty。
对于 Mac OS X 或 macOS 用户,强烈推荐您使用 homebrew 包管理工具安装 OpenResty。可以直接使用下面 这一条命令:
base
复制代码
brew install openresty/brew/openresty
对于一些常见的 Linux 发行版本(Ubuntu、Debian、CentOS、RHEL、Fedora、OpenSUSE、Alpine 和 Amazon Linux), OpenResty 提供 官方预编译包。确保首先用这种方式来安装。这里用 CentOS 举例,可以使用如下方式,
CentOS 9 或者更新版本
bash
复制代码
# add the yum repo: wget https://openresty.org/package/centos/openresty2.repo sudo mv openresty2.repo /etc/yum.repos.d/openresty.repo # update the yum index: sudo yum check-update
CentOS 8 或者更老版本
bash
复制代码
# add the yum repo: wget https://openresty.org/package/centos/openresty.repo sudo mv openresty.repo /etc/yum.repos.d/openresty.repo # update the yum index: sudo yum check-update
然后就可以像下面这样安装软件包,比如 openresty:
复制代码
sudo yum install -y openresty
Docker 安装
Docker 安装的方式就最为简单了,只需要输入以下命令,就可以获取打包好的镜像。
bash
复制代码
docker pull openresty/openresty
目录结构
安装 OpenResty 成功后的目录结构如下(以默认安装目录为例):
bash
复制代码
/usr/local/openresty/ #安装主目录 ├── bin #存放可执行文件 ├── luajit #LuaJIT运行库 ├── lualib #Lua组件 ├── Nginx #Nginx核心运行平台 ├── pod #参考手册(restydoc)使用的数据 └── site #包管理工具(opm)使用的数据
启动服务
yum 安装完后,就可以直接运行 openresty
命令,启动 OpenResty 服务。
bash
复制代码
/usr/local/openresty/bin/openresty #启动OpenResty服务
OpenResty 默认开启了 localhost:80 服务,使用 wget 或者 curl 这样的工具就可以验证 OpenResty 是否正常工作:
bash
复制代码
curl http://localhost:80 #curl命令发送HTTP请求
下面是一些其他常用命令,
bash
复制代码
/usr/local/openresty/bin/openresty -s stop #停止 OpenResty 服务 /usr/local/openresty/bin/openresty -s reload #重新加载 Nginx 配置文件 /usr/local/openresty/bin/openresty -t #检查 Nginx 配置文件是否正确 /usr/local/openresty/bin/openresty -c #指定配置文件启动
OpenResty 的操作命令跟 Nginx 保持一致。可以执行 openresty -h
以及 nginx -h
对比看出,
命令行工具 resty
如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:
复制代码
sudo yum install -y openresty-resty
resty 是一个 cli 工具,可以使用 -e
参数可以在命令行里直接执行 Lua 代码,我们可以在命令行执行如下命令,
base
复制代码
[root@VM-4-5-centos ~]# resty -e "print('hello world')" hello OpenResty
resty 工具还有很多选项用于配置行为,非常灵活,-e
之外较常用的有
diff
复制代码
-c :指定最大并发连接数(默认值是64); -I :指定Lua库的搜索路径; -l :指定加载某个Lua库; --http-conf :定制在http域里的指令; --main-include :定制在main域里的指令; --shdict :定制使用的共享内存(参见10.2节); --resolve-ipv6 :允许解析ipv6的地址。
想了解完整的列表,可以查看 resty -h 命令。
包管理工具 opm
跟大多数语言一样有包管理工具一样,OpenResty 也有自己的包管理工具 opm(OpenResty Package Manager),opm 在 openresty-opm 包里,安装命令如下,
复制代码
sudo yum install -y openresty-opm
opm 是 OpenResty 自带的包管理器,在你安装好 OpenResty 之后,就可以直接使用。一些常见用法如下,
bash
复制代码
opm search http #搜索关键字http opm search kafka #搜索关键字kafka opm get agentzh/lua-resty-http #安装组件,注意需要sudo opm info agentzh/lua-resty-http #显示组件的版本、作者等信息 opm remove agentzh/lua-resty-http #移除组件,同样需要sudo opm --install-dir=/opt get xxx #把组件安装到/opt目录下 opm --cwd get xxx #安装到当前目录的/resty_modules下
编写 hello world
在上文中我们使用命令行工具 resty 写了一个比较简单的 OpenResty 程序,没有 master 进程,也不会监听端口。下面让我们写一个需要启动 OpenResty 服务的 hello world。
首先找到 OpenResty 安装目录下 nginx/conf/nginx.conf
文件,在 server 下新增 OpenResty 的 content_by_lua
指令,里面嵌入了 ngx.say
的代码:
nginx
复制代码
server { listen 88; server_name localhost; location / { root html; index index.html index.htm; } location /hello { content_by_lua ' ngx.say("hello, world") '; } }
接着我们执行 openresty -s reload
命令,重新加载 nginx.conf 配置文件。没有报错的话,OpenResty 的服务就已经成功启动了。
最后使用 curl 命令,来查看结果的返回:
csharp
复制代码
[root@VM-4-5-centos conf]# curl localhost:88/hello hello, world
到这里,一个真正的 OpenResty 开发的 hello world 程序就完成了。
快速上手 Lua 脚本语言
Lua 环境
我们不用专门去安装标准 Lua 5.1 之类的环境,因为 OpenResty 已经不再支持标准 Lua,而只支持 LuaJIT。这里我介绍的 Lua 语法,也是和 LuaJIT 兼容的部分,而不是基于最新的 Lua 5.3,这一点需要特别注意。
在 OpenResty 的安装目录下,可以找到 LuaJIT 的目录和可执行文件。在 CentOS 系统下,LuaJIT 的目录如下,
csharp
复制代码
[root@VM-4-5-centos luajit]# cd /usr/local/openresty/luajit/bin/ [root@VM-4-5-centos bin]# ll total 536 lrwxrwxrwx 1 root root 18 Oct 12 11:22 luajit -> luajit-2.1.0-beta3 -rwxr-xr-x 1 root root 547728 Jul 18 12:38 luajit-2.1.0-beta3
我们可以执行 cp luajit /usr/local/bin/
将 luajit 文件复制到 /usr/local/bin/
目录下,进而可以直接使用 luajit 命令。
查看 LuaJIT 的版本号,
csharp
复制代码
[root@VM-4-5-centos ~]# luajit -v LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2022 Mike Pall. https://luajit.org/
执行 lua 脚本,
perl
复制代码
[root@VM-4-5-centos ~]# echo 'print("hello world")' > 1.lua [root@VM-4-5-centos ~]# cat 1.lua print("hello world") [root@VM-4-5-centos ~]# luajit 1.lua hello world [root@VM-4-5-centos ~]#
也可以使用 resty 来直接运行,它最终也是用 LuaJIT 来执行的,
scss
复制代码
[root@VM-4-5-centos ~]# resty -e 'print("hello world")' hello world
基本语法
变量
在 Lua 中声明变量,可以如下代码所示,
lua
复制代码
local a = 'hello' b = "world"
加了 local
关键字,用于声明局部变量。
不加 local
关键字的话,变量默认是全局的。
注释
两个减号是单行注释
diff
复制代码
-- 注释 多行注释 lua
复制代码
--[[ 多行注释 多行注释 --]]
行尾结束
Lua 中代码的行尾结束都不需要添加特殊字符,这跟 Java 不同(Java 在行尾需要添加 ;
)。
lua
复制代码
local a = 'a' print(a)