Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1760294
  • 博文数量: 150
  • 博客积分: 660
  • 博客等级: 上士
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 11:39
文章分类

全部博文(150)

文章存档

2019年(4)

2018年(36)

2017年(53)

2016年(7)

2015年(3)

2014年(3)

2013年(27)

2012年(2)

2011年(1)

2006年(1)

2005年(13)

分类: 系统运维

2017-08-02 19:28:37

更改nginx配置中upstream {} 中各节点上线下线脚本

简介

在更新服务的时候,需要提前在nginx配置里面摘除相应节点,待服务部署后成功再上线,实现平滑的升级后台服务

特点

  • 灵活,根据传入的自定义参数修改upstream配置段;
  • 稳定可靠,速度快;
  • 部署简单

解决方法介绍

之前考察并了解几种方法,

  • etcd+confd的方式
  • nginx第三方模块+http api接口的方式
  • nginx plus原生支持 这里就不多介绍了,下面介绍用脚本调用sed命令的方式来修改nginx配置并reload

sed 命令方式介绍

  • sed 用到的几个命令
H       将当前行放入hold space;
:loop  开始一个名为loop的循环;
b       从loop循环中,脚本结束
bloop  跳回到loop循环的开始
  • 以找到下线的server 10.0.1.11:27011;为例说明sed 脚本
sed -i "/$app\s*{/{   ## 找到以“$app {”开头的 upstream配置段,这里$app 和下文的$node 为shell传参

H;                        ## 将 “$app {” 放入hold space备用
:loop;n;                  ## 开始loop循环,然后读入下一行
s/\(#server\)\s*\($node\)/server \2/; ##找到“#server $node” 用server替换,node
H;                    ## 将替换结果放入hold space
/}/{b};           ## 如果到了upstream 段落的结尾 "}"则退出循环
bloop}"           ## 未到段落结尾继续回到循环第一步 
  • 脚本全文
#/bin/sh
set +x
app=$2
node=$3
flag=$1
case $app in
  tripWeb_v2)
         nginx_conf="/etc/nginx/conf.d/v2.goluk.cn.conf"
         ;;
  *)
         nginx_conf="/etc/nginx/conf.d/s.goluk.cn.conf"
         ;;
esac
case $flag in
  online)
          sed -i "/$app\s*{/{H;:loop;n;s/\(#server\)\s*\($node\)/server \2/;H;/}/{b};bloop}" $nginx_conf
      nginx -t && nginx -s reload
          ;;
  offline)
          sed -i "/$app\s*{/{H;:loop;n;s/\(server\s*$node\)/#\1/;H;/}/{b};bloop}" $nginx_conf
      nginx -t && nginx -s reload
          ;;
  getconf)
      sed -n "/$app\s*{/{H;:loop;n;H;/}/{x;p;b};bloop}" $nginx_conf
      ;;
  *)
     echo " Usage: offline|online tripWeb_backend  10.0.1.11   ."
         echo " Usage: getconf  cdcAdmin_backend ."
         exit 1
         ;;
esac
阅读(2761) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~