如何在 macOS 上编译运行 Apache APISIX

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
2
3
4
function install_dependencies_on_mac_osx() {
# install OpenResty, etcd and some compilation tools
brew install openresty/brew/openresty luarocks lua@5.1 wget curl git pcre openldap
}

参考:
https://github.com/apache/apisix/blob/master/utils/install-dependencies.sh#L100-L103 在 centos 平台,则会安装 apisix-base

1
2
3
4
5
6
7
8
9
10
11
12
function install_dependencies_with_yum() {
sudo yum install -y yum-utils

local common_dep="curl wget git gcc openresty-openssl111-devel unzip pcre pcre-devel openldap-devel"
if [ "${1}" == "centos" ]; then
# add APISIX source
local apisix_pkg=apache-apisix-repo-1.0-1.noarch
rpm -q --quiet ${apisix_pkg} || sudo yum install -y https://repos.apiseven.com/packages/centos/${apisix_pkg}.rpm

# install apisix-base and some compilation tools
# shellcheck disable=SC2086
sudo yum install -y apisix-base $common_dep

参考:
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 -jnproc`` 来加速整个编译的过程。

-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
2
3
4
checking for OpenSSL library ... not found
checking for OpenSSL library in /usr/local/ ... not found
checking for OpenSSL library in /usr/pkg/ ... not found
checking for OpenSSL library in /opt/local/ ... 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
2
3
export openssl_prefix=/opt/homebrew/Cellar/openresty-openssl111/1.1.1n_1
export cc_opt="-I${openssl_prefix}/include"
export ld_opt="-L${openssl_prefix}/lib"

之后我们再次运行,成功编译 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 验证功能是否正常。

参考