Kong微服务网关Gzip压缩加速参考实践
发表于 2026/06/30
0
1 非商用说明
该文档提供的内容为参考实践,仅供用户参考使用,用户可参考实践文档构建自己的软件,按需进行安全、可靠性加固,但不建议直接将相关Demo或镜像文件集成到商用产品中。
2 背景
Kong 是一款基于 OpenResty(Nginx + Lua 模块)编写的高可用、易扩展的,由 Mashape 公司开源的 API Gateway 项目。Kong 是基于 NGINX 和 Apache Cassandra 或 PostgreSQL 构建的,能提供易于使用的 RESTful API 来操作和配置 API 管理系统,所以它可以水平扩展多个 Kong 服务器,通过前置的负载均衡配置把请求均匀地分发到各个 Server,来应对大批量的网络请求。
在新能源集控一体机场景,采用Kong API网关实现API请求分发,为了降低客户端与网关之间的网络负载,在Kong网关中启用Gzip压缩,实现HTTP请求压缩后再转发,显著减少传输数据量,提升响应速度。原生Kong调用系统通用压缩库完成Gzip压缩和解压处理,占用网关CPU资源,通过适配鲲鹏KAE硬件加速压缩库,压缩过程交由硬件加速引擎处理,可以解决软件压缩方案CPU占用高、吞吐低、延迟高的问题。
3 方案介绍
3.1 方案简介
通过鲲鹏KAE硬加速,优化Kong Gzip压缩算法性能,方案架构图如下:

3.2 推荐使能KAE硬加速压缩算法
推荐使用鲲鹏服务器KAE硬加速的压缩解压缩算法列表:
压缩算法 | 920新型号服务器 |
|---|---|
Gzip | √ |
Zlib | √ |
Deflate格式 | √ |
3.3 约束
本特性使能920新型号,920新型号后续更新BIOS可以免KAE license使用,使用配套BIOS版本。
Kong2.2.1版本支持使能Gzip压缩。
3.4 推荐配置
920新型号服务器KAE加速Kong Gzip压缩推荐配置:
软件信息表:
类别 | 软件版本 |
|---|---|
OS | openEuler 22.03 LTS-SP4 |
KAE | 2.0 |
Kong | 2.2.1 |
wrk | 4.2.0 |
硬件配置表:
类别 | 硬件描述 |
|---|---|
CPU | 鲲鹏7270Z 64C@2.9Ghz |
内存 | 16*32GB |
硬盘 | 2*3.7TB NVMe硬盘 |
网络 | 2*25GE网卡 |
4 部署指导
4.1 前置条件
若环境有外网条件,可不用配置本地yum源,直接用系统配置好的网上源或者自己添加网上源即可。
1、下载openEuler-22.03-LTS-SP2的系统镜像,并上传当前系统的iso镜像文件到“/root”,挂载本地镜像源
mount /root/openEuler-22.03-LTS-SP2-everything-aarch64-dvd.iso /media/2、配置repo源
新建“local.repo”文件。
vi /etc/yum.repos.d/local.repo按“i”键进入编辑模式,添加以下内容。
[local]
name=system
localbaseurl=file:///media/
enabled=1
gpgcheck=0按“Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
3、生成本地Yum缓存
yum clean all && yum makecache4.2 具体步骤
4.2.1 物理机部署
步骤1:安装依赖项
# 安装基础编译工具链
yum install -y git gcc make cmake libyaml-devel openssl-devel pcre-devel zlib-devel libyaml* openssl gcc-c++ automake autoconf libtool perl wget patch unzip
# 克隆Kong构建工具依赖包
git clone https://github.com/Kong/kong-build-tools
# 安装kong基础环境依赖
cd /path/to/kong-build-tools
./openresty-build-tools/kong-ngx-build --prefix /path/to/kong-build --openresty 1.17.8.2 --openssl 1.1.1g --pcre 8.44 --luarocks 3.2.1
# 加载环境变量(当前仅在当前终端会话内临时加载环境变量,新建终端窗口时需重新执行加载操作方可生效)
export PATH=/path/to/kong-build/openresty/bin:$PATH
export PATH=/path/to/kong-build/openresty/nginx/sbin:$PATH
export PATH=/path/to/kong-build/openssl/bin:$PATH
export PATH=/path/to/kong-build/luarocks/bin:$PATH
export LD_LIBRARY_PATH=/path/to/kong-build/openresty/luajit/lib:$LD_LIBRARY_PATH
# 验证安装
openssl version -a
openresty -v
luarocks --version步骤2:安装Kong
# 克隆Kong源码
git clone https://github.com/Kong/kong.git
cd kong
git checkout 2.2.1
# 编译安装Kong
cd /path/to/kong
make install
# 加载环境变量(当前仅在当前终端会话内临时加载环境变量,新建终端窗口时需重新执行加载操作方可生效)
export PATH=/path/to/kong/bin:$PATH
export LUA_PATH="/path/to/kong-build/luarocks/share/lua/5.1/?.lua;;"
# 验证安装
kong version -vv说明:编译安装Kong时,若环境无法自动拉取依赖包,可前往 Luarocks 官网手工下载安装包离线部署,官网地址:https://luarocks.org/
步骤3:安装KAE
# 安装依赖
yum install -y make kernel-devel-`uname -r` libtool numactl-devel openssl-devel lz4-devel libzstd-devel chrpath cmake libunwind-devel patch
# 设置环境变量
export OPENSSL_ENGINES=/usr/local/lib/engines-1.1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/libKAE的安装方式有源码安装和RPM包安装,使用一种方式完成安装即可。
方式1:源码安装
# 拉取KAE2.0源码
git clone https://gitcode.com/boostkit/KAE.git -b kae2
# 执行安装脚本
cd KAE
sh build.sh all # 如果环境上已安装过KAE,则需执行sh build.sh cleanup清理后再重新安装说明:若安装阶段提示“modprobe: FATAL: Module hisi_* is in use”模块占用报错,需先执行 sh build.sh cleanup 清理已加载驱动,再重新执行安装流程。
方式2:RPM包安装
KAE开源社区提供了部分OS编译完成的RPM安装包,RPM包获取链接(根据系统版本自行选择对应zip包,若没有对应版本则使用源码编译方式):https://gitee.com/kunpengcompute/KAE/releases。
# 以openEuler22.03 SP4为例
unzip openeuler22.03_sp4.zip
cd openeuler22.03_sp4
rpm -ivh kae-driver-2.0.3-1.aarch64.rpm
rpm -ivh kae-zip-2.0.3-1.aarch64.rpm查看zlib加速压缩库是否安装成功。
ll /usr/local/kaezip/lib/回显信息如下所示,表示安装成功。
lrwxrwxrwx. 1 root root 40 Aug 29 10:20 libkaezip.so -> /usr/local/kaezip/lib/libkaezip.so.2.0.0
lrwxrwxrwx. 1 root root 40 Aug 29 10:20 libkaezip.so.0 -> /usr/local/kaezip/lib/libkaezip.so.2.0.0
-rwxr-xr-x. 1 root root 148096 Aug 29 10:20 libkaezip.so.2.0.0
-rw-r--r--. 1 root root 145674 Aug 29 10:20 libz.a
lrwxrwxrwx. 1 root root 14 Aug 29 10:20 libz.so -> libz.so.1.2.11
lrwxrwxrwx. 1 root root 14 Aug 29 10:20 libz.so.1 -> libz.so.1.2.11
-rwxr-xr-x. 1 root root 144784 Aug 29 10:20 libz.so.1.2.11
drwxr-xr-x. 2 root root 4096 Aug 29 10:20 pkgconfig步骤4:生成声明性配置文件
以下命令会在当前文件夹中生成kong.yml文件。
kong config init
vim kong.yml参考如下对kong.yml文件进行修改。
_format_version: "2.1"
# _transform is optional, defaulting to true.
# It specifies whether schema transformations should be applied when importing this file
# as a rule of thumb, leave this setting to true if you are importing credentials
# with plain passwords, which need to be encrypted/hashed before storing on the database.
# On the other hand, if you are reimporting a database with passwords already encrypted/hashed,
# set it to false.
_transform: true
# Each Kong entity (core entity or custom entity introduced by a plugin)
# can be listed in the top-level as an array of objects:
services:
- name: test-service
url: http://127.0.0.1:8001
routes:
- name: test-route
service: test-service
paths:
- /步骤5:添加配置文件kong.conf
cd /path/to/kong
cp kong.conf.default kong.conf
vim kong.conf参考如下内容对kong.conf文件进行调整。
# 设置日志路径及日志级别
proxy_error_log = /dev/null
admin_error_log = /dev/null
status_error_log = /dev/null
log_level = emerg
status_access_log = off
# 关闭数据库模式
database = off
plugins = off
# 指定声明式配置文件路径
declarative_config = /path/to/kong/kong.yml
# =============================Gzip压缩配置=================================
nginx_http_gzip = on
nginx_http_gzip_types = text/plain text/css text/html application/json application/javascript text/xml application/xml application/xml+rss text/javascript
nginx_http_gzip_min_length = 1k
nginx_http_gzip_comp_level = 1
nginx_http_gzip_buffers = 4 1024k
nginx_http_gzip_http_version = 1.1
nginx_http_gzip_proxied = any
nginx_http_gzip_vary = on
# =============================系统运行权限=================================
nginx_main_user = root
# =============================工作进程与CPU绑核优化============================
nginx_main_worker_processes = 8
nginx_main_worker_cpu_affinity = 10000 100000 1000000 10000000 100000000 1000000000 10000000000 100000000000
nginx_main_worker_rlimit_nofile = 819200
# =============================网络事件模型优化=============================
nginx_events_worker_connections = 102400
nginx_events_use = epoll
nginx_events_multi_accept = on
nginx_events_accept_mutex = off步骤6:启动Kong
./bin/kong start -c ./kong.conf步骤7:验证Kong gzip功能
curl -I -H "Accept-Encoding: gzip" http://localhost:8000如果响应头包含Content-Encoding: gzip,则表明响应数据已完成gzip压缩。

步骤8:如需停止Kong可参考如下命令
./bin/kong stop4.2.2 虚拟机部署
在搭建虚拟机环境前首先需要参考如下步骤将相关设备进行虚拟化:
步骤1:BIOS使能SMMU
重启服务器,在BIOS设置界面进入Advanced->MISC Config页面打开Support Smmu以及Smmu Work Around配置项。

步骤2:查询HostOS环境中安装的加速器和对应的bdf号
ls -al /sys/class/uacce
步骤3:虚拟化加速器VF(以hisi_zip-0设备为例,虚拟出3个VF)
echo 3 > /sys/devices/pci0000:30/0000:30:00.0/0000:31:00.0/sriov_numvfs
可参考如下步骤进行虚拟机环境搭建:
步骤1:安装依赖
yum -y install qemu qemu-system-aarch64 edk2-aarch64.noarch libvirt步骤2:下载虚拟机qcow2镜像,本参考实践以openEuler22.03-LTS-SP4为例
下载链接: https://repo.openeuler.org/openEuler-22.03-LTS-SP4/virtual_machine_img/aarch64/
解压镜像压缩包
yum install xz
unxz openEuler-22.03-LTS-SP4-aarch64.qcow2.xz步骤3:启用libvirtd服务
systemctl start libvirtd.service
setenforce 0步骤4:修改虚拟机配置文件
新建虚拟机配置文件
vim vm-libvirt.xml参考以下内容修改虚拟机配置文件
<domain type='kvm'>
<!-- 虚拟机名称 -->
<name>nvm-test-1</name>
<!-- 虚拟机内存 -->
<memory unit='GiB'>64</memory>
<!-- 虚拟处理器的个数 -->
<vcpu placement='static'>8</vcpu>
<iothreads>2</iothreads>
<cputune>
<vcpupin vcpu='0' cpuset='4'/>
<vcpupin vcpu='1' cpuset='5'/>
<vcpupin vcpu='2' cpuset='6'/>
<vcpupin vcpu='3' cpuset='7'/>
<vcpupin vcpu='4' cpuset='8'/>
<vcpupin vcpu='5' cpuset='9'/>
<vcpupin vcpu='6' cpuset='10'/>
<vcpupin vcpu='7' cpuset='11'/>
<emulatorpin cpuset='4-11'/>
</cputune>
<numatune>
<memnode cellid="0" mode="strict" nodeset="0"/>
</numatune>
<cpu mode='host-passthrough' check='none'>
<topology sockets='1' dies='1' clusters='1' cores='8' threads='1'/>
<numa>
<cell id='0' cpus='0-7' memory='67108864' unit='KiB'/>
</numa>
</cpu>
<os>
<type arch='aarch64' machine='virt'>hvm</type>
<!-- 这里是arm架构的 -->
<loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
<!-- 指定nvram文件路径,用于存储UEFI启动配置 保证文件名不冲突即可 -->
<nvram>/var/lib/libvirt/qemu/nvram/nvm-test-1.fd</nvram>
</os>
<features>
<acpi/>
<gic version='3'/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<!-- 创建软链接指向编译qemu后build目录下的qemu-system-aarch64 -->
<emulator>/usr/libexec/qemu-kvm</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' iothread="1"/>
<!-- 镜像路径 -->
<source file='/path/to/openEuler-22.03-LTS-SP4-aarch64.qcow2'/>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/path/to/openEuler-22.03-LTS-SP4-aarch64-dvd.iso'/>
<readonly/>
<target dev='sdb' bus='scsi'/>
<boot order='2'/>
</disk>
<interface type='network'>
<!-- 建议配置network NAT网络模式 -->
<source network='default'/>
<model type='virtio'/>
</interface>
<console type='pty'/>
<video>
<model type='virtio'/>
</video>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x31' slot='0x00' function='0x1'/>
</source>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x31' slot='0x00' function='0x2'/>
</source>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x31' slot='0x00' function='0x3'/>
</source>
</hostdev>
<controller type='scsi' index='0' model='virtio-scsi'/>
<controller type='usb' model='ehci'/>
<input type='tablet' bus='usb'/>
<input type='keyboard' bus='usb'/>
</devices>
<qemu:commandline>
<!-- 添加一个虚拟串口,映射到host路径/tmp/vm_vtzb_sock0 -->
<qemu:arg value='-chardev'/>
<qemu:arg value='socket,path=/tmp/vm_vtzb_sock1,server=on,wait=off,id=vm01_vtzb_sock'/>
<qemu:arg value='-device'/>
<qemu:arg value='virtio-serial'/>
<qemu:arg value='-device'/>
<qemu:arg value='virtserialport,chardev=vm01_vtzb_sock,name=vtzf_serialport0'/>
<!--
<qemu:arg value='-monitor'/>
<qemu:arg value='telnet:127.0.0.1:5556,server=on,wait=off'/>
-->
</qemu:commandline>
<seclabel type='dynamic' model='dac' relabel='yes'/>
</domain>生效虚拟机配置文件
virsh define vm-libvirt.xml (名称与上面新建的配置文件保持一致)步骤5:启用虚拟机
virsh start nvm-test-1 (名称与配置文件保持一致)步骤6:登录虚拟机
openEuler镜像默认账号为root,默认密码为openEuler12#$。
virsh console nvm-test-1步骤7:在虚拟机上安装KAE和Kong
请参见4.2.1章节在虚拟机上安装KAE和Kong。
步骤8:在虚拟机上查询设备
ls /sys/class/uacce/显示如下,说明挂载的VF已经在虚拟机上读取成功。
hisi_zip-05 性能对比测试
5.1 benchmark测试
5.1.1 测试准备
步骤1:安装benchmark工具
wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。
# 安装wrk
yum -y install wrk
# 检查安装
wrk -v步骤2:随机生成不同大小的页面(以4k为例),用于压力测试
cd /path/to
head -c 4096 /dev/urandom > test4k.html步骤3:添加文件配置
vim /path/to/kong/custom.conf后添加如下配置
location /test4k.html {
root /path/to;
default_type text/html;
}步骤4:修改Kong的配置文件
vim /path/to/kong/kong.conf
# 添加配置
nginx_proxy_include = /path/to/kong/custom.conf步骤5:检查是否可以访问本地页面
# 启动kong
./bin/kong start -c ./kong.conf
# 发送请求
curl -I -H "Accept-Encoding: gzip" http://localhost:8000/test4k.html若响应头返回“Content-Encoding: gzip”,代表Gzip压缩功能已正常生效。
5.1.2 不使能KAE硬加速
步骤1:配置kong.conf
参考4.2.1-物理机部署步骤4和5,添加gzip使能、日志及应用绑核相关配置。
步骤2:启动Kong
cd /path/to/kong
./bin/kong start -c ./kong.conf步骤3:检查环境变量
执行env查看当前环境是否有KAEzip环境变量,如果有则执行unset LD_LIBRARY_PATH,再执行source /etc/profile使配置生效,如果没有则不做操作。
步骤4:性能测试
wrk -t10 -c650 -d60s -H "Accept-Encoding: gzip" http://localhost:8000/test4k.html5.1.3 使能KAE硬加速
步骤1:开启KAE硬加速
export LD_LIBRARY_PATH=/usr/local/kaezip/lib:$LD_LIBRARY_PATH步骤2:配置kong.conf
参考4.2.1-物理机部署步骤4和5,添加gzip使能、日志及应用绑核相关配置。
步骤3:启动Kong
cd /path/to/kong
./bin/kong start -c ./kong.conf步骤4:性能测试
wrk -t10 -c650 -d60s -H "Accept-Encoding: gzip" http://localhost:8000/test4k.html步骤5:检查KAEZlib库加速引擎是否生效
在执行wrk性能测试的同时,可以在新的终端上同时查看hisi_zip设备的硬件队列资源情况。
cat /sys/class/uacce/hisi_zip*/available_instances也可以在执行wrk性能命令过程中通过以下命令每0.1秒刷新一次,实时查看hisi_zip的硬件队列消耗情况。
watch -n 0.1 cat /sys/class/uacce/hisi_zip*/available_instances显示结果从256变为248,说明Gzip压缩消耗了ZIP加速器8个硬件单元队列,说明KAEZlib加速引擎已生效。
5.2 测试结果
下图为Kong使能Gzip压缩性能结果对比,可以看出使能KAE硬件加速压缩库后,Gzip压缩性能提升显著。



