2019年,我负责一个电商SaaS项目的中台重构。当时团队也就是7、8个后端,大家都觉得"微服务"这词儿听着洋气,于是我们大刀阔斧地引入了Kong作为API网关。
当时的想法很美好:我们要动态路由,我们要插件化,我们要像Netflix那样酷。
结果呢?为了维护Kong的Postgres数据库,我们专门搭了一套高可用;为了写一个简单的自定义鉴权插件,我们逼着Java开发去学Lua脚本。最要命的是,每次Kong的版本升级,插件兼容性都能让我们通宵排查。
我曾以为"功能强大"是选型的唯一标准,直到踩了这几个大坑才明白:对于中小团队,“可控"和"简单"才是架构的生命线。
今天咱们不聊那些虚头巴脑的理论,就聊聊在缺乏专职运维的情况下,如何用最"土"但最稳的Nginx方案,解决90%的网关需求。
一、 为什么我劝你先别碰Kong?
很多架构师(包括当年的我)容易陷入**“简历驱动开发”**的误区。觉得上了Kong、APISIX这种云原生网关,架构就显得高级。
但在真实的中小项目中,资源是极度紧缺的。
真实案例: 去年我接手过一个烂摊子项目。前任架构师留下了一套基于Kong的网关。系统总共才20个API接口,日PV不到5万。但是,这套网关经常因为数据库连接池满报错(Kong重度依赖DB做配置存储)。
团队里没人精通OpenResty,出了问题只能重启。最后我花了一个周末,把这套复杂的Kong集群,全部迁移回了2台Nginx服务器。
结果是惊人的:
- 运维成本直接归零(改配置文件谁都会);
- 响应延迟降低了15ms(少了一层DB查询);
- 服务器成本每月省了2000块。
选型建议: 如果你的团队满足以下任意两点,请坚决使用Nginx,不要碰Kong:
- 后端开发人员少于10人;
- 没有专职的SRE或运维人员;
- API接口数量少于50个,且变动不频繁;
- 不需要动态(秒级)调整路由规则。
二、 拒绝"面条式配置”,Nginx也能很优雅
很多人排斥Nginx,是因为觉得改nginx.conf很痛苦。几千行的配置文件,这就好比写代码把所有逻辑都塞进main函数里,当然痛苦。
我用了3年的一个习惯是:像写代码一样管理Nginx配置。
不要把所有东西都写在主文件里。通过合理的拆分,Nginx配置的可读性甚至比Kong的Dashboard还要直观。
实操方法:
我通常会在/etc/nginx/下建立这样的目录结构:
| |
代码示例:
在nginx.conf的http块中,我只会写两行关键引用:
| |
这样做的好处是,每次由于业务变动(比如加了一台订单服务的机器),我只需要去upstreams目录下修改对应的一个小文件。
避坑提示: 千万别手动去服务器上改文件!一定要用Git管理这些配置文件,配合CI/CD流水线,推送到服务器后自动reload。我见过太多次因为手抖少写一个分号,导致整个网关挂掉的"周五惨案"。
三、 穷人的"熔断"与"限流":够用就好
中小团队最怕什么?被爬虫把接口刷爆,或者某个微服务挂了拖死整个系统。
大家通常觉得需要引入Hystrix或者Sentinel这种重型框架。其实,Nginx自带的模块完全够用,而且性能损耗极低。
真实场景: 2022年双11前夕,我们的一个营销接口被黑产盯上了,QPS瞬间飙升了10倍。当时后端服务还没来得及做限流,CPU直接被打满。
紧急时刻,我们没有改一行Java代码,直接在Nginx层面加了三行配置,5分钟内解决了战斗。
硬核配置方案:
这里分享一个我压箱底的**“防刷+熔断”**组合配置。
| |
这套配置虽然没有Sentinel那么精细,但对于中小项目来说,它在网关层就拦截了恶意流量,保护了脆弱的后端数据库,绝对是性价比之王。
四、 总结与落地工具
架构设计里有一句名言:"没有最好的架构,只有最合适的架构。"
对于日活百万以下、团队规模不大的项目,Nginx不是妥协,而是最优解。它稳定、高效、免费,且拥有全世界最庞大的社区支持。
当你发现自己花费在维护网关上的时间,超过了开发业务逻辑的时间,那就说明你过度设计了。
最后,分享一个我常用的Nginx反向代理标准模板,你可以直接复制到你的vhosts文件中,只需改改域名和端口就能用:
| |
接下来的行动步骤:
- 本周五下午: 检查你的网关配置,是不是所有内容都塞在
nginx.conf里?如果是,按照第二节的方法进行拆分。 - 下周一早会: 确认你们的API接口是否有基本的限流保护?如果没有,加上第三节的
limit_req配置。 - 长期建议: 如果你的团队还在纠结要不要上Kong,先问自己一句:现在的Nginx真的撑不住了吗?如果答案是否定的,请把精力花在业务迭代上。