7 月 5 日,又拍云 Open Talk 第 10 期 造访在广州贝塔空间。这场以《架构师专场:前后端高级实践与运用》为主题的分享会,邀请到了 酷狗音乐大数据架构师王劲,洋葱圈前端负责人游志军,又拍云 首席架构师张聪 三位业内“大拿”,向大家分享压箱底的技术实战。又拍云首席架构师张聪在活动上作了题为《nginx.conf as a service》的分享,以下是分享实录:

image.png

前不久,又拍云推出了新一代的 CDN 2.0 产品。在全面提升了产品性能与服务质量的同时,缔造了国内同行业的“两个首创”—— 1、首次实现自定义域名的全服务节点 HTTPS 访问;2、首次提出并实现“动态 CDN ”加速,支持用户源站动静态资源的无分离一站式加速。

此外,又拍云 CDN 2.0 具备更完善的 WAF 防护,并新增了自定义缓存规则、多源站设置、源站资源无缝迁移等功能亮点。针对产品安全性及使用体验,做出了大幅优化提升。

image.png

可以说,这是一款在 CDN 行业处于领先地位的优秀产品,那它究竟是如何被打造的? 在又拍云 Open Talk 第十期《架构师专场:前后端高级实践与运用》上,又拍云 CDN 核心架构负责人 张聪 由该产品的三大核心分支入手,对又拍云 CDN 2.0 进行了详尽剖析。

nginx.conf as a service:UPYUN CDN 2.0 新特性技术概览

image.png
又拍云近期将推出有关于 CDN 的功能命名为又拍云 CDN2.0,又拍云在此之前只关注于静态文件加速。又拍云 CDN 2.0 有三个大分支:

1.自定义 SSL 服务

2.动态网站的加速

3. Web 应用防火墙

自定义 SSL 证书

image.png

上图是又拍云 CDN 对比 NGINX 配置文件的一些功能,我们将其变成了一项项用户可自定义的线上服务。第一块是海量域名的虚拟主机管理,NGINX 可以配各种虚拟主机,而 UPYUN CDN 拥有很多不同的客户,我们会根据用户在管理后台的配置,将这些自定义信息推送到全网 CDN ,然后用 LUA 进行业务逻辑的控制。

而后,还有 CDN 的一系列防盗链机制,对于不同的业务提供了不同防盗策略。还有一方面是 SSL 证书的自动加载,基于 OpenSSL 协议的扩展协议—— SNI , SNI 的技术让服务端在 SSL 握手的时候,能够获取到客户端的 Host ,就可以知道每一次握手归属于哪一个 Host 。另一方面,是 UPYUN CDN 在云端的管理,CDN 后端配有多个 IP ,也包括移动、联通等多个线路,我们会根据用户源站网络情况进行自动调度。

image.png

上图是又拍云 CDN 的架构图,前两层是 NGINX 控制的业务逻辑,底部一层是云存储的代理层,与CDN无关,是我们的回源数据中心。CDN 的逻辑都是基于 NGINX + ngx_lua 实现的。

image.png
上图是 又拍云 的元数据同步,所有空间在 CDN 上配置,包括域名、防盗链、用户后端 IP 的配置都是通过 Redis 进行一个全网分发。又拍云内网的每一个节点可能有十多台 NGINX 的实例,会依赖两到三个从的 Redis ,这两三个从的 Redis 会跟数据中心主从同步,每一个节点 NGINX 的配置可能会配多个从,多个从会在 Lua 代码层面实现故障切换,而默认只会选择第一台,如果第一台出现故障,就会自动切换到第二台。

又拍云全网的主从同步支持多线路,包括移动、联通、电信,不管哪条线路出现问题都不会影响,会实现自动切换工作,这对于 CDN 的业务的可靠性很重要,因为元数据都是通过这套机制来实现实时的和全网保持同步的。特别地,这里的 Redis 是做数据同步而并非元数据缓存,元数据的缓存是基于 NGINX 的共享内存实现的,在 NGINX 上做缓存,所有的工作进程都可以共享。

image.png

通过又拍云后台实时的日志分析和统计,元数据的缓存命中率高达 95% ,其中有几种 NGINX 共享内存的状态,HIT、负向 HIT 等。并且又拍云多加了 NET_ERR 状态,Redis 出现问题的时候,过期的数据会仍然缓存在 NGINX 中,因此线上可以同时容忍两个 Redis 出现问题,出现这样的情况,内部识别的状态将是 NET_ERR ,也就是网络错误。

这种情况发生时,Lua 代码识别到两个 Redis 出现问题,将会保证 NGINX 已经缓存的元数据不再过期,很大程度上保证部分已经缓存着的数据在 NGINX 上不会因为两个 Redis 出现问题而失效,如果失效,将会引起 CDN 的访问大面积受到影响,而现在,只会影响到当前做了数据改动的部分用户(因为这部分数据不能及时同步到 NGINX ),但是正常的业务都能保证,又拍云有相应的机制,对用户的影响将会降低。

image.png

关于自定义的 SSL 服务,如果用 NGINX 配置文件的方式,那么 UPYUN 需要配置好多虚拟主机,一张证书一个虚拟主机,这样显然非常麻烦。而我们在纯 Lua 层面做了证书调度支持,因此可以通过管理后台上传对应一个证书和私钥,然后设置绑定在哪个域名下,后台会有一个域名和证书对应,最后会把配置信息及证书同步到全网。UPYUN CDN 会通过证书的 ID 查到证书内容和私钥,进行握手,即时生效。

又拍云 HTTPS 服务支持两种模式,第一种是用户浏览器与又拍云 CDN HTTPS 的加密访问,另一个是回源对 HTTPS 的加密访问。

动态网站的加速

image.png

image.png

上图是一个 NGINX 的简单配置,11.1 与 11.2 的权重分别是 1 和 2 ,后面配有两个参数,第三台 11.3 ,实际上是备份的节点。如果 11.1 和 11.2 不同时出现问题,请求不会落到 11.3 ,但是两台都出现问题的时候,请求会落到 11.3 上,达到备份的意义。

image.png

上面有两个配置,第一个配置是 upstream error timeout http_500; ,用来确定 NGINX 后端出现何种情况下会进行重试。如果 11.1 第一次去连发现链接超时,会根据后面的配置进行重试,重试下一台 11.2 。下面是配置次数,在 NGINX 1.7.5 之前没有这个配置,重试次数与 server 数量一样,然而实际业务中很多时候并没有这个需要,精确配置两次重试就可以了,因此我们只允许重试两次,还是有问题就直接响应 503 错误。

而后,我们将代码转变为服务,就是管理后台里的自定义多源站的配置,可以自定义回源域名,可以选择跟访问域名保持一致,也可以支持协议跟随。回源方面,跟 upstream 的配置是一样的,11.1 和 11.2 以及 11.3 作为备份线路,备份线路只有前两台出现问题的时候才会有请求,这边会有增加最大失败次数和静默时间,max_fails 和 fail_timeout 。

而在多台 IP 的情况下,当服务器在 30 秒内的累计失败次数超过 10 次,下一个 30 秒就认为不可用。这样不至于在一台服务器出现问题的时候,请求全部落到出现问题的那台机器上,这是一个简单的被动保护机制。满足这个条件,下一个 30 秒就不可用,减少很多失败的请求,这是容灾的保护。同时也可以设置最多重试次数,之前默认的版本是跟 server 数量相关的,如果 server 数量三个,那就重试三次。

WEB 应用防火墙

WEB 应用防火墙是又拍云结合以往经验,安全工程师整理出一套核心规则,大致一个规则生命周期会维护一个自定义语言的文本规则,然后通过程序脚本转成 JSON ,Redis 配送到全网,另一个角度还会将 JSON 转成 Lua 代码,完成转换操作,将 Lua 当成字符串,通过 Redis 推送到全网,然后再执行代码,这样会让内部转换效率提升,直接推送代码然后加载代码即可。UPYUN 拥有一个规则库,每次的变动全网会做一个 WAF 规则的更新,NGINX 会实时探测到版本的变更,对规则做更新,规则会存放在内存中。

WAF 的系统会在请求过来时初始全局的变量,再针对每个请求的特点,进行分类,而规则的分类我们是提前分好的,只需要检测某一组的规则就好,提高效率。然后根据整个 WAF 规则做一个匹配,识别到这个字符串是我们一些常见的注入或者是备份的录入,直接会从 403 退出起到保护的作用,防止这条请求落到源站。

又拍云对所有的攻击会做统计,另有一套实时数据的统计系统,统计通过 Lua 代码到中心的统计服务上汇总,后台会有相关的统计显示,包括攻击的类型,或者是 XSS 还是 SQL 注入比较多,基于时间轴进行呈现,第一期的功能比较简单,第二期将会加入更多的展示,包括攻击来源 IP,攻击的特点,后台用户可以看到前 10 的攻击来源 IP ,直接点击拉入黑名单。

又拍云 CDN 2.0 新的特性

又拍云 CDN 2.0 支持源站动静分离,我们会自动对源站的资源进行识别。支持多线路、多回源地址,跟 NGINX 的配置非常一致,可以任意配置,支持各种各样的配置需求。同时也支持 JavaScript、CSS、HTML 代码压缩优化,只要开启开关,所有流过动 UPYUN CDN 的网站,我们都会自动对这些文件进行优化压缩,把一些空格以及符号去掉,减小文件大小。还有 JavaScrip、CSS 文件支持 Combo 请求,在同一次请求加载,源站放两个 JS 文件,请求 URL 可以用一定的规则请求,把两个请求变成一个文件,减少网络请求。

有了动态 CDN 之后,又拍云下一步的发展方向更加多元化,之前只会考虑静态文件,关注性能、缓存命中率,而动态 CDN 会关注整站的加载速率,又拍云接下来会做自动适配客户终端、访问终端的屏幕大小,手机访问 www.upyun.com 和电脑访问是不同的大小,通过 又拍云的 CDN ,自动适配识别用户屏幕终端大小,自动为加速网站中的图片等内容做 resize,这样手机访问和电脑访问的图片大小会不一样。改善手机端、移动端、小屏幕的加载效果,因为小屏幕,没必要加载大的图片,所以这个工作可以直接在 又拍云 的 CDN 上完成。

又拍云 CDN 接下来会更多样化地对动态内容进行优化,比如说结合前端浏览器的一些访问优化,又拍云将会把很多工作在CDN上完成,让用户可以更简单地处理业务,用户只需要关心业务逻辑,而所有通用的优化,都可以在 CDN 上建立起来。