多域名百度推送的token、IndexNow的key、第三方翻译API的密钥、内容审核接口的appid,十几个站几十个API端点散落在不同控制台里。Nginx反向代理按路径转发、Caddy两行配置自动HTTPS、APISIX插件化限流鉴权、轻量级Node网关按子域名路由,四条路线把API入口收拢到一个端口上
一个站群跑起来之后,每增加一个站点,不只是多一套内容、一个域名、一个数据库——更多出来的是各种API端点。百度站长平台的推送token每个站一个,必应IndexNow的API key每个站一组,内容翻译接口的密钥、敏感词过滤的appid、统计分析的数据上报地址。如果站群上了20个站,就是20套百度推送配置、20组IndexNow参数、20个不同的第三方API接入点。
更麻烦的是这些API的调用地址、认证方式、请求格式各不相同。百度用token放在POST body里,IndexNow用key拼在URL上,翻译接口用Bearer Token放Header里。每次写定时任务都要翻不同文档、拼接不同请求格式,一个参数写错整个推送白跑。用一个网关层把这些散落的API端点收拢到一个统一入口,调用方只记一个地址,后端怎么变网关层搞定——这就是API网关在站群场景里的价值。
API网关在站群场景下的四条路线
| 1 | Nginx反向代理:已有Nginx直接加location规则,零成本,适合10-30站 |
| 2 | Caddy:两行配置反向代理+自动HTTPS,配置量比Nginx少90%,证书全自动 |
| 3 | APISIX:动态路由+插件化限流认证+Dashboard,50站以上规模化方案 |
| 4 | Node自定义网关:完全可编程,能做请求改写、参数拼接、多API聚合 |
一、站群的API到底散落在哪些地方

先理清一个典型站群会涉及哪些外部API,才能判断网关方案要覆盖多大的面。
| API类别 | 典型服务 | 端点数量 | 认证方式 |
|---|---|---|---|
| 搜索引擎推送 | 百度站长平台、必应IndexNow、Google Indexing API | N站×N组token | POST Body token / URL key / OAuth 2.0 |
| 内容处理 | 翻译API、AI生成、敏感词过滤、图片压缩 | 1~3个服务×N站 | Bearer Token / API Key Header |
| 数据统计 | 百度统计、Google Analytics、自建统计上报 | N站×N个tracking ID | URL参数 / Header |
| 域名/SEO工具 | Whois查询、关键词排名、收录量检测、外链监控 | 2~5个服务 | API Key Header |
| 通知告警 | 企业微信/钉钉/飞书机器人、邮件、短信 | 3~5个webhook | Webhook URL token |
一个20站的站群,光是百度推送就要管20组不同的site+token组合,加上IndexNow的20组key、3个翻译接口的密钥、统计上报的配置。不加网关的话,这些信息散布在几十个Python脚本、crontab任务和配置文件里,换一个token就得满世界找。
二、Nginx反向代理按路径转发,零成本起步
Nginx是大多数服务器上已经装着的Web服务,它本身就是一个足够好用的API网关,不需要额外安装任何东西。核心思路:用Nginx的location指令按URL路径匹配,把请求转发到不同的后端API地址。
适用场景
已有一台运行Nginx的服务器,需要把多个后端API聚合到一个域名下,追求零额外成本。适合10-50个站点规模。
假设你的网关域名是api.example.com,后端有三个服务:百度推送转发服务跑在8001端口、内容处理服务跑在8002端口、统计上报服务跑在8003端口。Nginx配置如下:
server {listen 80;server_name api.example.com;# 百度推送相关 → 8001location /baidu/ {proxy_pass http://127.0.0.1:8001/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 内容处理(翻译、审核等) → 8002location /content/ {proxy_pass http://127.0.0.1:8002/;proxy_set_header Host $host;}# 统计分析 → 8003location /stats/ {proxy_pass http://127.0.0.1:8003/;proxy_set_header Host $host;}}配置之后调用方只需记一个地址api.example.com。推送百度链接就POST到api.example.com/baidu/push,调翻译就GETapi.example.com/content/translate。Nginx自动按路径前缀分发请求。后端服务换端口、换服务器,改一行proxy_pass就行,所有调用方无感。
Nginx做网关的两个限制
· 路由规则写死在配置文件里,加一个后端服务就要改nginx.conf然后reload,没法动态添加路由
· 没有内置认证和限流,需要配合ngx_http_limit_req_module和auth_request,配置量会上升
三、Caddy,配置比Nginx少90%,HTTPS全自动
如果觉得Nginx的配置还是太啰嗦——特别是HTTPS证书那块,要手动申请Let's Encrypt、配置证书路径、写定时续期任务——Caddy最大的卖点就是自动HTTPS。你只需要在配置里写一个域名,Caddy自动向Let's Encrypt申请证书、自动续期、自动配置HTTP到HTTPS的重定向,整个过程一行额外配置都不需要。
Caddy对比Nginx的核心差异
· 证书管理:Caddy全自动,Nginx需要配合certbot手动配置
· 配置量:同样的反向代理+HTTPS,Caddy约5行,Nginx约25行
· 学习成本:Caddyfile语法比nginx.conf简单得多,30分钟上手
Caddyfile配置长这样:
api.example.com {handle_path /baidu/* {reverse_proxy localhost:8001}handle_path /content/* {reverse_proxy localhost:8002}handle_path /stats/* {reverse_proxy localhost:8003}}写一个域名,Caddy自动申请HTTPS证书。handle_path不仅按路径匹配,还会自动剥离匹配到的前缀再转发。请求/baidu/push到达网关后,转发到8001端口的实际路径是/push——Nginx里需要小心处理proxy_pass末尾斜杠的细节,Caddy直接帮你做了。
站群场景下Caddy还有一个实用功能:多域名自动HTTPS。如果你不仅需要API网关,还想让每个站点的域名都自动上HTTPS,一个Caddyfile可以管所有域名:
# API网关api.example.com {handle_path /baidu/* { reverse_proxy localhost:8001 }handle_path /content/* { reverse_proxy localhost:8002 }}# 站群各站点自动HTTPS,三行一个站site1.example.com { reverse_proxy localhost:8081 }site2.example.com { reverse_proxy localhost:8082 }site3.example.com { reverse_proxy localhost:8083 }一份配置文件,同时搞定API网关的路径转发和所有站点的HTTPS证书管理。20个域名就是20个三行配置块,证书全部自动申请和续期,不用再记着哪个域名证书快过期了。
四、APISIX,站群上规模后的正式方案
Nginx和Caddy解决的是"把多个API入口收拢到一个端口"的问题,但站群上了规模——100个站点、50个不同的API后端、需要按不同站点做不同的限流策略——配置文件管理就变成新问题了。
| 功能 | Nginx/Caddy | APISIX |
|---|---|---|
| 路由管理 | 改配置文件+reload | Admin API动态添加,不中断服务 |
| 限流 | 配置文件limit_req模块 | 插件化,按路由/消费者灵活配置 |
| 认证 | 需配合auth_request | 内置key-auth、jwt-auth等插件 |
| 管理界面 | 无 | APISIX Dashboard(Web界面) |
| 监控 | 需自行对接Prometheus | 内置prometheus插件,一键开启 |
APISIX的核心优势在动态配置。用Nginx加一个后端服务要改配置文件然后reload,如果reload失败可能影响正在处理的请求。APISIX通过Admin API添加路由,调用一个HTTP请求就生效,正在跑的请求不受影响。站群场景下你可能频繁调整后端服务地址、给不同站点加不同的限流规则、临时下线出问题的API端点——动态配置让你不需要重启任何东西。
另一个站群场景的实用功能是按消费者限流。百度推送API对不同站点的调用频率要求不一样——权重高的站可以每秒推10条,新站控制在每秒1条。APISIX可以为每个站点的百度推送路由单独设置限流参数,精确到每秒请求数,比Nginx全局limit_req灵活得多。
APISIX适合什么样的规模
· 站点数超过50个,API后端超过20个,Nginx配置管理开始吃力

· 需要按不同站点、不同API做差异化的限流和认证策略
· 需要可视化Dashboard查看路由、流量和错误情况
五、Node自定义网关,需要改请求内容时的终极方案
如果网关不只是转发,还涉及请求格式转换、参数拼接、多API聚合——比如一个请求过来,网关先去数据库查该站点的百度token,拼到请求体里再转发到百度API——那Nginx/Caddy/APISIX的纯转发模式就不够用了。自己写一个Node.js网关反而是最快的方式。
Nginx/Caddy/APISIX
纯转发,不改请求内容
配置即路由,零代码
性能最高,资源占用最小
Node自定义网关
可做请求/响应的格式转换
可查数据库动态拼接参数
可做多API聚合调用再返回
Node网关的典型用法:用一个JSON配置文件存储所有站点的API路由规则和认证信息,网关启动时加载到内存,运行时按规则匹配请求、注入认证信息、转发到后端。调用方只需要发POST /baidu/push/site1,网关自动从数据库查出site1的百度token拼进请求体——调用方完全不需要知道token是什么。
Node网关要注意的问题
· 性能不如Nginx,单进程Node处理高并发时需要cluster模式或pm2多实例
· 安全性要自己把关,Nginx/Caddy有多年沉淀的安全最佳实践,自己写的网关要小心SSRF等风险
· 路由配置热加载需要自己实现,不像APISIX那样内置Admin API
六、四条路线怎么选,看三个指标就够了
前面讲了四种方案,站群实际选型不需要都试一遍。看三个指标:站点数、API复杂度、团队技术栈。
| 你的情况 | 推荐方案 | 理由 |
|---|---|---|
| 10-30站,已有Nginx | Nginx反向代理 | 零额外成本,几行配置就能用 |
| 10-30站,不想折腾证书 | Caddy | 配置最少,HTTPS全自动,还能管所有站点证书 |
| 50站以上,需要动态路由+限流+认证 | APISIX | 动态配置、插件化、有Dashboard |
| 需要请求改写、参数拼接、多API聚合 | Node自定义网关 | 完全可编程,想怎么处理就怎么处理 |
大多数中小规模站群(20-50个站)用Caddy就够了。配置简单、HTTPS自动管理、热加载配置(caddy reload),性能在站群的API调用量面前绰绰有余。只有当你发现配置文件开始失控——每次加一个API路由都要翻几十行配置找位置、不同站点的限流规则互相打架——才需要考虑升级到APISIX。
七、不管用哪种方案,三条配置原则
用了网关之后有几个坑容易踩。
原则一:敏感信息不要硬编码在网关配置里
百度token、API密钥这些不要直接写在nginx.conf或Caddyfile里。配置文件和代码一样会被提交到Git,一旦泄露所有站的API密钥全部暴露。用环境变量或独立的密钥管理服务存储,网关启动时读取。
原则二:网关挂了要有降级方案
网关是单点——所有API请求都经过它,它挂了全部服务都不可用。要么用keepalived做双机热备,要么每个后端服务保留直连地址作为降级方案。别把网关搞成整个站群的单点故障。
原则三:超时时间要按最长API设置
网关转发到不同后端API,响应时间差异很大。百度推送可能100ms就返回了,翻译API可能要2秒。网关的proxy_read_timeout(Nginx)或reverse_proxy的timeout(Caddy)要按最慢的那个API来设置,否则长请求会被网关超时切断。
另外,用UC建站系统管理多站点内容时,站群本身的API调用就已经被统一管理了——内容发布后自动触发百度推送和IndexNow推送,不需要每个站单独配置。但如果你的站群是自己搭建的,前面说的四条路线选一条就能把散落的API入口收拢到一个端口上。网关搭好之后你会发现,以前花在"找配置、改配置、验证配置"上的时间,大部分都可以省掉了。
最后说一句:API网关在站群场景下不是什么高深技术,本质上就是一个反向代理。只是当API端点多到一定程度之后,没有这个"代理层",管理成本会指数级上升。从Nginx的location转发开始用,够用了就不要升级,不够用了再往Caddy/APISIX/自定义方案走。工具是为效率服务的,不是为了炫技。
