基于Nginx实现应用的灰度发布
应用场景
在您进行新系统升级时,会遇到停服部署或者无法灰度验证的情况,本实践采用基于Nginx负载均衡机制,在不影响业务正常运行的前提下,实现系统的平滑升级。
方案架构
系统升级时,若采用蓝绿部署方式,开发人员需进行如下操作:
- 先将A边服务器(原蓝环境)下线,同时访问流量将全部切分到B边服务器,此时对A边服务器进行升级操作。
- A边服务器升级完毕后,将A边服务器设为灰度测试环境,由测试人员对A边服务器进行灰度验证。
- 灰度验证完毕且功能正常后,A边业务服务器(绿环境)正式上线,并将所有流量切分到A边业务服务器,此时蓝绿部署完毕。
- 在服务运行过程中,如果A边服务器出现紧急情况,执行蓝绿倒换实现业务快速恢复。
若采用金丝雀灰度部署方式,再重复前面的操作,将B边服务器进行升级,并完成灰度测试及正式上线,此时就完成新系统的灰度发布。
前提条件
- 已有可用项目,如果没有,请先新建项目。
- 具有创建应用的权限,参考权限管理。
- 已有目标业务服务器:A_test与B_test,且业务服务器已有应用服务正在运行。
- 已有反向代理服务器:Gray_release。
- 已有灰度验证主机,该主机代表灰度测试人员。
要确保各服务器之间可以相互通信,例如:将所有服务器加到同一VPC下。
操作流程
本文介绍基于Nginx负载均衡机制,实现主机部署场景的蓝绿发布和灰度发布能力,关于Nginx更多信息请参考Nginx官网。
- (可选)为反向代理服务器安装并启动Nginx节点。
若您的反向代理服务器已安装并启动Nginx节点,则本步骤跳过。
- 新建基础资源。
- 进入软件开发生产线首页,单击目标项目名称,进入目标项目下。
- 单击菜单“设置 > 通用设置 > 基础资源管理”,默认进入“主机集群”页面。
或单击菜单“持续交付 > 部署”,进入项目下部署服务界面。单击“基础资源管理”默认进入“主机集群”页面。
- 单击“新建主机集群”,填写集群名称、操作系统、使用代理机接入、执行主机及描述等基本信息后,单击“保存”,完成主机集群的创建。
- 单击“添加或导入主机”,选择“通过IP手动添加”,填写主机名(例如:A_test、B_test、Gray_release)、IP、用户名、密码/密钥、ssh端口信息后,单击“确定”,重复操作完成三台目标主机的创建,并单击“连通性验证”进行连通性验证操作。
- 新建应用。
- 单击菜单“持续交付 > 部署”进入到部署服务页面。
- 单击“新建应用”,进入“基本信息”页面,可根据需要修改名称、描述、执行主机等基本信息。
- 完成应用基本信息的编辑后,单击“下一步”,进入选择部署模板页面。
- 选择“空白模板”,单击“确定”,进入“部署步骤”页签。
- 编辑应用。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“新建环境”,填写环境名,例如:反向代理服务器组,选择与服务器对应的操作系统,填写描述信息等。
- 单击“保存”,完成环境的创建。
- 单击“导入主机”,系统已自动筛选符合当前环境的所有集群,在弹框中选择目标主机集群,单击目标主机操作列的图标,即可将该主机导入环境中。
- 切换到“部署步骤”页签,添加并编辑以下步骤。
- 添加“安装Nginx”步骤,并修改为下表参数(以Linux系统为例)。
表1 参数填写说明 参数
填写说明
环境
选择“反向代理服务器组”。
nginx版本
选择目标版本。示例:nginx-1.14.2。
nginx安装路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
- 添加“启动/停止Nginx”步骤,并修改为下表参数(以Linux系统为例)。
表2 参数填写说明 参数
填写说明
环境
选择“反向代理服务器组”。
操作类型
选择“启动(nginx)”。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
- 添加“安装Nginx”步骤,并修改为下表参数(以Linux系统为例)。
- 单击“保存并部署”,开始部署应用。
- 切换到“环境管理”页签,添加并编辑环境。
- 部署应用。
部署完成后,应用状态栏的颜色变成绿色,并显示“部署成功”,则表示此次部署应用成功。
若应用状态栏的颜色变成红色,并显示“部署失败”,则表示此次部署应用失败,请单击“查看解决方案”链接查看解决方法。
- 新建基础资源。
- 新建并编辑应用一(A边节点灰度部署)。
- 新建应用。
- 单击菜单“持续交付 > 部署”进入到部署服务页面。
- 单击“新建应用”,进入“基本信息”页面,可根据需要修改名称、描述、执行主机等基本信息。
- 完成应用基本信息的编辑后,单击“下一步”,进入选择部署模板页面。
- 选择“通用部署”模板,单击“确定”。
- 编辑应用。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“新建环境”,填写环境名,例如:反向代理服务器组,选择与服务器对应的操作系统,填写描述信息等。
- 单击“保存”,完成环境的创建。
- 单击“导入主机”,系统已自动筛选符合当前环境的所有集群,在弹框中选择目标主机集群,单击目标主机操作列的图标,即可将该主机导入环境中。
- 重复上面操作步骤,完成新建“目标业务服务器组_A边节点”并添加“A_test”服务器的操作。
- 切换到“参数设置”页签,新增如下参数。
- 切换到“部署步骤”页签,添加并编辑以下步骤。
- 添加“启动/停止Nginx”步骤,并修改为下表参数(以Linux系统为例)。
表3 参数填写说明 参数
填写说明
步骤显示名称
示例:A边节点下线。
环境
选择目标环境。示例:反向代理服务器组。
操作类型
选择操作类型。示例:重载配置文件(reload)。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
是否在操作之前修改配置文件
勾选。
要修改的Nginx配置文件路径
目标主机中Nginx配置文件所在路径。示例:/usr/local/nginx/conf/nginx.conf。
配置文件备份路径
目标主机中原Nginx配置文件备份目标路径。示例:/usr/local/nginx/conf/nginx_bak.conf。
配置文件内容
新配置文件内容。示例:见附录中A边节点下线-代码示例。
- 编辑“下载软件包”步骤,并修改为下表参数(以Linux系统为例)。
表4 参数填写说明 参数
填写说明
步骤显示名称
示例:A边节点下载软件包。
选择源类型
选择源类型。示例:制品仓库。
环境
选择目标环境。示例:目标业务服务器组_A边节点。
选择软件包
选择制品仓库中需要部署的软件包。
下载到主机的部署目录
软件包下载到目标主机的路径。示例:/usr/local/。
- 编辑“执行部署脚本”步骤,并修改为下表参数(以Linux系统为例)。
表5 参数填写说明 参数
填写说明
步骤显示名称
示例:部署A边节点。
环境
选择目标环境。示例:目标业务服务器组_A边节点。
shell命令
填写待执行命令。示例:见附录中部署节点。
- 添加“启动/停止Nginx”步骤,并修改为下表参数(以Linux系统为例)。
表6 参数填写说明 参数
填写说明
步骤显示名称
示例:A边节点灰度上线。
环境
选择目标环境。示例:反向代理服务器组。
操作类型
选择操作类型。示例:重载配置文件(reload)。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
是否在操作之前修改配置文件
勾选。
要修改的Nginx配置文件路径
目标主机中Nginx配置文件所在路径。示例:/usr/local/nginx/conf/nginx.conf。
配置文件备份路径
目标主机中原Nginx配置文件备份目标路径。示例:/usr/local/nginx/conf/nginx_bak.conf。
配置文件内容
新配置文件内容。示例:见附录中A边节点灰度上线-代码示例。
- 编辑“健康测试”步骤,并修改为下表参数(以Linux系统为例)。
表7 参数填写说明 参数
填写说明
步骤显示名称
示例:A边健康测试。
环境
选择目标环境。示例:目标业务服务器组_A边节点。
重试次数
失败后重试次数,超过预设的重试次数,服务未启动会导致URL检测失败。示例:1。
间隔时间
每次重试测试的间隔时间(s)。示例:60。
测试路径
URL健康测试,支持添加多个。示例:http://127.0.0.1:3000(应用服务的IP及端口)。
- 添加“启动/停止Nginx”步骤,并修改为下表参数(以Linux系统为例)。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“保存”,应用创建完成。
- 新建应用。
- 新建并编辑应用二(A边节点上线)。
- 新建应用。
- 单击“新建应用”,进入“基本信息”页面,可根据需要修改名称、描述、执行主机等基本信息。
- 完成应用基本信息的编辑后,单击“下一步”,进入选择部署模板页面。
- 选择“空白模板”,单击“确定”。
- 编辑应用。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“新建环境”,填写环境名,例如:反向代理服务器组,选择与服务器对应的操作系统,填写描述信息等。
- 单击“保存”,完成环境的创建。
- 单击“导入主机”,系统已自动筛选符合当前环境的所有集群,在弹框中选择目标主机集群,单击目标主机操作列的图标,即可将该主机导入环境中。
- 切换到“部署步骤”页签,添加并编辑以下步骤。
添加“启动/停止Nginx”,并修改为下表参数(以Linux系统为例)。
表8 参数填写说明 参数
填写说明
步骤显示名称
示例:A边节点上线。
环境
选择目标环境。示例:反向代理服务器组。
操作类型
选择操作类型。示例:重载配置文件(reload)。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
是否在操作之前修改配置文件
勾选。
要修改的Nginx配置文件路径
目标主机中Nginx配置文件所在路径。示例:/usr/local/nginx/conf/nginx.conf。
配置文件备份路径
目标主机中原Nginx配置文件备份目标路径。示例:/usr/local/nginx/conf/nginx_bak.conf。
配置文件内容
新配置文件内容。示例:见附录中节点上线-代码示例。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“保存”,应用创建完成。
- 新建应用。
- 复制并编辑应用一,完成应用三的创建(B边节点灰度部署)。
- 复制应用。
- 编辑应用。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“新建环境”,填写环境名,例如:反向代理服务器组,选择与服务器对应的操作系统,填写描述信息等。
- 单击“保存”,完成环境的创建。
- 单击“导入主机”,系统已自动筛选符合当前环境的所有集群,在弹框中选择目标主机集群,单击目标主机操作列的图标,即可将该主机导入环境中。
- 重复上面操作步骤,完成新建“目标业务服务器组_B边节点”并添加“B_test”服务器的操作。
- 切换到“部署步骤”页签,添加并编辑以下步骤。
- 编辑“A边节点下线”步骤,并修改为下表参数(以Linux系统为例)。
表9 参数填写说明 参数
填写说明
步骤显示名称
示例:B边节点下线。
环境
选择目标环境。示例:反向代理服务器组。
操作类型
选择操作类型。示例:重载配置文件(reload)。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
是否在操作之前修改配置文件
勾选。
要修改的Nginx配置文件路径
目标主机中Nginx配置文件所在路径。示例:/usr/local/nginx/conf/nginx.conf。
配置文件备份路径
目标主机中原Nginx配置文件备份目标路径。示例:/usr/local/nginx/conf/nginx_bak.conf。
配置文件内容
新配置文件内容。示例:见附录中B边节点下线-代码示例。
- 编辑“A边节点下载软件包”步骤,并修改为下表参数(以Linux系统为例)。
表10 参数填写说明 参数
填写说明
步骤显示名称
示例:B边节点下载软件包。
选择源类型
选择源类型。示例:制品仓库。
环境
选择目标环境。示例:目标业务服务器组_B边节点。
选择软件包
选择制品仓库中需要部署的软件包。
下载到主机的部署目录
软件包下载到目标主机的路径。示例:/usr/local/。
- 编辑“部署A边节点”步骤,并修改为下表参数(以Linux系统为例)。
表11 参数填写说明 参数
填写说明
步骤显示名称
示例:部署B边节点。
环境
选择目标环境。示例:目标业务服务器组_B边节点。
shell命令
填写待执行命令。示例:见附录中部署节点。
- 编辑“A边节点灰度上线”步骤,并修改为下表参数(以Linux系统为例)。
表12 参数填写说明 参数
填写说明
步骤显示名称
示例:B边节点灰度上线。
环境
选择目标环境。示例:反向代理服务器组。
操作类型
选择操作类型。示例:重载配置文件(reload)。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
是否在操作之前修改配置文件
勾选。
要修改的Nginx配置文件路径
目标主机中Nginx配置文件所在路径。示例:/usr/local/nginx/conf/nginx.conf。
配置文件备份路径
目标主机中原Nginx配置文件备份目标路径。示例:/usr/local/nginx/conf/nginx_bak.conf。
配置文件内容
新配置文件内容。示例:见附录中B边节点灰度上线-代码示例。
- 编辑“A边健康测试”步骤,并修改为下表参数(以Linux系统为例)。
表13 参数填写说明 参数
填写说明
步骤显示名称
示例:B边健康测试。
环境
选择目标环境。示例:目标业务服务器组_B边节点。
重试次数
失败后重试次数,超过预设的重试次数,服务未启动会导致URL检测失败。示例:1。
间隔时间
每次重试测试的间隔时间(s)。示例:60。
测试路径
URL健康测试,支持添加多个。示例:http://127.0.0.1:3000(应用服务的IP及端口)。
- 编辑“A边节点下线”步骤,并修改为下表参数(以Linux系统为例)。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“保存”,应用创建完成。
- 复制应用。
- 复制并编辑应用二,完成应用四的创建(B边节点上线)。
- 复制应用。
- 编辑应用。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“新建环境”,填写环境名,例如:反向代理服务器组,选择与服务器对应的操作系统,填写描述信息等。
- 单击“保存”,完成环境的创建。
- 单击“导入主机”,系统已自动筛选符合当前环境的所有集群,在弹框中选择目标主机集群,单击目标主机操作列的图标,即可将该主机导入环境中。
- 切换到“部署步骤”页签,添加并编辑以下步骤。
编辑“A边节点上线”,并修改为下表参数(以Linux系统为例)。
表14 参数填写说明 参数
填写说明
步骤显示名称
示例:B边节点上线。
环境
选择目标环境。示例:反向代理服务器组。
操作类型
选择操作类型。示例:重载配置文件(reload)。
Nginx安装的路径
目标环境中Nginx服务的安装路径。示例:/usr/local/nginx。
是否在操作之前修改配置文件
勾选。
要修改的Nginx配置文件路径
目标主机中Nginx配置文件所在路径。示例:/usr/local/nginx/conf/nginx.conf。
配置文件备份路径
目标主机中原Nginx配置文件备份目标路径。示例:/usr/local/nginx/conf/nginx_bak.conf。
配置文件内容
新配置文件内容。示例:见附录中节点上线-代码示例。
- 切换到“环境管理”页签,添加并编辑环境。
- 单击“保存”,应用创建完成。
- 新建并编辑流水线。
- 新建流水线。
- 单击菜单“持续交付 > 流水线”进入到流水线服务页面。
- 单击“新建流水线”,选择“所属项目”,输入“名称”,流水线源选择“暂不选择”,单击“下一步”。
- 模板选择“空模板”,单击“确定”。
- 编辑流水线阶段任务一(A边节点灰度部署)。
- 单击,将弹框中的参数修改为如下参数并单击“确定”。
表15 参数填写说明 参数
填写说明
名称
示例:A边节点灰度部署。
总是运行
选择“否”。
- 单击图标,在弹框中选择准入类型为“自动”,单击“确定”。
- 单击“新建任务”,单击“部署”,选择“Deploy部署”,单击“添加”,将弹框中的参数修改为如下参数并单击“确定”。
表16 参数填写说明 参数
填写说明
名称
示例:A边节点灰度部署。
请选择需要调用的任务
选择“A边节点灰度部署”。
关联构建任务
暂不选择。
- 单击,将弹框中的参数修改为如下参数并单击“确定”。
- 新建并编辑流水线阶段任务二(A边节点上线)。
- 单击图标,单击,将弹框中的参数修改为如下参数并单击“确定”。
表17 参数填写说明 参数
填写说明
名称
示例:A边节点上线。
总是运行
选择“否”。
- 单击图标,在弹框中选择准入类型为“自动”,单击“确定”。
- 单击“新建任务”,单击“通用 > 人工审核 > 添加”,将弹框中的参数修改为如下参数并单击“确定”。
表18 参数填写说明 参数
填写说明
名称
示例:A边节点灰度验证。
审核人
选择业务验证人员。
审核模式
选择“全部人审核”。
超时处理
选择“审核失败,流水线终止执行”。
审核时长
示例:4小时。
审核说明
选填。
- 如下图所示,单击图标,单击“部署”,选择“Deploy部署”,单击“添加”,将弹框中的参数修改为如下参数并单击“确定”。
表19 参数填写说明 参数
填写说明
名称
示例:A边节点上线。
请选择需要调用的任务
选择“A边节点上线”。
关联构建任务
暂不选择。
- 单击图标,单击,将弹框中的参数修改为如下参数并单击“确定”。
- 编辑流水线阶段任务三(B边节点灰度部署)。
- 单击图标,单击,将弹框中的参数修改为如下参数并单击“确定”。
表20 参数填写说明 参数
填写说明
名称
示例:B边节点灰度部署。
总是运行
选择“否”。
- 单击图标,在弹框中选择准入类型为“自动”,单击“确定”。
- 单击“新建任务”,单击“部署”,选择“Deploy部署”,单击“添加”,将弹框中的参数修改为如下参数并单击“确定”。
表21 参数填写说明 参数
填写说明
名称
示例:B边节点灰度部署。
请选择需要调用的任务
选择“B边节点灰度部署”。
关联构建任务
暂不选择。
- 单击图标,单击,将弹框中的参数修改为如下参数并单击“确定”。
- 新建并编辑流水线阶段任务四(B边节点上线)。
- 单击图标,单击,将弹框中的参数修改为如下参数并单击“确定”。
表22 参数填写说明 参数
填写说明
名称
示例:B边节点上线。
总是运行
选择“否”。
- 单击图标,在弹框中选择准入类型为“自动”,单击“确定”。
- 单击“新建任务”,单击“通用 > 人工审核 > 添加”,将弹框中的参数修改为如下参数并单击“确定”。
表23 参数填写说明 参数
填写说明
名称
示例:B边节点灰度验证。
审核人
选择业务验证人员。
审核模式
选择“全部人审核”。
超时处理
选择“审核失败,流水线终止执行”。
审核时长
示例:4小时。
审核说明
选填。
- 如下图所示,单击图标,单击“部署”,选择“Deploy部署”,单击“添加”,将弹框中的参数修改为如下参数并单击“确定”。
表24 参数填写说明 参数
填写说明
名称
示例:B边节点上线。
请选择需要调用的任务
选择“B边节点上线”。
关联构建任务
暂不选择。
- 单击图标,单击,将弹框中的参数修改为如下参数并单击“确定”。
- 完成以上操作后,单击“保存并运行”,开始运行流水线任务。
- 新建流水线。
- 执行流水线并手动进行灰度验证A、B边节点是否正常。
当流水线执行到上线A边节点或上线B边节点时,流水线暂停执行,需要灰度用户手动验证灰度环境下的A边、B边业务服务器是否正常,业务正常后再继续运行流水线。
灰度用户可使用“curl”命令验证灰度环境系统是否正常。
curl http://反向代理服务器IP:Nginx端口
查看灰度用户是否进入到目标灰度环境服务器,可登录反向代理服务器,进入logs/access.log路径查看日志。
附录
- A边节点下线-代码示例
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 #server X.X.X.X:X; #A节点下线 # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP #if ( $remote_addr ~* "X.X.X.X") { # set $backend $test; #} proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- 部署节点
# 获取应用进程id pid=`ps -ef | grep app_name | grep -v grep | awk '{print $2}'` if [ -z "$pid" ]; then echo "[app_name pid is not exist.]" else echo "app_name pid: $pid " # 停止该进程 kill -15 $pid fi # 重新启动应用,可通过执行部署脚本和部署命令两种方式启动应用,如下: # 方式一:通过执行部署脚本启动应用 # sh startup.sh # 方式二:通过执行命令启动应用,建议采用nohup后台启动方式 # nohup java -jar /usr/local/app/SpringbootDemo.jar &
- A边节点灰度上线-代码示例
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 #server X.X.X.X:X; #A节点下线 # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; #A节点灰度上线 # 下面填入B主机IP及应用服务端口 #server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP if ( $remote_addr ~* "X.X.X.X") { set $backend $test; } proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- B边节点下线-代码示例
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 #server X.X.X.X:X; #B节点下线 } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP #if ( $remote_addr ~* "X.X.X.X") { # set $backend $test; #} proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- B边节点灰度上线-代码示例
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 #server X.X.X.X:X; #B节点下线 } upstream portal_test { # 下面填入A主机IP及应用服务端口 #server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; #B节点灰度上线 } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP if ( $remote_addr ~* "X.X.X.X") { set $backend $test; } proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- 节点上线-代码示例
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$time_local|$remote_addr[$remote_port]|$request|$request_method|$content_length|' '$content_type|$http_referer|$host|$http_x_forwarded_for|' '$http_true_client_ip|$server_name|$request_uri|$server_addr|$server_port|' '$status|$request_time|$upstream_addr|$upstream_response_time|$cookie_domain_tag'; access_log logs/access.log main; #访问日志:存放路径,日志级别。 error_log logs/error.log; #错误日志:存放路径。 sendfile on; keepalive_timeout 65; upstream portal { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } upstream portal_test { # 下面填入A主机IP及应用服务端口 server X.X.X.X:X; # 下面填入B主机IP及应用服务端口 server X.X.X.X:X; } server { listen XXX;#填入Nginx端口 server_name localhost; location / { set $backend portal; set $test portal_test; #下面填入灰度验证机器IP #if ( $remote_addr ~* "X.X.X.X") { # set $backend $test; #} proxy_pass https://$backend; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }