AI服务灰度发布实操:零基础用Nginx实现逐步切换版本
为什么AI服务需要灰度发布
AI服务(如模型推理、图像识别)一旦上线新版本,如果直接全量替换,可能因模型质量问题或配置错误导致大面积服务异常。
灰度发布让你先让一小部分用户使用新版本,观察无误后再逐步放量,这是降低上线风险的标准做法。
本文使用 Nginx 反向代理 作为流量网关,通过权重或 Cookie 策略控制新旧版本的分流比例。
整套方案无需额外付费组件,单台服务器也能跑通,适合零基础入门。
做好这些准备让灰度发布更顺利
- 一台 Linux 服务器(推荐 CentOS 7+ 或 Ubuntu 20.04),并已安装 Nginx。未安装可使用命令:
yum install nginx -y或apt install nginx。 - 两个版本的 AI 服务 以 HTTP 端口方式运行,例如旧版本监听 5001 端口,新版本监听 5002 端口。可以是 Python Flask、FastAPI 等框架启动的容器或进程。
- 一个简单的健康检查接口:确保每个服务都有
/health端点返回200,便于 Nginx 检测存活状态。 - 确保服务器防火墙已放行 Nginx 端口(默认80)和两个服务端口。
逐步调整流量到新版本:两种常用方法
方法一:基于权重的分批发布
修改 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 下新建 .conf 文件),
使用 upstream 块定义两个后端,
并设置 weight 参数控制流量比例。
upstream ai_servers {
server 127.0.0.1:5001 weight=90; # 旧版本占90%流量
server 127.0.0.1:5002 weight=10; # 新版本占10%流量
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://ai_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
保存后执行 nginx -t 测试配置是否正确,然后 systemctl reload nginx 使生效。
此时约10%的请求会进入新版本。
观察无问题后,逐步调高新版本的 weight(如30、50、100),直到完全切换。
方法二:基于 Cookie 的指定用户灰度
如果你只想让带特定 Cookie 的用户(如内部测试人员)访问新版本,可以使用 Nginx 的 map 指令结合 if 判断。
map $cookie_gray_group $backend {
default 127.0.0.1:5001; # 默认走旧版
"new" 127.0.0.1:5002; # 携带 Cookie: gray_group=new 的用户走新版
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://$backend;
}
}
你可以在用户登录或访问时由应用端设置 Cookie gray_group=new,只有这些用户的请求会命中新版本。
这种方式适合定向测试,验证通过后再转为全量。
灰度发布最容易踩的四个坑
- 没有统一健康检查:如果新版本服务崩溃,Nginx 仍会分发请求到故障端口,导致部分用户报错。务必在
upstream里加上max_fails=3 fail_timeout=30s参数。 - 会话状态不一致:AI 服务如果是无状态的,直接分流没问题;如果依赖本地存储或内存会话,需要确保用户请求始终路由到同一版本。这时优先使用 Cookie 灰度或者配置
sticky session插件。 - 权重调整后未 reload:修改 Nginx 配置后必须
reload而不是restart,否则可能导致连接中断。 - 日志监控缺失:新版本的问题可能只有少量用户遇到。建议在 Nginx 日志中记录转发到的 upstream 地址,方便事后排查。可以在
proxy_set_header X-Upstream $upstream_addr;并开启访问日志格式化。
用一小部分用户验证新AI服务效果
- 功能测试:以测试身份访问服务(如携带特殊 Cookie),确认新版本推理结果正确。
- 压力测试:使用 Apache Bench 发出少量请求,观察新版本服务延迟与旧版本对比:
ab -n 100 -c 10 http://your-domain.com/ - 错误日志检查:查看 Nginx 错误日志
/var/log/nginx/error.log和 AI 服务自身日志,确认无异常。 - 逐步放量:权重从 10% 起步,每观察 1-2 小时无报错,增加至 30%、50%、100%。整个过程可线上完成,无需停机。
如果你正在处理 AI 服务的版本升级,建议先按本文步骤在测试环境跑通流程,再迁移到生产。
遇到异常时优先回看避坑部分,尤其是日志和健康检查项。
成功完成一次灰度后,你可以继续学习蓝绿部署或金丝雀发布等进阶策略。