Kong网关:入门、实战与进阶
上QQ阅读APP看书,第一时间看更新

4.2 OpenResty详解

我们先来看一下OpenResty服务器的目录结构、Resty CLI和包管理工具。

4.2.1 OpenResty服务器的目录结构

OpenResty服务器的目录结构中除了包含可执行文件之外,还包含大量Lua组件、LuaJIT运行库、resty命令行工具、文档查看工具和第三方组件包等。我们可以使用openresty-V指令来查看OpenResty的默认安装路径。这里以Mac系统为例。


$ openresty -V
nginx version: openresty/1.17.8.2
built by clang 11.0.0 (clang-1100.0.33.8)
built with OpenSSL 1.1.1g  21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/Cellar/openresty/1.17.8.2_1/nginx 
  --with-cc-opt='-O2 -I/usr/local/include -
  I/usr/local/opt/pcre/include -I/usr/local/opt/openresty-
  openssl111/include' ... --pid-path=/usr/local/var/run/openresty.pid 
  --lock-path=/usr/local/var/run/openresty.lock --conf-
  path=/usr/local/etc/openresty/nginx.conf --http-log-
  path=/usr/local/var/log/nginx/access.log --error-log-
  path=/usr/local/var/log/nginx/error.log ...

我们发现openresty-V指令与第2章中的nginx-V指令输出的信息几乎一样,这也间接反映了Nginx与OpenResty两者之间的关联。进入安装目录/usr/local/Cellar/openresty/1.17.8.2_1/,可以发现整体目录结构,具体如下。


.
├── COPYRIGHT
├── INSTALL_RECEIPT.json    # Homwbrew安装工具的自带信息
├── README.markdown        # 帮助信息
├── bin                # 可执行文件位置
├── homebrew.mxcl.openresty.plist
├── luajit            # LuaJIT 运行库
├── lualib            # Lua组件
├── nginx            # Nginx 核心运行平台
├── pod                # 参考手册(restydoc)使用的数据
├── resty.index
└── site                # 包管理工具(opm)使用的数据

bin目录中的openresty可执行文件其实本质就是nginx:


.
├── ...
├── openresty -> ../nginx/sbin/nginx
├── ...

4.2.2 Resty CLI

OpenResty的bin目录中存放了很多可执行文件,它们统称为Resty CLI。其中,最为有用的是resty命令行工具。bin目录的文件结构如下:


.
├── md2pod.pl
├── nginx-xml2pod
├── openresty -> ../nginx/sbin/nginx
├── opm
├── resty
├── restydoc
└── restydoc-index

·md2pod.pl:主要用于将GitHub风格的Markdown格式文档转换为Perl的POD格式文档。代码清单4-1展示了它的基本用法。

程序清单4-1 使用md2pod转换文件格式


$ file README.markdown
README.markdown: UTF-8 Unicode text
$ md2pod.pl -o READE README.markdown
$ file READE
READE: Perl POD document text, UTF-8 Unicode text, with very long lines

·nginx-xml2pod:主要用于将Nginx官方的XML格式文档转换为Perl的POD格式文档(用法与md2pod.pl相似)。

·openresty:本质就是Nginx指令,软链接到Nginx可执行文件。


$ ll openresty
lrwxr-xr-x  1 admin  admin  19  8 11 10:00 openresty -> ../nginx/sbin/nginx

·opm:OpenResty官方包管理工具。

·restydoc:使用命令行方式查看OpenResty、Nginx文档,例如代码清单4-2查看Nginx的ngx_http_access_module模块文档。

程序清单4-2 查看ngx_http_access_module模块文档


$ restydoc ngx_http_access_module
ngx_http_access_module(7)            nginx           ngx_http_access_module(7)
NAME
...
Example Configuration
  location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
  }
...
Directives
...

·restydoc-index:主要用于通过扫描用户指定目录中的Markdown和POD格式文档来生成文档索引。

·resty:其可以像Lua解释器或者LuaJIT一样,直接运行OpenResty环境下的Lua脚本。该工具会创建一个Nginx实例,但是如守护程序、master进程、日志文件等非必需组件都会被禁用。由于配置中不包含server块,因此不涉及监听套接字。输入的Lua代码由init_worker_by_lua指令初始化,在ngx.timer的回调方法中运行,因此在ngx.timer上下文中所有可运行的ngx_lua API都可以在resty命令行中使用。

4.2.3 OpenResty包管理工具

大多数编程语言或者开发环境会提供配套的包管理工具。OpenResty将OPM作为官方包管理工具,同时支持LuaRocks。

1.OPM

OPM全称OpenResty Package Manager,是OpenResty官方提供的包管理工具。用户可以使用opm命令行远程下载第三方包,也可以将自己写的包应用上传至服务器,供其他开发者使用。OPM同OpenResty程序一起安装,不需要用户单独安装,在安装完OpenResty之后即可直接使用。OPM对restydoc工具也提供了支持,方便用户查看文档。

用户可以输入opm-h指令查看OPM的具体使用方式。这里我们介绍一些高频使用的指令,具体如下。


list                  列出已经安装的包,并显示包的名称与版本
remove PACKAGE...        删除一个包
search QUERY...        在opm.openresty.org的PostgreSQL数据库中搜
                索包名或者摘要信息匹配的包,第一次查询较慢,查询结束后把结果缓
                存一段时间
update            将本地安装的包全部更新为最新版本
upgrade PACKAGE...     更新指定包到最新版本

读者在使用OPM过程中应按搜索、选择、安装、验证等步骤进行操作。代码清单4-3为读者展示了安装pgmoon模块(使用Lua编写的PostgreSQL客户端库)。

程序清单4-3 使用OPM安装pgmoon模块


# 搜索
$ opm search pgmoon
gnois/losty            Web framework in Luaty on OpenResty
xiangnanscu/pgmoon        A PostgreSQL client library written in pure 
                    Lua (MoonScript)
xiangnanscu/lua-resty-query    convenient wrapper for lua-resty-mysql or 
                    pgmoon
leafo/pgmoon            A PostgreSQL client library written in pure 
                    Lua (MoonScript)
agentzh/pgmoon            A PostgreSQL client library written in pure 
                    Lua (MoonScript)
# 选择、安装
$ opm install agentzh/pgmoon
# 验证
$ opm list
agentzh/pgmoon            1.6.0
# 更新版本
$ opm upgrade agentzh/pgmoon
* Fetching agentzh/pgmoon > 1.6.0
Package agentzh/pgmoon 1.6.0 is already the latest version.

在安装过程中,如何选择合适的包是一个比较棘手的问题,因为OPM包管理工具中没有提供下载次数或者软件评级这种有效信息供我们选择。这里,笔者推荐用户认准第三方包的开发者,比如此处我们选择了OpenResty。

2.LuaRocks

LuaRocks是OpenResty的另一个包管理工具。它出现在OPM之前,是Lua语言中经典的包管理工具。OPM只能管理OpenResty相关的包,而LuaRocks的管理范围更大,作用于整个Lua环境。例如luasql-mysql第三方包是lua脚本连接MySQL的工具包,但并不能在OpenResty中使用。

读者可以使用luarocks--help指令查看LuaRocks的具体使用方法。这里同样只介绍比较常用的指令。


--tree=<tree>        指定对应的目录,Mac中默认的目录为/usr/local
install            安装一个rock包
list            列出已经安装的rock包
purge            在指定的tree目录下删除所有已经安装的包
remove            删除一个rock包
search            在LuaRocks服务中搜索一个rock包
show            显示已经安装的rock包信息

LuaRocks的使用方法与OPM相似。不同的是,LuaRocks在安装某些包时需要安装依赖。这里同样以pgmoon模块为例,参考代码清单4-4。

程序清单4-4 使用LuaRocks安装pgmoon模块


# 搜索
$ luarocks search pgmoon
...
kpgmoon
  1.8.1-1 (rockspec) - https://luarocks.org
  1.8.1-1 (src) - https://luarocks.org
pgmoon
  1.11.0-1 (rockspec) - https://luarocks.org
  1.11.0-1 (src) - https://luarocks.org
  1.10.0-1 (rockspec) - https://luarocks.org
  1.9.0-1 (rockspec) - https://luarocks.org
  1.9.0-1 (src) - https://luarocks.org
  ...
pgmoon-mashape
  2.0.1-1 (rockspec) - https://luarocks.org
  2.0.0-1 (rockspec) - https://luarocks.org
  1.7.0-1 (rockspec) - https://luarocks.org
# 安装到指定的tree目录中
$ luarocks install pgmoon --tree=~/Desktop/test/
Installing https://luarocks.org/pgmoon-1.11.0-1.src.rock
Missing dependencies for pgmoon 1.11.0-1:
  luabitop (not installed)
  lpeg (not installed)
...
# 安装依赖
$ luarocks install luabitop --tree=~/Desktop/test/
Installing https://luarocks.org/luabitop-1.0.1-1.src.rock
...
luabitop 1.0.1-1 is now installed in ~/Desktop/test
$ luarocks install lpeg --tree=~/Desktop/test/
Installing https://luarocks.org/lpeg-1.0.2-1.src.rock
...
lpeg 1.0.2-1 is now installed in ~/Desktop/test
# 重新安装包
$ luarocks install pgmoon --tree=~/Desktop/test/
# 验证
$ luarocks list --tree=~/Desktop/test/
lpeg
  1.0.2-1 (installed) - ~/Desktop/test/lib/luarocks/rocks-5.3
luabitops
  1.0.1-1 (installed) - ~/Desktop/test/lib/luarocks/rocks-5.3
pgmoon
  1.11.0-1 (installed) - ~/Desktop/test/lib/luarocks/rocks-5.3

安装包时,我们也可以在官网(https://luarocks.org)查看安装包的详细信息,包括该包的下载次数、简介、版本号、依赖关系等。读者可以综合这些信息挑选自己想要的第三方包。