Apache APISIX 是是 Apache 软件基金会下的云原生 API 网关。APISIX 的实现基于 OpenResty, 在结构上主要可分为两层。底下一层是基于 OpenResty 定制的 apisix-base,顶上一层是采用 lua 实现的功能。
apisix-base: 是在 OpenResty 基础之上进行了定制化,扩展了 OpenResty 的功能,例如集成了 wasm-nginx-module, dubbo 以及国密证书 API 等。
在实际根据官方文档:https://apisix.apache.org/docs/apisix/next/building-apisix/ 从源码运行 Apache APISIX 发现:
在 macOS 平台中,直接采用 “brew install openresty” 而非安装 apisix-base
1 | function install_dependencies_on_mac_osx() { |
参考:
https://github.com/apache/apisix/blob/master/utils/install-dependencies.sh#L100-L103 在 centos 平台,则会安装 apisix-base
1 | function install_dependencies_with_yum() { |
参考:
https://github.com/apache/apisix/blob/master/utils/install-dependencies.sh#L55-L62 因此,如果想要使用更全功能的 APISIX,例如国密,dubbo,wasm 等,则需要将底座从 OpenResty 更换为 apisix-base。本文将基于 API7 提供的 build-apisix-base.sh 介绍在 macOS 平台编译 apisix-base 遇到的问题以及解决方案。
下载编译脚本
在安装 apisix-base 依赖之前,我们需要先 clone 本次使用的 apisix-build-tools:
API7 官方采用该 apisix-build-tools 构建 apisix, apisix-dashboard, apisix-base 项目的 rpm, deb, apk 包。
1 | git clone https://github.com/api7/apisix-build-tools.git |
安装 apisix-base 依赖
在编译 apisix-base 时,nginx 将依赖几个库,所以我们需要提前安装这部分依赖。
1 | brew install pcre openresty-openssl111 zlib |
另外 build-apisix-base.sh 中还会编译 amesh,为了确保 build-apisix-base.sh 能够完整执行,我们需要依赖 golang >= 1.18,如果没有的话可以通过如下命令安装 golang:
1 | brew install go@1.18 |
编译 apisix-base
完成依赖的安装之后,我们开始执行 “build-apisix-base.sh”
1 | bash build-apisix-base.sh |
问题一:”nproc: command not found”
在运行过程中提示 “nproc: command not found”, nproc 的主要作用是为了获取机器当前的 cpu 数量。在 “build-apisix-bash.sh” 中会使用 make -j
nproc`` 来加速整个编译的过程。
-j [jobs], –jobs[=jobs]
Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.
关于 make -j 的内容可以参考链接:https://linux.die.net/man/1/make
发现问题之后,我们可以通过如下两个方式来解决:
方式一: 安装包含 nproc 的 coreutils 包
1 | brew install coreutils |
方式二: 将 nproc 命令采用其他命令代替
1 | alias nproc="sysctl -n hw.logicalcpu" |
问题二: “OpenSSL library not found”
修复之后,重新运行 build-apisix-base.sh 之后提示
1 | checking for OpenSSL library ... not found |
发现编译的过程中编译器只在 “/usr/local/“, “/usr/pkg”, “/opt/local/“ 目录中查找 OpenSSL 库,
关于为什么按照这个顺序查找 OpenSSL library,我也找到了对应的源码,
参考:https://github.com/nginx/nginx/blob/master/auto/lib/openssl/conf#L69C9-L121
而我们通过 brew 安装的 OpenSSL 目录地址可以通过
1 | brew info openresty-openssl111 |
发现在 “/opt/homebrew/Cellar/openresty-openssl111/1.1.1n_1” 目录,因此我们需要指定 OpenSSL library 的地址。好在 “build-apisix-tools.sh” 提供了 “cc_opt“ 和 “ld_opt“ 两个编译和链接选项,因此我们只需要在这两个选项中指定 OpenSSL 库地址即可。结合笔者在 macOS 平台使用的编译工具文档 (通过执行 cc -help ) 发现:通过 -I 选项可以指定 Include 目录的搜索路径,-L 选项可以指定 library 的查找路径。因此,通过如下预先设置如下环境变量即可 (设置环境变量之前可以通过 brew info 预先检查路径是否准确)
1 | export openssl_prefix=/opt/homebrew/Cellar/openresty-openssl111/1.1.1n_1 |
之后我们再次运行,成功编译 apisix-base。
1 | bash build-apisix-base.sh |
确认 apisix-base 编译成功
执行 “build-apisix-base.sh” 脚本成功之后,我们可以通过如下命令来确认是否成功编译 apisix-base 首先将 “/usr/local/openresty/bin/openresty” 软链到 “/usr/local/bin” 目录下:
1 | sudo ln -s /usr/local/openresty/bin/openresty /usr/local/bin/openresty |
然后执行如下命令:
1 | openresty -V 2>&1 | grep apisix |
如果能够看到有结果输出,则表明当前 openresty 二进制文件已经是由 apisx-build-tools 编译产生,否则表明 openresty 仍然是官方下载的预编译二进制。
或者通过运行 APISIX,根据官方文档使用 dubbo-proxy 验证功能是否正常。