VPS 自建 API 网关:用 KrakenD / APISIX / Traefik 统一鉴权与限流(2026)
2026-08-15 · DevCraft Studio
在单台 VPS 上用 KrakenD、APISIX、Traefik 自建 API 网关,聚合多个后端、统一 JWT 鉴权与限流。对比三款开源网关的架构与配置,给出可抄的实战示例与单台 VPS 部署建议,适合想省心暴露多个服务的开发者。
很多开发者在一台 VPS 上同时跑了好几个服务:一个 Go 后端、一个 Python 接口、一个静态前端,也许还有一个 Redis 代理。每个服务各开一个端口,客户端要记一堆地址,鉴权和限流还得在每个服务里各写一遍。更糟的是,某天 VPS 公网 IP 变了,所有调用方都得改。本文讲一种老站长验证过的做法:在单台 VPS 前面放一个自建 API 网关,把多个后端聚合成统一入口,集中做 JWT 鉴权与限流。我们对比 KrakenD、APISIX、Traefik 三款开源方案,并给出可直接抄的配置。
延伸阅读
更多相关攻略推荐:【TCP优化 02】为什么晚高峰 Ping 值正常,SSH 却卡到掉、从 Git Push 到秒级上线:CI/CD 流水线与"无中断"发布、VPS 自建 CMS 横评:Ghost / Astro / Stra、【VPS 硬件选型指南 (CPU 篇) 03】VPS 性价比怎么算?、2026 黑五 VPS 优惠大全:全年最低价怎么抢。
一、什么是 API 网关,为什么单台 VPS 也需要
API 网关本质上是「所有流量的唯一大门」。客户端不再直连你的每个微服务,而是只跟网关说话,网关再负责把请求转发到正确的后端,并在这一层统一处理安全、限流、日志和聚合。不少人觉得网关是微服务大厂的专利,其实单台 VPS 上更需要它,原因很现实:
- 统一入口:前端、App、第三方合作伙伴只记一个域名一个端口,后端怎么拆、怎么迁,调用方无感。
- 鉴权集中:JWT 校验只写一次,所有后端都不用再关心 token,少写一堆重复代码,也少一堆安全漏洞。
- 限流集中:防止某个接口被刷爆拖垮整台机器,在网关层按 IP 或按 key 做全局限速。
- 聚合后端(BFF):一个页面要调用户、订单、库存三个服务?网关一次聚合返回,客户端少跑三次往返。
- 收口安全:TLS 终止、CORS、安全响应头、防爬,全在网关一处配,不用每个服务各管各的。
一句话:网关把「横切关注点」从每个业务服务里抽出来,单台 VPS 的资源本就紧张,更该把这类活儿交给一个专门的轻量组件。
二、三款开源网关一句话定位
- KrakenD:Go 写的无状态网关,配置即声明(JSON/YAML),主打「请求聚合 + 高性能」,不依赖数据库,单文件配置就能跑,最适合「一台机器、几个后端、要聚合」的场景。
- APISIX:基于 OpenResty(Nginx + LuaJIT)的动态网关,插件生态最丰富,限流、JWT、可观测性都是现成插件,配置存 etcd(或用 standalone 的 yaml 模式),适合想要「插件随便插、规则热更新」的团队。
- Traefik:云原生反向代理 / Ingress,最大卖点是「自动服务发现」——给容器打个 label 它就自动路由。它本身也能当网关用,用 middleware 做限流和基础认证,适合 Docker / 容器化部署、不想手写一堆路由规则的人。
三、怎么选:核心维度对比表
| 维度 | KrakenD | APISIX | Traefik |
|---|---|---|---|
| 开发语言 / 架构 | Go,无状态、文件配置 | OpenResty(Nginx+Lua),etcd | Go,文件 / 服务发现 |
| 配置方式 | 单一 JSON / YAML 声明 | Admin API + etcd,或 standalone yaml | 静态文件 + 动态 label / 注解 |
| 请求聚合 | 原生强项,内置 BFF | 靠插件,能力一般 | 弱,主要做路由 |
| JWT 鉴权 | 内置 auth/validator | jwt-auth 插件 | forwardauth 或 basicauth middleware |
| 限流 | 内置 ratelimit(GCRA) | limit-req / limit-count 插件 | ratelimit middleware |
| 热更新 | 改文件需 reload | 支持,无需重启 | 支持,自动发现 |
| 单台 VPS 友好度 | 极高,内存占用小 | 中,需 etcd(standalone 可省) | 高,和 Docker 配合最佳 |
| 典型场景 | 聚合多个后端、纯 API | 插件化、规则多的中大型 | 容器化、K8s / Docker 环境 |
老站长的私货建议:如果你只是想在一台 VPS 上把三五个后端收口、加 JWT 和限流,KrakenD 最省事;如果你的服务全跑在 Docker 里、希望加个 label 就自动上线,Traefik 最顺手;如果你想要插件随便换、未来可能上集群,APISIX 上限最高。下面三个实战我都给可直接抄的配置。
四、实战:KrakenD 统一 JWT 鉴权 + 限流
KrakenD 的配置就是一个 JSON 文件(配置格式版本号写 3)。下面这段把 /api/* 的请求转发到后端,并强制校验 JWT,同时给所有接口上 10 次/秒的限流:
{
"version": 3,
"port": 8080,
"extra_config": {
"github.com/krakend/krakend-ratelimit/juju/proxy": {
"max_rate": 10,
"capacity": 20
}
},
"endpoints": [
{
"endpoint": "/api/user/{id}",
"method": "GET",
"output_encoding": "json",
"extra_config": {
"auth/validator": {
"alg": "RS256",
"jwk_url": "https://your-auth.example.com/.well-known/jwks.json",
"issuer": "https://your-auth.example.com",
"audience": ["api.example.com"]
}
},
"backend": [
{
"url_pattern": "/user/{id}",
"host": ["http://127.0.0.1:9001"],
"method": "GET"
}
]
}
]
}
要点:auth/validator 用 JWK 公钥集实时校验签名,不用把密钥写进网关;max_rate 是每秒令牌数,capacity 是令牌桶容量(允许的突发)。改完用 krakend check -c krakend.json 校验语法,再 krakend run -c krakend.json 启动。
五、实战:APISIX 插件化限流与 JWT
APISIX 默认用 etcd + Admin API,但单台 VPS 想简单点,可以开 standalone 模式,用一份 yaml 管全部配置。下面这条路由对 /api/* 同时启用 jwt-auth 和 limit-req:
routes:
- uri: /api/*
plugins:
jwt-auth: {}
limit-req:
rate: 10
burst: 20
key: remote_addr
rejected_code: 429
upstream:
type: roundrobin
nodes:
"127.0.0.1:9001": 1
"127.0.0.1:9002": 1
limit-req 用漏桶算法,rate 是稳态速率、burst 是允许的突发请求数;key 设为 remote_addr 就是按客户端 IP 限流,也能换成就 consumer 或自定义变量做更细的配额。jwt-auth 插件要求请求带合法的 JWT,公钥通过 consumer 的密钥配置下发。APISIX 还支持 limit-count(固定窗口计数)和基于 Redis 的集群限流,多机部署时很好用。
六、实战:Traefik 中间件做轻量网关
Traefik v3 里,限流和基础认证都是 middleware,配合 Docker label 自动生效。下面这段让 api.example.com 走网关,套上每秒 10 个请求的限流和一个 basic auth:
labels:
- "traefik.http.routers.api.rule=Host('api.example.com')"
- "traefik.http.routers.api.middlewares=ratelimit,auth"
- "traefik.http.middlewares.ratelimit.ratelimit.average=10"
- "traefik.http.middlewares.ratelimit.ratelimit.burst=20"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$05$$xxxhashedpassword"
- "traefik.http.services.api.loadbalancer.server.port=9001"
注意 basicauth 的密码是 htpasswd 生成的 bcrypt 哈希,写在 label 里要用双 $ 转义(Compose 文件里 $ 会被当作变量)。如果你的鉴权逻辑复杂(比如要验 JWT),别在 Traefik 硬扛,配一个 forwardauth middleware 把校验转给一个小的认证服务更干净。
七、把多个后端聚合成一个接口(BFF 模式)
这是 KrakenD 最香的活儿。假设首页要同时拉「用户资料 + 订单列表 + 库存」,三个后端各自独立,KrakenD 可以一次并行请求、聚合成一个 JSON 返回,客户端只发一个请求:
{
"endpoint": "/api/dashboard/{uid}",
"method": "GET",
"output_encoding": "json",
"backend": [
{ "url_pattern": "/profile/{uid}", "host": ["http://127.0.0.1:9001"], "method": "GET" },
{ "url_pattern": "/orders/{uid}", "host": ["http://127.0.0.1:9002"], "method": "GET" },
{ "url_pattern": "/stock", "host": ["http://127.0.0.1:9003"], "method": "GET" }
]
}
网关默认并行打三个后端,拿到结果后合成一个对象返回。这能把移动端首页的「三次往返」压成「一次」,在跨地域、延迟敏感的场景里体验提升非常明显。APISIX 也能用 serverless 或 response-rewrite 插件近似实现,但 KrakenD 把聚合当一等公民,写法最直观。
八、生产加固:TLS、CORS、防刷与监控
- TLS 终止:三款都支持 HTTPS。KrakenD / APISIX 在配置里挂证书;Traefik 配 tls 证书或接 Let's Encrypt 自动签发。强烈建议网关层统一终止 TLS,后端走内网明文即可。
- CORS:KrakenD 用 security/cors extra_config 白名单来源;Traefik 有 headers middleware 加 Access-Control-*;APISIX 有 cors 插件。别图省事设成 *,尤其带鉴权时。
- 防刷 / WAF:限流是第一步,再配合 fail2ban 或 Cloudflare 挡掉明显恶意流量;KrakenD 默认零信任,不转发 cookie / header / query 除非你显式白名单,这点很加分。
- 可观测性:KrakenD 和 APISIX 都原生吐 Prometheus 指标,Traefik 也有 /metrics;接个 Grafana,盯请求延迟、错误率、限流命中数,比出了问题再翻日志强。
- 安全响应头:X-Content-Type-Options、X-Frame-Options、Referrer-Policy 这些,网关一层统一加,别让每个后端各加各的。
九、单台 VPS 的资源与部署建议
- 配置:网关本身很轻,KrakenD 跑起来几十 MB 内存;APISIX 因带 OpenResty + etcd,建议留 512MB–1GB;Traefik 也很轻。一台 1 vCPU / 1GB 的小鸡就能扛住不小的流量。
- 网络:网关是入口,带宽和延迟就是用户体验。面向国内用户可选 Hetzner Falkenstein 或 Vultr 东京 / 新加坡等近点机房;想更稳可上 CN2 GIA 线路商家。
- 进程管理:用 systemd 或 Docker 跑,配 restart=always,挂了自动拉起;配置放 Git 仓库走 GitOps,改路由有历史可追溯。
- 不要和后端抢端口:网关占 80/443,业务后端统一跑高位端口(9001、9002…)只监听内网,公网只暴露网关。
- 备份配置:网关配置就是你的「路由大脑」,务必进版本库;证书用 acme 自动续,别手存。
#VPS自建 #API网关 #KrakenD #APISIX #Traefik #JWT鉴权 #限流