蓝绿部署是一种减少停机时间和降低发布风险的技术,通过维护两个相同的生产环境(蓝环境和绿环境)来实现无缝切换。以下是使用Nginx实现蓝绿部署的详细方案:
准备两个相同的环境:
Nginx作为流量分发器,根据配置将请求路由到不同环境
http {
# 定义两个upstream组
upstream blue {
server blue-server:8080;
}
upstream green {
server green-server:8080;
}
server {
listen 80;
# 默认所有流量到蓝环境
location / {
proxy_pass http://blue;
}
# 特殊头或cookie访问绿环境
location @green {
proxy_pass http://green;
}
# 根据cookie分流
if ($http_cookie ~* "env=green") {
rewrite ^(.*)$ @green last;
}
}
}
http {
# 随机分流5%流量到绿环境
split_clients "${remote_addr}${http_user_agent}" $variant {
5% green;
95% blue;
}
upstream blue {
server blue-server:8080;
}
upstream green {
server green-server:8080;
}
server {
listen 80;
location / {
proxy_pass http://$variant;
}
}
}
http {
map $http_x_env $group {
default blue;
"green" green;
}
upstream blue {
server blue-server:8080;
}
upstream green {
server green-server:8080;
}
server {
listen 80;
location / {
proxy_pass http://$group;
}
}
}
准备阶段:
小流量验证:
全量切换:
回滚策略:
会话保持:
upstream blue {
server blue-server:8080;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
健康检查:
upstream green {
server green-server:8080 max_fails=3 fail_timeout=30s;
}
灰度发布扩展:
#!/bin/bash
# 切换全部流量到绿环境
switch_to_green() {
cp nginx.conf.green /etc/nginx/nginx.conf
nginx -s reload
echo "已切换全部流量到绿环境"
}
# 切换回蓝环境(回滚)
switch_to_blue() {
cp nginx.conf.blue /etc/nginx/nginx.conf
nginx -s reload
echo "已回滚到蓝环境"
}
# 按比例分流(例如20%到绿环境)
split_traffic() {
split_ratio=$1
sed "s/5% green/${split_ratio}% green/" nginx.conf.template > nginx.conf.split
cp nginx.conf.split /etc/nginx/nginx.conf
nginx -s reload
echo "已设置 ${split_ratio}% 流量到绿环境"
}
通过以上方案,您可以实现灵活、可靠的蓝绿部署策略,确保服务的平稳升级和快速回滚能力。