测试驱动开发 Nginx 配置

问题背景

2017年中,我参与了一个亚太地区互联网公司并购的项目,客户收购了亚太地区 7 个国家的同行业互联网企业和产品。我作为其中的 DevOps 咨询师和 DevOps 工程师,和客户一起完成并购后的产品迁移和技术能力提升的设计、实施和培训。

客户希望采用新的统一产品,并根据不同地区的业务特色进行一些定制,与此同时,需要进行数据迁移以保证业务可以继续运行。其中一个很关键的步骤是把原系统的 URL 通过重定向的方式到新的产品中,因为有很多的第三方链接和搜索引擎依然保留了原系统中的链接。

初步统计了一下,将近有3000多个 URL 需要重定向,光是规则和正则表达式就写了 400 多条(没有统一规则的 URL 害死人啊),这就引发了一个问题:我该如何验证这些规则和覆盖这些 URL ?此外,大量的重定向不光对用户来讲不是很好的体验,如果我要优化这些规则,我如何保证我当前的转发规则不被破坏?

解决方案

最早,我们写了一个 Shell 脚本,用 curl命令来验证这些 URL,最初只需要验证 200 条就可以满足需求,时间也不到两分钟。后来,我们采用了一个 Excel 文件来跟踪这些 URL,产品经理只需要把新的重定向 URL 补充到上面,我们就依据这些 URL 来开发 nginx 的重定向规则。

这让我想到了 TDD 的红绿模式:先写出一个自动化测试用例,然后修复这个自动化测试用例。更好的是,有了自动化的测试做保护,你可以放心和安全的对代码(Nginx)进行重构。

此外,随着更多的 URL 需要重定向,这个数字在不断的增加。原先的 Shell 脚本执行的时间也从最初的 2 分钟增长到了15分钟。

现有的工具满足不了要求,一怒之下,我决定开发一个自己的工具。它必须具备以下特点:

  1. 可以通过文件读取规则,进行大批量验证。
  2. 多线程并发执行,可以提升效率。
  3. 很容易和 CI 集成。
  4. 能帮我做一定程度的重定向优化分析。

于是,我在一个周末的时间用 Python 写下了 vivian: 一个多线程的批量自动化重定向验证工具。

它把原先的 15 分钟的验证时间缩短到了 17 秒,效率提升了 5294 % !!

后来,我把测试用例集成到了代码库里。并把 vivian 提交到了 pipy,这样我就可以通过 pip 在初始化 CI 上安装了。也减少了代码库中减少了一个需要维护的脚本。

选择 Python 的原因主要是因为相较于 Ruby, Go, Java, NodeJS 来说。Python 的语言环境比较稳定,几乎每种 Linux 都包含 Python 的运行环境,且容易安装和集成。

如果你对该工具感兴趣,欢迎在 github 上围观:https://github.com/wizardbyron/vivian

安装使用 Vivian

安装:

pip install vivian

使用:

vivian -f example.csv

test.csv 非常简单,第一列是源 URL,第二列是目标 URL。例如:

http://www.github.com, https://github.com/
http://www.facebook.com, https://facebook.com/

采用 csv 文件的目的主要是方便使用 Excel 和文本工具编辑。

之后会得出下列结果:

vivian -f example.csv
load test case from example.csv
2 cases loaded running in 2 threads
verifying http://www.github.com to https://github.com/
verifying http://www.facebook.com to https://facebook.com/
Failed cases:
============================================================
  line: 2
origin: http://www.facebook.com
  dist: https://www.facebook.com/
expect: https://facebook.com/
status: 200
redirect_count:1
------------------------------------------------------------
1/2 PASS in 5.8494720458984375 seconds

第一行输出提示测试用例文件的路径。

第二行输出提示测试用例数量和线程数量。你也可以通过增加 -n 来指定线程的数量,默认线程数量等于 CSV 文件记录行数。如果文件过大,请限制线程数量,否则线程创建开销会影响测试机性能。此外,过多的并发访问也会发起应用的流量保护机制。没有流量保护的应用则会 Crash。

第三行到第四行列出了需要验证的 URL。

第五行开始就是失败的测试用例信息:

失败用例的第一行就是测试用例所在的文件行号。

失败用例的第二行是测试用例测试的源 URL。

失败用例的第三行是访问测试的 URL 的实际目标 URL。

失败用例的第四行是期望得到的 URL。

失败用例的第五行是访问测试用例源 URL 最后得到的 HTTP 状态。

失败用例的第六行是访问测试用例源 URL 到最后结果之间的 重定向次数,有了这个数字我们可以优化 URL。

最后一行表明有多少个用例通过了测试,同时统计了完成这些测试的总时间。

最佳实践

以下是我总结的使用 vivian 的最佳实践场景,希望能对你的 web 服务器维护工作起到帮助。

作为冒烟/回归测试集成在持续部署流水线里

Vivan 是用 Python 编写的,这意味着你可以在自己的 CI 服务器上(大多是 Linux)很容易的安装 vivian,在部署完成后用 vivian 执行代码中的测试用例,这相当是对 Nginx 规则开发的回归测试——不会影响到以前的 URL 重定向。于此同时也是一种冒烟测试,如果测试失败,Nginx Server 是有问题的。这样可以避免一些修改破坏当前的生产环境。

重构 nginx 转发规则

在这种模式下,你需要先把需要重定向的案例写到文件里,这时候运行 vivian 肯定会失败。之后你就可以根据案例编写重定向规则。甚至可以优化合并一些正则表达式,因为有自动化测试保护。你可以放心的将验证过的 nginx 部署到生产环境中。

用 Dev 的方式处理 Ops 的工作,也算一种 DevOps 吧!?

减少重定向

我们知道,每一次重定向都会给客户端带来额外的访问开销,这对用户体验是一种灾难。redirect_count记录了重定向的次数,并且给出了最初和最终的 URL,我们可以利用这些信息构造更加简单和直接的规则,优化重定向。

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 21,767评论 1 92
  • 你还站在那棵桃花树下, 明如星空般眼睛看着远方的谁? 我问:“你在等什么?” “我在等一场梦。” 我疑惑的看着你那...
    半月流夏花阅读 336评论 0 0
  • 曾经听到过身边的朋友告诉我小时候的故事,在自己做错事的时候,爸爸和妈妈不是一个唱黑脸,一个唱白脸,而是两个...
    欣橼阅读 392评论 2 2
  • 韩宇登上了去青海西宁的飞机,尽管坐轮椅有诸多不便,但因为有徐阳陪伴,最终父母还是同意了。 窗外的云,层层叠叠,红得...
    可可夏荫阅读 940评论 10 13