服务器蓝绿部署配置:Nginx 双环境切换实操教程
蓝绿部署的核心思路是在服务器上同时运行两套完全独立的应用环境(蓝环境和绿环境),通过 Nginx 或其他负载层把线上流量切到其中一套。
发布新版本时,先把代码部署到空闲环境并验证通过,再一次性切换流量,出问题可立即切回旧环境。
本文用 Nginx 和软链接实现这套配置,适合刚接触持续部署的运维人员。
准备两套运行环境
假设应用是 Node.js 或 PHP 项目,需要准备:
- 两个独立目录:
/var/www/app-blue和/var/www/app-green,分别存放新旧版本代码。 - 一个对外目录:
/var/www/app-current,用软链接指向当前活跃目录。 - Nginx 已安装并运行,具备修改站点配置的权限。
- 进程管理工具(如 PM2、systemd)分别管理两个环境的进程,避免端口冲突。
蓝环境用 3001 端口,绿环境用 3002 端口,Nginx 只监听 80 并转发到活跃端口。
配置 Nginx 指向当前环境
编辑站点配置文件,例如 /etc/nginx/conf.d/app.conf:
upstream app_backend {
server 127.0.0.1:3001;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://app_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
保存后执行 nginx -t 检查语法,再 nginx -s reload 生效。
此时流量走蓝环境(3001)。
部署新版本到空闲环境
以绿环境为例,把新代码放到 /var/www/app-green,安装依赖并启动:
cd /var/www/app-green
npm install --production
pm2 start server.js --name app-green -- --port 3002
启动后用 curl http://127.0.0.1:3002/health 或浏览器访问端口确认服务正常。不要急着切流量,先验证接口、页面和关键功能。
切换流量与回滚
确认绿环境无误后,修改 Nginx upstream 指向 3002,然后 reload:
sed -i 's/127.0.0.1:3001/127.0.0.1:3002/' /etc/nginx/conf.d/app.conf
nginx -t && nginx -s reload
如果切换后发现异常,把端口改回 3001 并 reload,流量立刻回到蓝环境。回滚时间取决于 Nginx reload 速度,通常在秒级。
避坑要点
- 会话问题:如果应用把 session 存在本地内存,切换后用户可能掉线。建议把 session 存到 Redis 或数据库。
- 静态资源缓存:切换后浏览器可能仍加载旧文件,可在文件名加 hash 或调整缓存头。
- 端口冲突:两个环境必须用不同端口,否则启动失败。
- 进程未退出:旧环境进程不要立即删除,保留至少一次发布周期,方便快速回滚。
验证切换是否成功
切换后执行以下检查:
- 访问域名,确认页面内容是新版本。
- 查看 Nginx 日志
tail -f /var/log/nginx/access.log,确认请求打到新端口。 - 用
curl -I http://your-domain.com观察响应状态码和响应头。 - 在应用日志中确认没有大量报错。
全部通过后,蓝环境可以停止或保留作为下次的备用环境。
常见疑问
蓝绿部署和滚动发布有什么区别? 蓝绿是两套完整环境整体切换,回滚快但资源占用高;
滚动发布是逐步替换实例,资源省但回滚较慢。
必须用 Nginx 吗? 不是,HAProxy、Traefik 或云负载均衡也能实现,原理相同,都是切换后端指向。
小项目值得做蓝绿部署吗? 如果停机几分钟可以接受,直接用软链接切换目录也能达到类似效果,不必强上完整方案。
整体来看,服务器蓝绿部署配置的关键是把流量切换和服务启动解耦,先验证再切流,并保留快速回滚路径。
按本文步骤搭建后,你可以在不中断服务的前提下完成版本发布。