一、安装步骤:

参考文章:

首先MACOS安装apisix,需要用源码安装,具体步骤可以参考官网的文章/还有其他文章

https://apisix.apache.org/docs/apisix/building-apisix/


安装及部署说明:

  1. 先执行make deps安装lua的相关依赖
  2. 执行make install将运行文件拷贝到/usr/local中
  3. apisix start执行过程,首先先通过luajit编译lua,然后加载到apisix中进行运行

背景知识:

lua:

lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。在redis、openresty都可以使用lua脚本进行扩展功能。

mac通过源码安装lua:
curl -R -O http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zxf lua-5.1.4.tar.gz
cd lua-5.1.4
sudo make macosx test
sudo make install
mac通过brew安装lua

安装完成之后,

安装包路径=/usr/local/Cellar

运行环境= /usr/local/opt

执行文件=/usr/local/bin

brew install lua
安装指定版本
brew install lua@5.1

luarocks

参考文章:

luarocks是一个下载、管理lua的第三方包的命令行工具。macos安装luarocks

brew install luarocks
查看luarocks的配置
luarocks config
配置lua的程序的工作目录
luarocks config lua_dir /usr/local/opt/lua
配置lua的版本
luarocks config lua_version 5.1
luarocks安装依赖包
apisix使用luarocks进行lua的依赖管理,其不同版本的lua依赖文件在rockspec中
在Makefile的deps定义了:
luarocks install rockspec/xxx.rockspec --local --tree=deps --only-deps
其中
--tree:代表是会将依赖存放在本地deps目录
--only-deps:只安装luarocks中定义的依赖

makefile

参考文章:

make程序:

在linux和unix中,有一个强大的实用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件。

make程序需要一个编译规则说明文件,称为makefile,makefile文件中描述了整个软件工程的编译规则和各个文件之间的依赖关系。

makefile就像是一个shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个make命令,整个软件功能就完全自动编译,提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说大多数编译器都有这个命令,使用make可以是重新编译的次数达到最小化。

编译过程:

程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的ObjectFile.

二、安装过程遇到的问题:

  1. 在安装过程中可能找不到lua@5.1

通过brew install lua@5.1解决,同时可以通过luarocks config lua_version 5.1 指定lua的版本为5.1

  1. 在make install过程中报创建不了:/usr/share/lua

因为/usr/share目录在macos是被保护的,brew安装的lua默认是在/usr/local/share目录,此时可以修改apisix中的Makefile,将路径修改ENV_APISIX_PREFIX修改为/usr/local

  1. 使用apisix start启动报各种module找不到,
/usr/local/Cellar/openresty/1.21.4.1_2//luajit/bin/luajit: /usr/local/share/lua/5.1/apisix/cli/etcd.lua:18: module 'base64' not found:
    no field package.preload['base64']
# 从apisix的deps查找
    no file '/usr/local/apisix/deps/share/lua/5.1/base64.lua'
# 从运行文件执行目录查找
    no file './base64.lua'
# 从luajit执行目录查找
    no file '/usr/local/Cellar/openresty/1.21.4.1_2/luajit/share/luajit-2.1.0-beta3/base64.lua'
# 从本地的share目录查找
    no file '/usr/local/share/lua/5.1/base64.lua'
    no file '/usr/local/share/lua/5.1/base64/init.lua'
# 从luajit的share目录查找
    no file '/usr/local/Cellar/openresty/1.21.4.1_2/luajit/share/lua/5.1/base64.lua'
    no file '/usr/local/Cellar/openresty/1.21.4.1_2/luajit/share/lua/5.1/base64/init.lua'
    no file '/usr/local/apisix/base64.lua'
    no file '/usr/local/apisix/deps/lib64/lua/5.1/base64.so'
    no file '/usr/local/apisix/deps/lib/lua/5.1/base64.so'
    no file './base64.so'
    no file '/usr/local/lib/lua/5.1/base64.so'
    no file '/usr/local/Cellar/openresty/1.21.4.1_2/luajit/lib/lua/5.1/base64.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
    [C]: in function 'require'
    /usr/local/share/lua/5.1/apisix/cli/etcd.lua:18: in main chunk
    [C]: in function 'require'
    /usr/local/share/lua/5.1/apisix/cli/ops.lua:18: in main chunk
    [C]: in function 'require'
    /usr/local/share/lua/5.1/apisix/cli/apisix.lua:38: in main chunk

解决方案:发现make deps的目录没有包含在package_path里面,将make deps生成的目录拷贝到/usr/local/apisix/deps中

cd apisix-3.2
sudo cp -rf deps /usr/local/apisix/

额外解决方案:可以看下是哪个lua脚本报的依赖错误,通过错误信息看到是etcd.lua模块的依赖出了问题,通过https://luarocks.org/modules/apisix/apisix,找到apisix依赖的etcd模块是lua-resty-etcd ,重新在apisix的deps目录进行安装。

cd /usr/local/apisix 
luarocks install lua-resty-etcd --local --tree=deps