宝塔面板实现Nginx蓝绿部署的步骤如下:
宝塔面板Nginx蓝绿部署实战指南,零停机发布,安全高效
创建两个网站
- 登录宝塔面板。
- 在左侧菜单中,点击【网站】。
- 点击右上角的【+】号,创建两个新的网站。
- 域名:第一个网站使用
blue.example.com,选择你想要部署的网站内容或自定义一个域名(如example.com)作为第二个站点。
- 域名:第一个网站使用
配置虚拟主机
对于 Blue 网站:
- 进入第一个网站的配置页面。
- 找到
虚拟主机配置或vhost设置。 - 根据你的服务器配置和防火墙规则,输入相应的域名、端口、根目录等信息。
对于 Green 网站:
- 进入第二个网站的配置页面。
- 重复上述虚拟主机配置步骤。
配置 Nginx 重定向
为了实现蓝绿部署,需要确保旧站点(Blue 站点)和新站点(Green 站点)之间能够顺利切换,用户请求会根据负载均衡器或 DNS 设置自动路由到新或旧的站点。
配置负载均衡器
- 使用云服务提供商或本地硬件负载均衡器(如 F5、A10)。
- 在负载均衡器上配置两个虚拟服务器(VIP),分别指向 Blue 站点和 Green 站点。
- 设置监听规则,使得新旧站点的流量能够被正确路由。
DNS 配置
- 在 DNS 提供商的管理界面中,设置 A 记录和 CNAME 记录。
- 将旧站点域名(blue.example.com)指向当前的 VIP。
- 将新站点域名(example.com 或 green.example.com)也指向当前的 VIP,如果新站点是首次部署,CNAME 指向 VIP;当新站点准备上线时,更新为对应的 IP 或 VIP。
测试部署
- 清除 DNS 缓存,确保 DNS 设置生效。
- 执行负载均衡器上的流量切换操作,通常是重启 Nginx 或整个服务。
- 在浏览器中尝试访问旧站点(
blue.example.com),检查是否能正常访问。 - 更新域名指向,然后刷新浏览器访问新站点(
example.com),确认站点已成功切换。
优雅下线
在旧站点不再运行且确认用户请求已转移到新站点后,进行以下操作:
- 停止旧的 Nginx 实例。
- 删除或重命名旧的网站目录,确保没有未释放的资源。
- 在宝塔面板中删除旧站点的配置记录。
- 确保防火墙允许新站点的流量通过。
通过以上步骤,你可以实现 Nginx 的蓝绿部署,提高网站的可用性和扩展性,在蓝绿部署过程中,保持服务的高可用和无缝过渡是非常重要的,确保用户在切换过程中没有任何中断或不便。
在Web运维中,每次代码更新都像是一场赌博——新版本上线,用户可能出现报错,回滚过程又可能延长故障时间,传统的部署方式往往需要停机维护,而蓝绿部署(Blue-Green Deployment)提供了一种优雅的解决方案:两套环境并行,通过反向代理平滑切换流量,实现零停机发布与秒级回滚。
本文将基于宝塔面板 + Nginx,手把手教你搭建一套完整的蓝绿部署方案,全程无代码侵入,适合中小团队和个体开发者。
蓝绿部署原理回顾
蓝绿部署的核心思想是保留两个完全相同的生产环境:
- 蓝色环境(当前稳定版本)
- 绿色环境(新版本预备)
部署流程:
- 将新版本部署到绿色环境,进行内部验证
- 通过Nginx修改权重,将流量逐步或一次性切到绿色环境
- 验证无误后,绿色成为新生产环境;出现问题时,再切回蓝色
关键优势:
- 零停机:切换过程用户无感知
- 秒级回滚:只需调整Nginx配置
- 真实验证:新版本在正式流量下测试
环境准备
1 硬件与依赖
- 服务器一台(演示使用 CentOS 7,宝塔面板 8.x)
- 域名已解析至服务器IP
- 宝塔面板已安装 Nginx(非Apache)
2 目录结构规划
在宝塔面板的 /www/wwwroot/ 下创建两个项目目录:
/www/wwwroot/
├── blue/ # 蓝色环境(当前生产)
│ └── index.html
├── green/ # 绿色环境(新版)
│ └── index.html
└── config/ # 存放Nginx片段文件(可选)
配置Nginx实现流量切换
1 创建两个独立的网站
在宝塔面板「网站」中新增两个站点:
- 站点A:域名
yourdomain.com,根目录/www/wwwroot/blue - 站点B:域名
green.yourdomain.com,根目录/www/wwwroot/green
注意:站点A为主站,站点B作为内部预发布环境(无需对外开放)
2 核心Nginx配置
我们需要修改站点A的Nginx配置,使其可以根据weight(权重)将请求转发到不同环境。
关闭站点A的PHP功能(如果不需要)
在站点设置中,将「PHP版本」设为「纯静态」。
修改站点A的配置文件
编辑 /www/server/panel/vhost/nginx/yourdomain.com.conf替换为以下配置:
upstream backend {
# 蓝色环境权重 100,绿色环境权重 0(初始仅指向蓝色)
server 127.0.0.1:8081 weight=100; # blue
server 127.0.0.1:8082 weight=0; # green
}
server {
listen 80;
server_name yourdomain.com;
# 禁用默认的静态文件处理,全部走反向代理
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 单独的端口运行蓝色环境
server {
listen 8081;
root /www/wwwroot/blue;
index index.html index.htm;
# 如果使用PHP,需要在这里配置fastcgi_pass
# 这里以静态HTML为例
}
# 单独的端口运行绿色环境
server {
listen 8082;
root /www/wwwroot/green;
index index.html index.htm;
}
解释:
upstream backend定义了后端服务器池,通过weight控制流量比例- 蓝色和绿色环境分别监听
8081和8082端口(确保端口未被占用) - 主域名
yourdomain.com的请求全部通过proxy_pass转发
3 测试配置
在宝塔面板「软件商店」→「Nginx设置」中重载配置,或执行:
nginx -t && nginx -s reload
访问 http://yourdomain.com 此时应显示蓝色环境的内容。
执行蓝绿部署
1 部署新版本到绿色环境
- 将新版本代码上传至
/www/wwwroot/green/ - 通过
http://green.yourdomain.com直接访问绿色环境,进行功能验证(建议使用hosts绑定本地测试,或仅允许内网访问)
2 流量切换
方案A:全量切换(推荐上线初期使用)
修改Nginx配置中的weight值:
upstream backend {
server 127.0.0.1:8081 weight=0; # 蓝色下线
server 127.0.0.1:8082 weight=100; # 绿色全量
}
重载Nginx后,所有请求立即指向绿色环境。
方案B:灰度切换(适合大流量谨慎更新)
逐步增加绿色权重,例如分三步:
# 第一步:10%流量到绿色 server 127.0.0.1:8081 weight=90; server 127.0.0.1:8082 weight=10; # 第二步:50% server 127.0.0.1:8081 weight=50; server 127.0.0.1:8082 weight=50; # 第三步:全量切换到绿色 server 127.0.0.1:8081 weight=0; server 127.0.0.1:8082 weight=100;
每次修改后执行 nginx -s reload,观察业务监控和错误日志。
3 回滚操作
一旦发现绿色环境存在问题,只需将权重还原:
server 127.0.0.1:8081 weight=100; server 127.0.0.1:8082 weight=0;
重载Nginx后,所有流量立即切回蓝色环境,回滚时间不超过1秒。
高级优化与注意事项
1 共享数据库与存储
蓝绿部署的两个环境通常共享同一个数据库和文件存储(如OSS、NAS),避免数据不一致,如果数据库需要迁移,建议分离数据库并进行双写迁移,但会增加复杂度。
2 动静分离
如果网站包含大量静态资源(JS/CSS/图片),建议将静态文件放在CDN或独立静态服务器中,Nginx的 upstream 只代理动态请求,提高效率。
3 自动化脚本
可编写Shell脚本或宝塔API自动完成以下步骤:
#!/bin/bash # 切换权重至绿色 sed -i 's/weight=100/weight=0/g' /www/server/panel/vhost/nginx/yourdomain.com.conf sed -i 's/server 127.0.0.1:8082 weight=0/server 127.0.0.1:8082 weight=100/g' /www/server/panel/vhost/nginx/yourdomain.com.conf nginx -s reload
4 会话保持问题
如果应用依赖Session(如登录状态),Nginx的轮询会导致Session丢失,解决方案:
- 使用IP_Hash策略:
ip_hash;保证同一用户始终访问同一后端 - 使用共享Session存储(Redis/Memcached)
- 前后端分离,使用Token认证(推荐)
修改 upstream 示例:
upstream backend {
ip_hash;
server 127.0.0.1:8081 weight=100;
server 127.0.0.1:8082 weight=0;
}
5 健康检查
生产环境建议增加健康检查,自动摘除故障节点,可使用Nginx的 health_check 模块(需编译安装)或第三方工具如 ngx_http_healthcheck_module。
常见问题FAQ
Q1:为什么不直接用宝塔的「负载均衡」插件?
A:宝塔的负载均衡插件需要额外购买授权,且配置灵活性不如直接修改Nginx配置文件,本文方案完全免费,且更可控。
Q2:端口8081和8082需要放行防火墙吗?
A:不需要,Nginx作为反向代理,流量只经过80/443端口,后端端口仅通过本机Nginx转发,不对外暴露。
Q3:绿色环境的上游服务器能放在另一台服务器吗?
A:可以,将 server 127.0.0.1:8082 替换为 server 192.168.1.x:port 即可,实现跨服务器蓝绿部署。
Q4:PHP项目如何配置?
A:在监听8081和8082的server块中,添加宝塔默认的fastcgi_pass配置,
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
宝塔面板搭配Nginx实现蓝绿部署,没有复杂的基础设施要求,一台服务器即可完成,核心要点就三个:
- 两套独立代码目录:blue和green
- Nginx反向代理 + 权重控制:通过
upstream的weight实现流量切换 - 单独端口监听:为每个环境分配内部端口
这套方案非常适合日PV在10万以下的站点,或单体应用,当你需要更强大的流量管理(区域、Cookie、Header等),可以在此基础上结合Lua脚本或OpenResty扩展,但大多数场景下,纯Nginx的权重配置已经足够。
你可以在宝塔面板中打开你的站点配置,复制上面的代码,体验一次零停机的自动化发布吧。



还没有评论,来说两句吧...