总览
随着国家对信息安全和自主可控技术的日益重视,信创改造正成为各大企业及政府部门的重要任务。公司目前在x86架构的Red Hat系统上部署了Kong网关2.2.1,并且通过官方RPM包实现了快速部署。为了顺应信创转型,现阶段需要在aarch64架构的信创麒麟v10系统上部署Kong网关。
由于官方未提供针麒麟v10的aarch64架构的RPM包,本文采用源码编译方式完成适配安装。在内网无外网访问的环境下,所有依赖包和源码需提前准备并离线安装。本文详细记录了环境准备、源码获取、编译配置、安装验证以及离线分发方案的过程。
环境准备
1.确认系统信息
在一台可以连接外网的虚拟机上执行 uname -a
,确认信创机器系统内核和硬件信息,输出如下:
Linux ptvepqp1wZ 4.19.90-52.22.v2207.ky10.aarch64 #1 SMP Tue Mar 14 11:52:45 CST 2023 aarch64 aarch64 aarch64 GNU/Linux
2.获取kong编译工具
从GitHub克隆kong-build-tools工具(适用于3.0版本以下的Kong网关编译),使用默认的master即可:
git clone https://github.com/Kong/kong-build-tools.git
利用kong-build-tools可实现:
- 下载openresty、openssl、luarocks、pcre等依赖;
- 应用openresty补丁;
- 在openresty编译时添加lua-kong-nginx-module(增强OpenResty的功能,扩展Nginx的Lua API);
- 编译并安装上述依赖;
3.获取源码
下载kong网关源码,https://github.com/Kong/kong/releases
下载lua-kong-nginx-module,根据kong网关2.4发布的时间下载0.08的tag
4.安装必要依赖
- 安装开发工具:
yum groupinstall "Development Tools" -y
- 安装zlib及开发包:
yum install zlib zlib-devel -y
- 安装libyaml:
在安装libyaml-devel(必要依赖)的时候,报错yum源中找不到该组件,则要根据操作系统版本及其服务包版本到官网进行下载:libyaml-devel-0.2.5-1.ky10.aarch64.rpm,下载后传到机器上进行安装
yum install libyaml
yum localinstall libyaml-devel-0.2.5-1.ky10.aarch64.rpm
编译安装
准备工作
- 进入kong-build-tools中的openresty-build-tools目录,创建work文件夹,并将已下载的lua-kong-nginx-module文件夹移入其中;
- 修改openresty-build-tools目录下的kong-ngx-build文件
- 将 DOWNLOAD_ONLY 设置为1,仅下载依赖,确认无误后再进行编译;
- 设置 RESTY_LMDB 和 RESTY_EVENTS 为0(Kong 2.4不依赖这两个组件);
- 注释掉以git方式下载lua-kong-nginx-module的部分(因已手动下载)。
依赖下载
- kong 2.4的源码中的.requirements文件中描述了所需的主要组件的版本号
- 执行
/usr/bin/openssl version
,可看到系统自带的OpenSSL版本为 1.0.2k-fips,因为系统中自带的openssl版本较低,所以我们也要安装kong网关所需的openssl。 - 执行如下命令下载openresty、luarocks、openssl和pcre依赖:
./kong-ngx-build --prefix /opt/kong --work work --openresty 1.19.3.1 --openssl 1.1.1k --kong-nginx-module master --luarocks 3.9.2 --pcre 8.44
依赖下载成功后在work文件中如下所示:
编译安装依赖
-
将kong-build-tools文件中的DOWNLOAD_ONLY 重新设置为空,重新执行上述命令进行编译安装,所有组件均安装在/opt/kong目录下
./kong-ngx-build --prefix /opt/kong --work work --openresty 1.19.3.1 --openssl 1.1.1k --kong-nginx-module master --luarocks 3.9.2 --pcre 8.44
-
安装成功后,/opt/kong目录下将包含openresty、openssl、luarocks等文件:
环境变量配置
设置环境变量,确保各组件正常调用:
export KONG_DIR=/opt/kong
export OPENSSL_DIR=$KONG_DIR/opensslPATH=$KONG_DIR/openresty/bin:$KONG_DIR/openresty/nginx/sbin:$OPENSSL_DIR/bin:$KONG_DIR/luarocks/bin:$PATH:$HOME/binexport PATH
验证依赖安装
openresty:
执行 openresty -V
,应显示包含lua-kong-nginx-module、pcre等模块的详细编译信息。
openresty -V
nginx version: openresty/1.19.3.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1k 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/opt/kong/openresty/nginx --with-cc-opt='-O2 -I/opt/kong/openssl/include' --add-module=../ngx_devel_kit-0.3.1 --add-module=../echo-nginx-module-0.62 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../srcache-nginx-module-0.32 --add-module=../ngx_lua-0.10.19 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.15 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.9 --with-ld-opt='-Wl,-rpath,/opt/kong/openresty/luajit/lib -L/opt/kong/openssl/lib -Wl,--disable-new-dtags,-rpath,/opt/kong/openssl/lib' --with-pcre-jit --with-http_ssl_module --with-http_sub_module --with-http_realip_module --with-http_stub_status_module --with-http_v2_module --add-module=/root/software/kong-build-tools-master/openresty-build-tools/work/lua-kong-nginx-module --add-module=/root/software/kong-build-tools-master/openresty-build-tools/work/lua-kong-nginx-module/stream --with-stream_realip_module --with-stream_ssl_preread_module --with-pcre=/root/software/kong-build-tools-master/openresty-build-tools/work/pcre-8.44 --with-pcre-opt=-g --with-stream --with-stream_ssl_module
openssl:
执行 openssl version
,应输出 OpenSSL 1.1.1k
openssl version
OpenSSL 1.1.1k 25 Mar 2021
LuaRocks:
执行 luarocks --version
,应显示 luarocks 3.9.2
luarocks --version
/opt/kong/luarocks/bin/luarocks 3.9.2
LuaRocks main command-line interface
安装Kong网关
- 将Kong网关源码包解压至/opt/kong目录,根据 kong-2.4.1-0.rockspec 文件中dependencies部分定义的Lua依赖进行安装。
- 在实际安装时发现luarocks无法从官网下载安装lua-messagepack,所以需要先到luarocks官网下载lua-messagepack依赖包后手动安装。
luarocks install lua-messagepack-0.5.2-1.src.rock lua-messagepack 0.5.2-1 depends on lua >= 5.1 (5.1-1 provided by VM)
lua-messagepack 0.5.2-1 is now installed in /opt/kong/luarocks (license: MIT/X11)
*进入kong网关源码目录,执行 make install
,即可完成kong网关的安装。
配置Lua环境变量
执行 luarocks path 获取Lua路径设置,然后将LUA_PATH、LUA_CPATH以及Kong的bin目录添加到环境变量中,并写入.bash_profile
luarocks path
export LUA_PATH='/opt/kong/luarocks/share/lua/5.1/?.lua;./?.lua;/opt/kong/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/opt/kong/openresty/luajit/share/lua/5.1/?.lua;/opt/kong/openresty/luajit/share/lua/5.1/?/init.lua;/root/.luarocks/share/lua/5.1/?.lua;/root/.luarocks/share/lua/5.1/?/init.lua;/opt/kong/luarocks/share/lua/5.1/?/init.lua'
export LUA_CPATH='./?.so;/usr/local/lib/lua/5.1/?.so;/opt/kong/openresty/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;/root/.luarocks/lib/lua/5.1/?.so;/opt/kong/luarocks/lib/lua/5.1/?.so'
export PATH='/root/.luarocks/bin:/opt/kong/kong/bin:/opt/kong/openresty/bin:/opt/kong/openresty/nginx/sbin:/opt/kong/openssl/bin:/opt/kong/luarocks/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
验证kong网关安装
执行:
kong version --vv
输出:
2025/03/20 15:25:07 [verbose] Kong: 2.4.1
2025/03/20 15:25:07 [debug] ngx_lua: 10019
2025/03/20 15:25:07 [debug] nginx: 1019003
2025/03/20 15:25:07 [debug] Lua: LuaJIT 2.1.0-beta3
2.4.1
安装包分发
在内网无外网环境下,可通过以下方式分发已安装的Kong网关及其依赖:
打包kong-build-tools目录
将包含所有依赖的kong-build-tools-master目录打包,移至新机器后通过如下命令安装openresty等依赖:
./kong-ngx-build --prefix /opt/kong --work work --openresty 1.19.3.1 --openssl 1.1.1k --kong-nginx-module master --luarocks 3.9.2 --pcre 8.44
Lua依赖打包
- 利用luarocks pack将已安装的Lua依赖打包成rock文件;
- 内网机器通过luarocks install进行安装,这里在安装的时候要注意lua包的依赖关系,避免出现安装某个lua包时找不到依赖。
使用luarocks list
查找所有安装的lua依赖
Rocks installed for Lua 5.1
---------------------------ansicolors1.0.2-3 (installed) - /opt/kong/luarocks/lib/luarocks/rocks-5.1binaryheap0.4-1 (installed) - /opt/kong/luarocks/lib/luarocks/rocks-5.1date2.2.1-1 (installed) - /opt/kong/luarocks/lib/luarocks/rocks-5.1......
-
使用luarocks show查看lua包的依赖关系,如
luarocks show lua-resty-acme
,显示如下:
-
lua包依赖打包和安装示例脚本
#!/bin/bash# 打包lua依赖,lua_dependency.log为按照依赖关系整理的lua包名称
# lua_dependency.log中内容为:
# luafilesystem
# lua-resty-openssl
# lpeg
# lua_pack
# lua-protobuf
# lua-resty-httpawk '!seen[$0]++ && NF' lua_dependency.log | while IFS= read -r line; doif [[ -n "$line" ]]; thenecho "Packing $package..."luarocks pack "$line"fidone# 安装lua包依赖
awk '!seen[$0]++ && NF' lua_dependency.log | while IFS= read -r package; dorock_file=$(ls "$package"-*.rock 2>/dev/null)if [ -n "$rock_file" ]; thenecho "luarocks install $rock_file"luarocks install "$rock_file"elseecho "Warning: $package rock file not found!"fi
done
在所有离线依赖安装完毕后,再对Kong网关源码进行编译安装,即可成功在内网环境下部署Kong网关。