VPS 自建 API 网关:用 KrakenD / APISIX / Traefik 统一鉴权与限流(2026)

在单台 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 / 容器化部署、不想手写一堆路由规则的人。

三、怎么选:核心维度对比表

维度KrakenDAPISIXTraefik
开发语言 / 架构Go,无状态、文件配置OpenResty(Nginx+Lua),etcdGo,文件 / 服务发现
配置方式单一 JSON / YAML 声明Admin API + etcd,或 standalone yaml静态文件 + 动态 label / 注解
请求聚合原生强项,内置 BFF靠插件,能力一般弱,主要做路由
JWT 鉴权内置 auth/validatorjwt-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鉴权 #限流