如何能检测 Nginx 实际配置变更和配置变更备注的等价性? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhoudaiyu
V2EX    NGINX

如何能检测 Nginx 实际配置变更和配置变更备注的等价性?

  •  
  •   zhoudaiyu
    PRO
    2021-04-20 22:07:41 +08:00 via iPhone 2659 次点击
    这是一个创建于 1706 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们的 nginx 变更平台当前阶段最多通过 ansible 把 nginx.conf 拷贝到目标机器的临时文件夹上,然后用 nginx -t 验证一下配置,这样可以解决配置语法的问题。但是如果比如变更备注写的减少某个 upstream 的参与负载机器,结果有个兄弟不小心把配置文件该 upstream 机器全都注释掉了,就变成了 0 台机器了。但是这样可以通过 nginx 的语法检查。类似的这种例子还很多,比如 server_name 域名少打一位等等。我们现在 nginx 配置变更就相当于直接修改 http 块的配置,整个 http 里面的内容都直接编辑,然后通过模板渲染一些固定参数后推送,并没有把 nginx 的所有配置表单化,而且变更备注也没有做成表单化,这样带来的问题是,没法验证实际变更和备注里面的逻辑的等价性。但是把 nginx 配置完全表单化难度也不小,因为 nginx 配置文件里面也可以写 lua 脚本什么的,变更备注表单话也是比较复杂的,因为能变更的种类真的太多太多。但是如果不表单化想检查逻辑可能就要用 NLP 等技术去解析语义了,有点弄复杂了。大家这块有啥好的方法没?

    21 条回复    2021-04-21 12:34:22 +08:00
    dzdh
        1
    dzdh  
       2021-04-21 00:10:54 +08:00   1
    etcd + confd ?
    wd
        2
    wd  
       2021-04-21 01:35:34 +08:00 via iPhone
    监控 health check 啊?
    neoblackcap
        3
    neoblackcap  
       2021-04-21 02:06:01 +08:00   1
    这需求完全用不到 NLP,不就是配置文件解析。你大可将 nginx 源代码里面解析配置文件的哪部分代码拿出。然后每次解析一次配置文件。然后对比两次的结果,以及进行一些校验。
    defunct9
        4
    defunct9  
       2021-04-21 06:56:23 +08:00 via iPhone
    上 k8s 啊,ingress 只让他改 location
    zhoudaiyu
        5
    zhoudaiyu  
    OP
    PRO
       2021-04-21 07:01:50 +08:00 via iPhone
    @dzdh 我们是用的 ansible,因为还涉及到一些 nginx 的其他运维操作
    wd 这个就有点晚了,相当于已经发生故障再通过监控告警去解决了
    @neoblackcap 您说的这个对,但是现在想理解变更配置的缘由,也就是说得把变更原因这块也解析出来,再看和变更的配置能不能 match
    @defunct9 我们木有上 ingress 哇,所以...
    wd
        6
    wd  
       2021-04-21 07:19:50 +08:00 via iPhone
    你可以在发布之前把监控的检查都跑一遍再上线。又不是一定要等故障发生。监控的目的是把你关心的内容抽象出来。
    zhoudaiyu
        7
    zhoudaiyu  
    OP
    PRO
       2021-04-21 07:20:49 +08:00 via iPhone
    @wd 鄙人不才,我主要是靠日志监控
    netnr
        8
    netnr  
       2021-04-21 08:38:48 +08:00 via Android
    个人有个简单的想法
    提取你们现有服务关键字(内网服务端口 域名 静态路径等),然后正则匹配 nginx 配置文件是否包含了所有的关键字
    cominghome
        9
    cominghome  
       2021-04-21 08:47:24 +08:00
    “实际变更和备注里面的逻辑的等价性”,能做到这个水平还搞啥运维啊

    不要什么都想靠技术解决,我感觉这事很简单吧,引入变更流程,每次变动 diff 一下新旧配置,再找个人复核一下就完事
    zliea
        10
    zliea  
       2021-04-21 08:55:34 +08:00
    我的想法是为什么不用代码生成配置文件。
    hanxiV2EX
        11
    hanxiV2EX  
       2021-04-21 09:20:04 +08:00 via Android
    自己用 json 或者 yml 定义这些配置,然后生产 nginx 配置。
    rrfeng
        12
    rrfeng  
       2021-04-21 09:26:18 +08:00 via Android
    那应该直接检测 Nginx 进程内存里的配置是否等价于预期。
    37Y37
        13
    37Y37  
       2021-04-21 09:34:15 +08:00
    配置统一管理,修改后对比 https://blog.ops-coffee.cn/s/qg42uqj9rnswqdmd41cyug
    littleFive
        14
    littleFive  
       2021-04-21 09:43:09 +08:00
    不如在配置文件夹里面建一个 git 仓库,用 git 管理起来
    killva4624
        15
    killva4624  
       2021-04-21 09:50:02 +08:00
    添一个测试环境,配置正式推送到线上环境前先上测试环境跑一遍必要的 HTTP 接口测试。
    matrix67
        16
    matrix67  
       2021-04-21 09:54:00 +08:00
    > 但是如果比如变更备注写的减少某个 upstream 的参与负载机器,结果有个兄弟不小心把配置文件该 upstream 机器全都注释掉了,就变成了 0 台机器了。

    > 但是这样可以通过 nginx 的语法检查。类似的这种例子还很多,比如 server_name 域名少打一位等等。

    这个是提配置没有 review 啊,提配置也要人 double check 的啊! 合入配置仓库要有 diff view,要有人 merge 的
    matrix67
        17
    matrix67  
       2021-04-21 09:57:12 +08:00   1
    还有楼主写这么大一团文字不分段,看的人头疼,你们配置要是这么合那根本没法 diff 。
    dallaslu
        18
    dallaslu  
       2021-04-21 11:00:38 +08:00
    用过 1 楼 @dzdh 提到的 etcd + confd 方案。如果为了避免 upstream 无节点、打错 server_name,可以把这一部分做成表单;然后配置文件模块化,依然不影响修改 http 块、写 lua 脚本。

    如果不管理起来,永远都是一团乱麻。git 版本控制,配置变更加入审核环节,遇监控报警自动退回上一版本
    crclz
        19
    crclz  
       2021-04-21 11:21:58 +08:00
    审查+测试
    defunct9
        20
    defunct9  
       2021-04-21 11:29:33 +08:00
    @zhoudaiyu 没有就上啊。不上就单独给这些人写个 jinjia location temple,只让他们改 location,ansible 单独开个 playbook 只让改 location 不就完了。
    realpg
        21
    realpg  
    PRO
       2021-04-21 12:34:22 +08:00
    这个很简单嘛。。。
    两个人独立修改配置文件,并提交到仲裁系统
    然后仲裁系统去掉一切排版的空格 tab,然后俩人的配置完全一样就通过
    不一样就发回去让两个人重新写……
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     949 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:21 PVG 07:21 LAX 15:21 JFK 18:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86