1. 从 Nginx 到 APISIX、Envoy我踩过的网关选型坑API 网关架构演进这件事说白了就是「流量入口怎么管」的问题。早期单体应用一个 Nginx 反向代理就能扛住所有请求配置写在nginx.conf里改完nginx -s reload就完事。但业务一拆微服务问题就来了服务实例动态上下线、鉴权逻辑散落在各个服务里、限流规则改一次要动好几个仓库。这时候你需要的就不只是「转发」而是一个能统一处理路由、鉴权、限流、可观测性的 API 网关。这篇文章面向正在做网关选型或架构升级的后端/运维同学我会把 Nginx、APISIX、Envoy 三者的配置骨架摊开对比给出可直接复制的配置片段和验证命令最后说明怎么用 TaoToken 统一 Key 通道接入 AI 工具辅助调试网关配置。选型没有银弹但看完这篇你至少能画出一张属于自己的对照清单。先说结论方向如果你要的是「一套架构从单体打到云原生」APISIX 的迁移成本最低如果你已经在 Kubernetes Istio 生态里Envoy 是绕不开的数据面。Nginx 不是不能用而是它的能力边界在微服务阶段会越来越明显。2. TaoToken 前置统一 Key 与 API 通道在动手配网关之前先解决一个实际问题调试阶段经常需要调用各种 AI 接口来生成配置、解释报错、对比参数。如果每个工具都单独申请 Key、单独配环境变量管理成本很高。TaoToken 的思路是提供一个统一的 API 通道你只需要维护一套 Key就能在多个 AI 工具之间切换。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点统一走 https://taotoken.net/api 。注意 API 地址不加 UTM 参数直接请求即可。具体操作上你需要在控制台创建一个 API Key然后把它配置到你的调试工具里。比如用 curl 测试连通性curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 解释 APISIX 的 limit-req 插件参数含义}] }返回 200 且 body 里有choices字段说明通道正常。这一步的意义在于后面调试网关配置时遇到不认识的插件参数或报错可以直接把错误信息丢给模型让它解释不用来回翻文档。如果你主要做长期编码或 Agent 开发建议走 Coding Plan 通道额度和稳定性更适合高频调用。只是临时验证模型效果的话用模型对话入口就够了。3. 可复制配置Nginx、APISIX、Envoy 三套骨架3.1 Nginx 反向代理骨架Nginx 的配置最直观适合单体或简单微服务场景。核心是upstream定义后端池location做路由匹配upstream backend_api { server 10.0.1.10:8080 weight3; server 10.0.1.11:8080 weight1; keepalive 32; } server { listen 80; server_name api.example.com; location /v1/order/ { proxy_pass http://backend_api; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 5s; proxy_read_timeout 30s; } location /health { return 200 ok; add_header Content-Type text/plain; } }验证方式nginx -t检查语法nginx -s reload热加载然后curl -I http://api.example.com/health看是否返回 200。Nginx 的短板在于动态服务发现——后端 IP 变了你得改配置重载没有内置的注册中心对接能力。3.2 APISIX 路由与限流骨架APISIX 基于 OpenResty配置方式有两种Dashboard 可视化操作或者直接调 Admin API。生产环境建议用声明式配置YAML配合 Ingress Controller。先看一个路由 限流的组合routes: - uri: /v1/order/* name: order-route upstream: type: roundrobin nodes: 10.0.1.10:8080: 1 10.0.1.11:8080: 1 plugins: limit-req: rate: 100 burst: 50 rejected_code: 429 key: remote_addr jwt-auth: {}limit-req的rate是每秒允许的请求数burst是突发缓冲。key: remote_addr表示按客户端 IP 限流你也可以换成http_x_api_key按 Key 限流。jwt-auth插件启用后需要在 Consumer 上绑定 JWT 凭证才能通过鉴权。用 Admin API 创建路由的等价命令curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \ -H X-API-KEY: $APISIX_ADMIN_KEY \ -H Content-Type: application/json \ -d { uri: /v1/order/*, upstream: { type: roundrobin, nodes: {10.0.1.10:8080: 1, 10.0.1.11:8080: 1} }, plugins: { limit-req: {rate: 100, burst: 50, rejected_code: 429, key: remote_addr} } }验证限流是否生效用ab或wrk压一下观察是否出现 429。wrk -t2 -c50 -d10s http://127.0.0.1:9080/v1/order/list如果 QPS 稳定在 100 附近且部分请求返回 429说明插件生效。3.3 Envoy 路由与限流骨架Envoy 的配置是 YAML 描述式结构比 APISIX 复杂但表达能力强。一个最小的 HTTP 路由配置static_resources: listeners: - name: main address: socket_address: { address: 0.0.0.0, port_value: 10000 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: type: type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: backend domains: [*] routes: - match: { prefix: /v1/order } route: { cluster: order_cluster } http_filters: - name: envoy.filters.http.router typed_config: type: type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: order_cluster connect_timeout: 5s type: STRICT_DNS lb_policy: ROUND_ROBIN load_assignment: cluster_name: order_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: { address: 10.0.1.10, port_value: 8080 }Envoy 的限流需要配合envoy.filters.http.local_ratelimit或外部 RLS 服务配置量明显大于 APISIX。验证方式envoy --mode validate -c envoy.yaml检查配置合法性启动后curl -v http://127.0.0.1:10000/v1/order/list看路由是否命中。4. 验证请求与成功结果对照配置写完不算完得验证。我整理了一张验证动作对照表你可以按这个清单逐项过验证项NginxAPISIXEnvoy配置语法检查nginx -tapisix checkenvoy --mode validate热加载nginx -s reloadAdmin API 自动生效POST /hot_restart_version路由命中curl -I看状态码curl Dashboard 看命中curl -v看x-envoy-*头限流触发需第三方模块wrk压测看 429RLS 日志或x-envoy-ratelimited鉴权验证auth_basic测试JWT 过期/无效测试jwt_authnfilter 日志APISIX 验证路由是否命中的一个小技巧在 Dashboard 的「路由」页面能看到每条路由的请求计数或者直接看 access log。Envoy 则可以在响应头里加x-envoy-upstream-service-time来确认请求确实到了后端。成功结果长这样APISIX 返回{code:0,data:[...]}且响应头带X-RateLimit-Limit: 100Envoy 返回正常业务数据且server: envoy头存在。如果返回 503大概率是 upstream 节点不可达返回 401检查鉴权插件配置。5. 本篇常见错排查APISIX Admin API 返回 401检查X-API-KEY是否和config.yaml里的admin_key一致。默认 key 是edd1c9f034335f136f87ad84b625c8f1生产环境必须改掉。Envoy 启动报did not find expected cluster路由里引用的 cluster 名和clusters段里的name不一致。Envoy 对名称匹配是大小写敏感的order_cluster和Order_Cluster会被当成两个东西。Nginx 转发后后端拿不到真实 IP只配了proxy_set_header X-Real-IP不够后端框架可能读的是X-Forwarded-For。两个都加上并且确认后端信任这些头。APISIX 限流不生效limit-req插件的key如果设成remote_addr但请求经过了一层 Nginx 代理拿到的就是代理 IP所有请求会被当成同一个来源。改成http_x_forwarded_for并确保上游正确传递。Envoy 配置改了不生效Envoy 不像 Nginx 支持reload静态配置需要重启进程。动态配置走 xDS 才能热更新这也是它适合大规模场景的原因之一。遇到不认识的报错可以把错误信息贴给模型让它解释。通过 TaoToken 的模型对话入口调用不用额外配 Keycurl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: APISIX 报错 upstream response is buffered to a temporary file怎么排查}] }6. 选型对照与接入路径把三者的核心差异拉平来看Nginx 胜在简单和生态成熟适合流量不大、后端相对固定的场景APISIX 胜在插件机制和国产化支持一套架构能从单体打到 Service MeshEnvoy 胜在云原生生态和数据面能力但学习曲线陡单独用性价比不高通常配合 Istio 或 Contour 使用。如果你正在做长期编码或 Agent 开发需要频繁调用模型辅助写配置、查文档建议走 Coding Plan 通道稳定性和额度更合适。只是临时验证模型输出效果用模型对话就够了。API Key 在控制台的 API Keys 页面创建接入文档在 doc 页面有完整的端点说明和示例。最后给一个实操建议选型时别只看性能数字先问自己三个问题——后端服务是否动态扩缩容、鉴权限流是否需要统一管控、团队是否已经在 Kubernetes 生态里。三个都是「是」直接上 APISIX 或 Envoy有一个「否」Nginx 可能就够了。