• 沒有找到結果。

如何提高缓存命中率_内容分发网络 CDN_最佳实践_华为云

N/A
N/A
Protected

Academic year: 2022

Share "如何提高缓存命中率_内容分发网络 CDN_最佳实践_华为云"

Copied!
48
0
0

加載中.... (立即查看全文)

全文

(1)

CDN

最佳实践

文档版本 05

发布日期 2022-02-23

(2)

版权所有 © 华为技术有限公司 2022。 保留一切权利。

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。

商标声明

和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

(3)

目 录

1 CDN 加速 OBS 桶文件... 1

1.1 概述... 1

1.2 CDN 加速 OBS 桶文件(CDN 控制台)...3

1.3 CDN 加速 OBS 桶文件(OBS 控制台)... 6

1.4 多云存储数据同步方案... 11

2 CDN 加速 ECS 资源...13

3 CDN 加速 WAF 防护资源...18

4 如何设置缓存过期时间... 23

5 如何提高缓存命中率... 28

6 CDN 日志转存到 OBS...31

7 获取客户端真实 IP... 40

A 修订记录... 44

最佳实践 目 录

(4)

1 CDN 加速 OBS 桶文件

1.1 概述

背景介绍

现在越来越多的行业使用OBS桶存储图片、视频、软件包等静态资源文件,并将OBS 桶作为网站、论坛、APP、游戏等业务的存储源。在需要获取这些静态资源时,用户通 过URL直接从OBS桶请求数据。OBS桶能够很好的解决本地存储不够用的难题,但一般 情况下文件只存储在一个区域,不同区域的用户访问OBS桶的响应速度存在差异。在 需要频繁访问的场景下,直接访问OBS桶来获取相应文件,还会消耗大量的流量费 用。

CDN 加速 OBS 文件方案

华为云CDN可以有效加速网站,为用户提供良好的体验,而OBS桶提供海量文件存 储。将数据存放在OBS桶中然后通过配置CDN加速,这样构造的业务系统可以在降低 成本的同时,提高终端用户使用感受。当终端用户发起访问请求时,会首先通过CDN 查找对此域名响应速度较快的CDN节点,并查询此节点是否有缓存终端用户请求的内 容。如果CDN节点有缓存用户所需资源,直接将资源返回给用户;如果CDN节点无缓 存,则回源请求资源返回给用户,同时将资源缓存到CDN节点。

最佳实践 1 CDN 加速 OBS 桶文件

(5)

方案优势

1. 低成本

– CDN加速OBS桶后,资源缓存在CDN节点,用户请求无需回源,而CDN加速 的费用较低,二者配合使用可以节约50%到57%的带宽成本,详见通过CDN 减少OBS公网带宽费用。

– OBS桶提供CDN回源流量包折扣方式,使CDN从OBS桶获取数据时流量费用 更低。

说明

● 如果您想要享受价格优惠,您需要将CDN和OBS放在同一个帐号中。计费详情请 见CDN加速OBS计费规则。

● CDN加速OBS桶不支持走内网。

2. 高效率

– 华为云CDN具有加速资源丰富、节点分布广泛优势,保证将用户请求精准调 度至较优边缘节点,提供有效且稳定的加速效果。

适用场景

● 通过OBS桶提供文件下载业务的应用或服务。例如:通过HTTP/HTTPS提供文件下 载业务的网站、工具下载、游戏客户端、APP商店等。

● 通过OBS桶提供音视频点播业务的应用或服务。例如:在线教育类网站、在线视 频分享网站、互联网电视点播平台、音乐视频点播APP等。

● 通过OBS桶提供图片素材等的网站。例如:包括门户网站、电商平台、资讯APP、

UGC应用(User Generated Content,用户原创内容)等

约束与限制

● 只有版本号为3.0及以上的桶支持此方案。桶版本号可以在OBS控制台上,进入桶 概览页面后,在“基本信息”中查看。

KMS 加密文件配置

CDN默认无法读取OBS桶中的加密文件,若您的OBS桶存在此类文件,建议您慎重开 启CDN加速,避免加密对象泄露。如果您因业务需求,需要加速OBS桶中的KMS加密 文件,请注意:

● 如果您的OBS桶是公有桶,CDN将无法读取桶中的KMS加密文件,从而导致回源 失败,用户无法访问到加密文件。

解决方案:将公有桶中的加密文件转移到私有桶中,再接入CDN加速。

● 如果您的OBS桶是私有桶,需要为“CDNAccessPrivateOBS”委托配置“KMS Administrator”权限。如此,CDN才能读取OBS私有桶中的KMS加密文件并加 速,配置过程详见OBS私有桶回源配置。

最佳实践 1 CDN 加速 OBS 桶文件

(6)

1.2 CDN 加速 OBS 桶文件(CDN 控制台)

场景介绍

某游戏网站目前已购买OBS桶服务,并存放了大量游戏软件、图片等文件在OBS中。

随着用户不断增长,游戏下载、图片加载都存在响应较慢的问题,特别是离文件存放 区域较远的用户。基于以上诉求,该网站决定采用CDN加速访问OBS方案,以最低成 本实现游戏下载加速,提升用户访问体验。

数据准备

准备项 说明 示例

网站域名 游戏网站域名。如果您的

加速范围为“中国大陆”

或“全球”,根据中国

《互联网管理条例》的要 求,此域名必须在工信部 备案并在有效期内才可以 使用CDN加速。

download.game- apk1.com

OBS桶 版本号为3.0以上的OBS存 储桶。

obs-doc-test

前提条件

已将网站所需图片、软件包等静态资源存储至已准备的OBS桶中。

说明

● 如果上述操作还未完成,可通过OBS控制台、OBS Browser、SDK等多种方式创建桶、上传 文件,具体操作请参考OBS帮助文档。

● 如果您使用了2022年1月1日以后创建的OBS桶作为源站,并且需要支持在线预览功能,您要 在CDN控制台>域名管理>高级设置>HTTP header配置,将“Content-Disposition”的值设 为“inline”,详见如何在浏览器中在线预览OBS中的对象?。

配置步骤

1. 在CDN控制台添加加速域名

a. 登录华为云控制台,选择“所有服务 > CDN与智能边缘 > CDN”,进入CDN 管理控制台。

b. 单击左侧“域名管理”,进入域名管理页面。

c. 在域名管理页面单击“添加域名”。

d. 在“添加域名”弹框中配置域名及CDN加速等信息,如图所示。

加速域名:输入游戏网站域名,此处以download.game-apk1.com为 例。

最佳实践 1 CDN 加速 OBS 桶文件

(7)

业务类型:实际业务结合应用场景选择合适的业务类型。

服务范围:根据您的业务需要选择服务范围。

源站类型:选择“OBS桶域名”,并选择绑定的OBS桶域名。

静态网站托管:如果OBS桶开启了静态网站托管,同步勾选。

e. 单击确定,完成域名添加。

2. 配置CNAME

添加加速域名后,CDN会自动生成一条CNAME域名。加速域名在CDN服务中获得 的CNAME域名不能直接访问,必须在加速域名的域名服务商处配置CNAME记 录,将加速域名指向CNAME域名,访问加速域名的请求才能转发到CDN节点上,

达到加速效果。本实践中自动生成的CNAME域名为“download.game-

apk1.com.c.cdnhwc1.com”。不同DNS服务商的CNAME配置方式不同,此处以 华为云云解析服务为例。其他DNS服务商的CNAME配置方法可参考配置CNAME 域名解析。

a. 登录华为云控制台,在控制台首页选择“网络 > 云解析服务DNS”,进入云 解析服务页面。

b. 在左侧菜单栏中,选择“域名解析 > 公网解析”,进入公网域名列表页面。

c. 在待添加记录集的域名所在行,单击“域名”列的域名名称。本实践中对应 的域名为“game-apk1.com.”。

d. 单击“game-apk1.com”,进入域名解析页面,然后单击右上角“添加记录 集”,进入“添加记录集”弹出框。

最佳实践 1 CDN 加速 OBS 桶文件

(8)

e. 根据界面提示填写参数配置,下表中未提到的参数可保持默认值。

参数 说明 示例

主机记录 主机记录指域名前缀。 本示例填写:

download 类型 记录集的类型,此处为CNAME

类型。

CNAME-将域名指向另 外一个域名

别名 用于是否将此记录集关联至云服

务资源实例。 否

线路类型 用于DNS服务器在解析域名时,

根据访问者的来源,返回对应的 服务器IP地址。

添加解析线路类型时,切记先添 加默认线路类型,以保证网站可 访问。

全网默认

TTL(秒) TTL指解析记录在本地DNS服务 器的有效缓存时间。如果您的服 务地址经常更换,建议TTL值设 置相对小些,反之,建议设置相 对大些。

默认为“5分钟”,即 300s。

最佳实践 1 CDN 加速 OBS 桶文件

(9)

参数 说明 示例

值 需指向的域名。

如果没有开启CDN加速,该值为 桶访问域名;如果开启CDN加速 后,该值为CDN分配的CNAME 域名。

download.game- apk1.com.c.cdnhwc1.c om

f. 单击“确定”,完成添加。

g. 验证CNAME配置是否生效。

打开Windows操作系统中的cmd程序,输入如下指令:

nslookup -qt=cname 桶绑定的自定义域名

本实践中桶绑定的自定义域名为“download.game-apk1.com”。如果回显 CDN分配的CNAME域名,则表示CNAME配置已经生效。

3. 开启OBS私有桶回源(公共读或公共读写的OBS桶跳过此步骤)

如果您的OBS桶是私有桶,您需要前往CDN控制台开启OBS私有桶回源,CDN才 能从OBS中回源获取数据。具体请参见OBS私有桶回源配置。

说明

● 如果您的OBS桶策略为公共读或公共读写,请不要开启OBS私有桶回源。

● 如果您的私有桶中有不希望被公开的资源,请将此部分资源移入其它私有桶中。

4. 配置文件下载URL

将代码中需要加速下载的文件URL地址配置为:游戏网站域名+文件在OBS桶中的 存储路径+文件名称。

以配置的游戏网站域名download.game-apk1.com以及存储在obs-doc-test桶中的 game/3.2.1/文件夹下的android.apk文件为例,文件下载URL的配置如下:

https://download.game-apk1.com/game/3.2.1/android.apk

5. 验证业务

待游戏网站重新部署后,登录游戏网站,浏览网页图片、进行游戏下载。

如果图片可以成功显示、游戏可以成功下载,则表示加速配置成功。

1.3 CDN 加速 OBS 桶文件(OBS 控制台)

场景介绍

某游戏网站目前已购买OBS桶服务,并存放了大量游戏软件、图片、视频等文件在 OBS中。随着用户不断增长,游戏下载、图片加载都存在响应较慢的问题,特别是离 文件存放区域较远的用户。基于以上诉求,该网站决定采用CDN加速访问OBS方案,

以最低成本实现游戏下载加速,提升用户访问体验。

最佳实践 1 CDN 加速 OBS 桶文件

(10)

数据准备

准备项 说明 示例

网站域名 游戏网站域名。如果您的

加速范围是“中国大陆”

或者“全球”,根据中国

《互联网管理条例》的要 求,此域名必须在工信部 备案并在有效期内才可以 使用CDN加速。

download.game- apk1.com

OBS桶 版本号为3.0以上的OBS存

储桶。 obs-doc-test

前提条件

已将网站所需图片、软件包等静态资源存储至已准备的OBS桶中。

说明

如果上述操作还未完成,可通过OBS控制台、OBS Browser、SDK等多种方式创建桶、上传文 件,具体操作请参考OBS帮助文档。

配置步骤

1. 在OBS控制台中开启CDN加速

OBS支持域名管理功能,在OBS上绑定用户域名即可实现使用自定义域名访问 OBS,且可以直接在绑定过程中开启CDN加速,不用前往CDN控制台开启。

a. 登录华为云控制台,选择“所有服务 > 存储 > 对象存储服务”,进入OBS管 理控制台。

b. 单击存放软件包的桶名称,此处以obs-doc-test为例,进入桶管理页面,如图 所示。

c. 左侧导航栏选择“域名管理”,单击“绑定用户域名”。如图所示。

最佳实践 1 CDN 加速 OBS 桶文件

(11)

d. 在“绑定用户域名”弹框中配置域名及CDN加速等信息。

用户域名:输入游戏网站域名,此处以download.game-apk1.com为 例。

CDN加速:开启CDN加速。

业务类型:实际业务结合应用场景选择合适的业务类型。

说明

● 系统默认加速范围为“中国大陆”。

● OBS自定义域名绑定暂时不支持HTTPS访问自定义域名,只支持HTTP访问自定义 域名。

客户自定义域名绑定成功后,若想使用HTTPS进行访问,需同时使用CDN,

通过CDN管理控制台进行HTTPS证书管理,即可使用HTTPS访问。

e. 单击“确定”。

2. 配置CNAME

在OBS绑定用户域名时开启CDN加速后,CDN会自动生成一条CNAME域名。加速 域名在CDN服务中获得的CNAME域名不能直接访问,必须在加速域名的域名服务 商处配置CNAME记录,将加速域名指向CNAME域名,访问加速域名的请求才能 转发到CDN节点上,达到加速效果。本实践中自动生成的CNAME域名为

“download.game-apk1.com.c.cdnhwc1.com”。不同DNS服务商的CNAME配置

最佳实践 1 CDN 加速 OBS 桶文件

(12)

方式不同,此处以华为云云解析服务为例。其他DNS服务商的CNAME配置方法可 参考配置CNAME域名解析。

a. 登录华为云控制台,在控制台首页选择“网络 > 云解析服务DNS”,进入云 解析服务页面。

b. 在左侧菜单栏中,选择“域名解析 > 公网解析”,进入公网域名列表页面。

c. 在待添加记录集的域名所在行,单击“域名”列的域名名称。本实践中对应 的域名为“game-apk1.com.”。

d. 单击“game-apk1.com”,进入域名解析页面,然后单击右上角“添加记录 集”,进入“添加记录集”弹出框。

e. 根据界面提示填写参数配置,下表中未提到的参数可保持默认值

参数 说明 示例

主机记录 主机记录指域名前缀。 本示例填写:

download

最佳实践 1 CDN 加速 OBS 桶文件

(13)

参数 说明 示例 类型 记录集的类型,此处为CNAME

类型。 CNAME-将域名指向另

外一个域名 别名 用于是否将此记录集关联至云服

务资源实例。

线路类型 用于DNS服务器在解析域名时,

根据访问者的来源,返回对应的 服务器IP地址。

添加解析线路类型时,切记先添 加默认线路类型,以保证网站可 访问。

全网默认

TTL(秒) TTL指解析记录在本地DNS服务 器的有效缓存时间。如果您的服 务地址经常更换,建议TTL值设 置相对小些,反之,建议设置相 对大些。

默认为“5分钟”,即 300s。

值 需指向的域名。

如果没有开启CDN加速,该值为 桶访问域名;如果开启CDN加速 后,该值为CDN分配的CNAME 域名。

download.game- apk1.com.c.cdnhwc1.c om

f. 单击“确定”,完成添加。

g. 验证CNAME配置是否生效。

打开Windows操作系统中的cmd程序,输入如下指令:

nslookup -qt=cname 桶绑定的自定义域名

本实践中桶绑定的自定义域名为“download.game-apk1.com”。如果回显 CDN分配的CNAME域名,则表示CNAME配置已经生效。

3. 开启OBS私有桶回源(公共读或公共读写的OBS桶跳过此步骤)

如果您的OBS桶是私有桶,您需要前往CDN控制台开启OBS私有桶回源,CDN才 能从OBS中回源获取数据。具体请参见OBS私有桶回源配置。

说明

● 如果您的OBS桶策略为公共读或公共读写,请不要开启OBS私有桶回源。

● 如果您的私有桶中有不希望被公开的资源,请将此部分资源移入其它私有桶中。

4. 配置文件下载URL

将代码中需要加速下载的文件URL地址配置为:游戏网站域名+文件在OBS桶中的 存储路径+文件名称。

以配置的游戏网站域名download.game-apk1.com以及存储在obs-doc-test桶中的 game/3.2.1/文件夹下的android.apk文件为例,文件下载URL的配置如下:

https://download.game-apk1.com/game/3.2.1/android.apk

5. 验证业务

待游戏网站重新部署后,登录游戏网站,浏览网页图片、进行游戏下载。

如果图片可以成功显示、游戏可以成功下载,则表示加速配置成功。

最佳实践 1 CDN 加速 OBS 桶文件

(14)

1.4 多云存储数据同步方案

应用双写

如果数据是在应用服务侧产生,或者数据在客户端产生但通过服务端将数据写入对象 存储,则建议使用双写方案,架构如下:

此时业务应用可对接两家对象存储的SDK,将文件以同步模式或者异步模式写入两家 对象存储。对象存储的上行流量免费,所以该架构不会增加任何成本。

数据回源

如果数据上传逻辑不做改变,则可使用OBS的“数据回源”功能,在文件访问请求到 达OBS而OBS桶里没有该文件时,可通过“数据回源”将客户端请求重定向到设定的 源站并异步地从源站将数据拉取到OBS存储下来,架构如下:

详细流程说明:

1. 客户端向华为CDN发起获取文件的请求

2. 华为CDN回源到华为OBS请求文件,OBS侧事先配置好数据回源,当请求的文件 不存在时,会响应302重定向到配置的源站(此处为其他云对象存储)

3. 华为CDN接收到OBS返回的302请求 4. OBS异步从客户配置的源站请求文件

5. 华为CDN处理302跳转到其他云对象存储侧获取数据

最佳实践 1 CDN 加速 OBS 桶文件

(15)

6. 其他云对象存储响应华为CDN的文件请求

7. 华为CDN将文件内容返回给客户端,当下次客户端请求同样的文件时,华为CDN 直接回源到OBS获取。

说明

“数据回源”功能是被动触发式,即只有向OBS发起请求后OBS才会到设置的源站将数据拉取过 来,所以当一个新文件上传到其他云对象存储后,建议业务应用程序向OBS触发一个GET请求来 请求数据(发起GET请求后可关闭连接,无需接收实体数据)。另外该架构会在其他云对象存储 侧产生两份数据流量(针对同一个文件,CDN拉取一次,OBS拉取一次)。

Serverless 触发式上传

不改变原有的上传逻辑,当文件上传到其他云对象存储后,触发函数计算服务,通过 Serverless方式将文件同步到华为云OBS,架构如下:

1-1 Serverless 触发式上传

该架构需要客户在其他云启用函数计算服务并部署上传文件到OBS的代码,会产生函 数计算服务的费用。

最佳实践 1 CDN 加速 OBS 桶文件

(16)

2 CDN 加速 ECS 资源

前提条件

● 已购买弹性云服务器ECS,且绑定弹性公网IP。

● 已经按照域名准入要求准备好需要接入的域名。

● 已开通CDN服务。

背景介绍

ECS(弹性云服务器)是由CPU、内存、操作系统、云硬盘组成的基础的计算组件,可 以根据业务灵活配置,节约大量的硬件成本。ECS服务分区域,跨区域访问会存在网络 延时的问题,影响用户体验。

华为云CDN可以有效加速网站,为用户提供良好的体验。通过CDN加速ECS资源,这 样构造的业务系统可以在降低成本的同时,提高终端用户使用感受。当终端用户发起 访问请求时,会首先通过CDN查找对此域名响应速度较快的CDN节点,并查询此节点 是否有缓存终端用户请求的内容。如果CDN节点有缓存用户所需资源,直接将资源返 回给用户;如果CDN节点无缓存,则回源请求资源返回给用户,同时将资源缓存到 CDN节点。

方案优势

● 用户访问网站资源,全部通过CDN,降低源站压力。

● 使用CDN流量,单价低于ECS直接访问外网流量,可以节约50%到57%的带宽成 本,详见通过CDN减少公网带宽费用。

● 终端用户从距离最近的CDN节点获取资源,减少网络传输距离,保证静态资源质 量。

最佳实践 2 CDN 加速 ECS 资源

(17)

配置步骤

1. 在CDN控制台添加加速域名

a. 登录华为云控制台,选择“所有服务 > CDN与智能边缘 > CDN”,进入CDN 管理控制台。

b. 单击左侧“域名管理”,进入域名管理页面。

c. 在域名管理页面单击“添加域名”。

d. 在“添加域名”弹框中配置域名及CDN加速等信息,参考添加CDN加速域 名。

加速域名:此处以download.game-apk1.com为例。

服务范围:根据您的业务需要选择服务范围。

业务类型:实际业务结合应用场景选择合适的业务类型。

源站类型:选择源站IP或源站域名。

e. 单击确定,完成域名添加。

最佳实践 2 CDN 加速 ECS 资源

(18)

说明

配置过程大概需要5-10分钟,当“状态”为“已开启”时,表示域名添加成功 2. 添加加速域名后,为保证顺利切换不影响业务,建议先做测试再切换DNS解析,

测试流程请参考本地测试加速域名。

3. 配置CNAME

添加加速域名后,CDN会自动生成一条CNAME域名。加速域名在CDN服务中获得 的CNAME域名不能直接访问,必须在加速域名的域名服务商处配置CNAME记 录,将加速域名指向CNAME域名,访问加速域名的请求才能转发到CDN节点上,

达到加速效果。本实践中自动生成的CNAME域名为“download.game-

apk1.com.c.cdnhwc1.com”。不同DNS服务商的CNAME配置方式不同,此处以 华为云云解析服务为例。其他DNS服务商的CNAME配置方法可参考配置CNAME 域名解析。

a. 登录华为云控制台,在控制台首页选择“网络 > 云解析服务DNS”,进入云 解析服务页面。

b. 在左侧菜单栏中,选择“域名解析 > 公网解析”,进入公网域名列表页面。

c. 在待添加记录集的域名所在行,单击“域名”列的域名名称。本实践中对应 的域名为“game-apk1.com.”。

d. 单击“game-apk1.com”,进入域名解析页面,然后单击右上角“添加记录 集”,进入“添加记录集”弹出框。

最佳实践 2 CDN 加速 ECS 资源

(19)

e. 根据界面提示填写参数配置,下表中未提到的参数可保持默认值。

参数 说明 示例

主机记录 主机记录指域名前缀。 本示例填写:

download 类型 记录集的类型,此处为CNAME

类型。

CNAME-将域名指向另 外一个域名

别名 用于是否将此记录集关联至云服

务资源实例。 否

线路类型 用于DNS服务器在解析域名时,

根据访问者的来源,返回对应的 服务器IP地址。

添加解析线路类型时,切记先添 加默认线路类型,以保证网站可 访问。

全网默认

TTL(秒) TTL指解析记录在本地DNS服务 器的有效缓存时间。如果您的服 务地址经常更换,建议TTL值设 置相对小些,反之,建议设置相 对大些。

默认为“5分钟”,即 300s。

最佳实践 2 CDN 加速 ECS 资源

(20)

参数 说明 示例

值 需指向的域名。

如果没有开启CDN加速,该值为 ECS访问域名;如果开启CDN加 速后,该值为CDN分配的 CNAME域名。

download.game- apk1.com.c.cdnhwc1.c om

f. 单击“确定”,完成添加。

g. 验证CNAME配置是否生效。

打开Windows操作系统中的cmd程序,输入如下指令:

nslookup -qt=cname 加速域名

本实践中加速域名为“download.game-apk1.com”。如果回显CDN分配的 CNAME域名,则表示CNAME配置已经生效。

最佳实践 2 CDN 加速 ECS 资源

(21)

3 CDN 加速 WAF 防护资源

前提条件

● 已经按照域名准入要求准备好需要接入的域名和华为云账号。

● 已购买WAF。

● 已开通CDN服务。

背景信息

CDN是构建在现有互联网基础之上的一层智能虚拟网络,通过在网络各处部署节点服 务器,实现将源站内容分发至所有CDN节点,使用户可以就近获得所需的内容,所以 接入CDN的网站都能有比较快的响应速度。

Web应用防火墙(WAF:Web Application Firewall),通过对HTTP(S)请求进行检 测,识别并阻断SQL注入、跨站脚本攻击、网页木马上传、命令/代码注入、文件包 含、敏感文件访问、第三方应用漏洞攻击、CC攻击、恶意爬虫扫描、跨站请求伪造等 攻击,保护Web服务安全稳定。

如果您的网站对安全性能要求比较高,同时又有加速的需求,可以使用华为云CDN联 动WAF配置,实现加速的同时防护Web攻击。

CDN+WAF 的配置原理

CDN+WAF联动的业务流向为:CDN>WAF>源站,流量由CDN转发到WAF,WAF再将 流量转到源站,实现网站加速、流量检测和攻击拦截。

配置场景

本文配置以您的WAF在华为云为例,为您介绍开通CDN+WAF联动部署。如果您的 WAF在其它云服务,请参考本文完成配置。

场景1:已购买WAF并添加防护域名,配置CDN+WAF联动

如果您已经将域名接入WAF防御,要配置CDN+WAF联动,您需要先将WAF域名基本 信息中的“是否已使用代理”修改为“是”,WAF才能够针对真实源IP进行安全策略

最佳实践 3 CDN 加速 WAF 防护资源

(22)

防御;然后在CDN侧添加加速域名,将WAF的CNAME作为CDN的源站,CDN才能将 流量转发给WAF,实现加速和Web攻击防御联动。

使用限制:

● CDN的加速域名仅支持默认端口,以非标端口的方式接入WAF的防护域名将无法 接入CDN。

● 如果您在WAF侧为防护域名配置了HTTPS证书,请同步在CDN侧完成证书配置,

否则会导致域名无法访问。

操作步骤

1. 根据修改WAF防护域名基本信息指导修改防护域名的代理设置。

– 是否已使用代理:是

2. 复制WAF的CNAME。

3. 在CDN侧添加加速域名(即WAF的防护域名)

a. 登录华为云控制台,在控制台首页左上角选择“服务列表>CDN与智能边缘 >

CDN”,进入CDN控制台。

b. 在左侧导航栏选择“域名管理”,进入域名管理页面。

c. 在域名管理界面,单击“添加域名”,在弹出的对话框中配置域名参数。

源站类型:源站域名,在下方输入WAF的CNAME域名。

最佳实践 3 CDN 加速 WAF 防护资源

(23)

d. 单击“确定”完成域名的添加,CDN会为加速域名生成专属CNAME。

说明

● 如果您的WAF是独享模式,需要使用“源站IP”接入CDN,“源站”文本框中请输入 为弹性负载均衡绑定弹性公网IP。

● 如果您的WAF是ELB模式,需要使用“源站IP”接入CDN,“源站”文本框中请输入 WAF实例绑定ELB的弹性公网IP。

4. (可选)添加加速域名后,为保证顺利切换不影响业务,建议先做测试再切换 DNS解析,请参考本地测试加速域名。

5. 在DNS域名服务商处修改解析记录,配置CDN提供的CNAME,详情请参见配置 CNAME。

6. 验证CNAME是否生效。

打开Windows操作系统中的cmd程序,输入如下指令:

nslookup -qt=cname 加速域名

如果回显CNAME,则表示CNAME配置已经生效,如下图:

说明

如果您暂未使用CDN和WAF,也建议您按照场景1的方式先接入WAF,再配置联动。

场景2:加速域名已经接入CDN加速,配置CDN+WAF联动

如果您的域名已经接入CDN加速,现在需要配置CDN+WAF联动,您需要先在WAF添 加防护域名,“是否已使用代理”选项选择“是”,WAF才能够针对真实源IP进行安 全防御;然后将CDN侧加速域名的源站修改WAF的CNAME,CDN才能将流量转发给 WAF,实现加速和Web攻击防御联动。

使用限制:

如果您在CDN侧为加速域名配置了HTTPS证书,请同步在WAF侧完成证书配置,否则 会导致域名无法访问。

操作步骤

1. 将网站信息(源站服务器的IP、端口等信息)添加到WAF。配置要点如下。

– 非标准端口:去勾选。

– 是否已使用代理:是。

最佳实践 3 CDN 加速 WAF 防护资源

(24)

2. 配置完成后,WAF会为该域名生成一个专属的CNAME。

说明

建议您在配置好WAF后先验证业务是否正常,再修改CDN源站。

3. 将CDN加速域名的源站地址修改为WAF的CNAME域名。

a. 登录华为云控制台,在控制台首页中选择“CDN与智能边缘 > CDN”,进入 CDN控制台。

b. 在左侧菜单栏中,选择“域名管理”。

c. 在域名列表中,单击需要修改的域名或域名所在行的“设置”,进入域名配 置页面。

d. 选择“基本配置”页签。

e. 在源站配置模块,单击“编辑”,系统弹出“修改源站信息”对话框。

类型:源站域名。

源站:填写WAF生成的CNAME域名。

回源端口:默认端口。

最佳实践 3 CDN 加速 WAF 防护资源

(25)

说明

● 如果您的WAF是独享模式,需要使用“源站IP”接入CDN,“源站”文本框中请 输入为弹性负载均衡绑定弹性公网IP。

● 如果您的WAF是ELB模式,需要使用“源站IP”接入CDN,“源站”文本框中请 输入WAF实例绑定ELB的弹性公网IP。

完成以上配置后,流量经过CDN转发到WAF,达到加速和Web攻击防护的目的。

最佳实践 3 CDN 加速 WAF 防护资源

(26)

4 如何设置缓存过期时间

CDN加速的本质是缓存加速,把源站资源缓存在遍布全球的节点上,用户可以就近从 边缘节点获取资源,从而达到加速的效果。CDN控制台可以设置源站资源在节点上缓 存的时间,方便您根据业务需要对不同的文件设置相应的缓存过期时间。

源站对 CDN 节点缓存的影响

1. 源站设置了缓存过期时间

– 源站设置了no-cache、private、no-store,CDN侧同时开启了“缓存遵循源 站”功能:CDN节点不缓存源站资源,用户每次访问都需要回源,无法达到 加速的目的。

说明

CDN默认关闭“缓存遵循源站”功能。

– 设置了其它缓存过期时间:CDN控制台默认或者新设置的缓存过期时间会覆 盖源站的缓存过期时间。

2. 源站未设置缓存过期时间

– 遵循CDN控制台默认或者新设置的缓存过期时间。

根据业务类型设置缓存过期时间

CDN默认缓存过期时间:

1. 业务类型选择的是网站加速、文件下载加速或点播加速,且源站类型为源站IP或 源站域名的加速域名,会有两条默认缓存规则。

– 常规动态文件(如: .php .jsp .asp .aspx)默认缓存过期时间为0,对此类动 态文件请求会直接回源,此默认规则允许修改和删除。

– 除常规动态文件外的其他“所有文件”默认缓存过期时间30天,允许修改,

不允许删除。

2. 若您在添加域名里源站类型选择的是“OBS桶”,会有一条默认缓存规则。

– 默认有“所有文件”默认缓存过期时间30天,允许修改,不允许删除。

说明

所有文件默认缓存30天,此规则允许修改但不允许删除。您可以将自定义缓存规则设 置为更高优先级(数值更大),该自定义规则将会被优先匹配。

最佳实践 4 如何设置缓存过期时间

(27)

3. 业务类型为全站加速时,默认有“所有文件”、缓存过期时间为“0”的缓存规 则,允许修改和删除。

您可以根据业务类型配置缓存过期时间:

● 网站加速类型,建议设置缓存过期时间:

a. 对php、aspx、asp、 jsp、 do、 dwr、cgi、 fcgi、action、ashx、axd、

json等动态文件不缓存。

b. 对以shtml、html、htm、js结尾的文件,建议缓存7天。

c. 其他静态文件建议缓存30天。

● 下载加速类型,建议设置缓存过期时间:

a. 对php、aspx、asp、jsp、do等动态文件不缓存。

b. 对7z、apk、 wdf、 cab、 dhp、exe、flv、gz、ipa、iso、mpk、MPQ、

pbcv、pxl、qnp、r00、rar、xy、xy2、zip、CAB等文件缓存30天。

● 视频点播加速类型,建议设置缓存过期时间:

a. 对php、aspx、asp、jsp、do等动态文件不缓存。

b. 对mwv、html、htm、shtml、hml、gif、swf、png、bmp、js等缓存7天。

c. 对MP3、wma、7z、apk、 wdf、 cab、 dhp、exe、flv、gz、ipa、iso、

mpk、MPQ、pbcv、pxl、qnp、r00、rar、xy、xy2、zip、CAB等文件缓存 30天。

操作步骤

1. 登录华为云控制台,在控制台首页中选择“CDN与智能边缘 > CDN”,进入CDN 控制台。

2. 在左侧菜单栏中,选择“域名管理”。

3. 在域名列表中,单击需要修改的域名或域名所在行的“设置”,进入域名配置页 面。

4. 选择“缓存配置”页签。

5. 在缓存规则模块,单击“编辑”,系统弹出“配置缓存策略”对话框。

6. 单击“添加”,根据业务需求配置缓存策略,如图4-1所示。具体配置参数说明如 表4-1所示。

4-1 配置缓存策略

最佳实践 4 如何设置缓存过期时间

(28)

4-1 缓存策略配置参数

参数 说明 配置规则

所有文

件 设置CDN节点所有缓存资源的过

期时间。 对于新添加的加速域名,CDN默

认添加一条“所有文件”缓存过 期时间为30天的规则,此默认规 则允许修改,不允许删除。

文件名 后缀

设置指定文件类型的缓存资源的 缓存规则。

对于新添加的业务类型为网站加 速、文件下载加速和点播加速,

且源站为自有源站的加速域名,

CDN默认添加一条常规动态文件

(如.php .jsp .asp .aspx)缓存 过期时间为0的规则,对此类动 态文件请求会直接回源。此默认 规则允许修改和删除。

● 支持所有格式的文件类型。

● 输入首字符为“.”,以“;”

进行分隔。

● 字符总数不能超过255。

● 输入的文件后缀名总数不能超 过20个。

● 文件名后缀英文字符支持大写 和小写。

示例:.JPG;.zip;.exe。

目录路 径

设置某一指定路径下的缓存资源

的缓存规则。 输入要求以“/”作为首字符,以

“;”进行分隔,输入的目录路径 总数不能超过20个,且字符总数 不能超过255。

示例:/test/folder01;/test/

folder02。

全路径 设置完整路径下某一文件的缓存

规则。 输入要求以“/”作为首字符,

"*"不能在结尾。支持匹配指定目 录下的具体文件或者带通配符

"*"的文件。单条全路径缓存规则 里仅支持配置一个全路径。

示例:如/test/index.html或/

test/*.jpg

首页 设置根目录缓存规则 网站的根目录就是网站的顶层文 件目录,目录下放着网站所有的 子文件夹。

示例:以目录“abc/

file01/2.png”为例,“abc/”就 是根目录,缓存首页就是对

“abc/”设置缓存规则。

优先级 缓存规则的优先级。

优先级设置具有唯一性,不支持 多条缓存规则设置同一优先级,

且优先级不能输入为空。多条缓 存规则下,不同缓存规则中的相 同资源内容,CDN按照优先级高 的缓存规则执行缓存内容过期。

取值为1~100之间的整数,数值 越大优先级越高。

最佳实践 4 如何设置缓存过期时间

(29)

参数 说明 配置规则 缓存过

期时间

达到设置的缓存过期时间后,当 用户向CDN节点请求资源时,

CDN会直接回源站请求对应的最 新资源返回给用户,并缓存到 CDN节点中。

时间设置不能超过365天,建议 参考如下规则进行配置:

● 对于不经常更新的静态文件

(如.jpg、.zip等),建议将缓 存过期时间设置成1个月以 上。

● 对于频繁更新的静态文件(如 js、css等),请根据实际业务 情况设定。

● 对于动态文件(如php、jsp、

asp等),建议设置成0秒,回 源获取。

7. (可选)通过单击缓存规则所在行的“删除”,删除不需要的缓存规则。

8. 单击“确定”,完成缓存规则配置。

说明

如果您修改了缓存规则:

新的规则仅对后面缓存的资源生效,已经缓存的资源需要等缓存过期后,再次缓存才

会遵循新的缓存规则。

如果您想要立即生效,请在修改缓存规则后执行缓存刷新操作。

配置示例

配置场景1:有一个门户网站,配置了华为云CDN加速,客户希望不缓存首页 需要在CDN控制台增加一条类型为“首页”,缓存过期时间为“0”的规则。

配置场景2:设置某个类型的文件或者某个页面不缓存

1. 某客户配置了CDN加速,设置了对“.do”格式的文件缓存1天,由于业务需求,

需要对“.do”格式的文件不缓存。

需要在CDN控制台增加一条文件名后缀为“.do”的缓存规则,缓存过期时间设置 为“0”。

最佳实践 4 如何设置缓存过期时间

(30)

说明

新规则仅对后续资源缓存生效,新规则配置完成后,建议您刷新“.do”文件所在的URL或 者目录,新规则才可以对所有“.do”文件生效。

2. 某客户配置了CDN加速,发现登录界面无限循环,无法登录,停用CDN加速后,

可以正常登录。

这是因为CDN节点缓存了登录界面导致的,需要在控制台增加一条针对登录界面 的缓存规则,缓存过期时间设置为“0”。以华为云控制台登录界面为例,华为云 控制台的登录页面为“https://auth.huaweicloud.com/authui/login.html#/

login”,在控制台增加一条全路径:/authui/login.html#/login,缓存过期时间 为“0”的缓存规则。

配置场景3:某客户加速域名www.example.com设置了如下图的缓存规则,不知道哪 一个规则生效。

用户访问www.example.com/test/cdn.jpg,虽然所有文件、文件名后缀、全路径三条 规则都匹配到了,但是由于全路径的优先级为8,在三条规则里优先级最高,所以系统 最终匹配全路径/test/*.jpg这条规则。

最佳实践 4 如何设置缓存过期时间

(31)

5 如何提高缓存命中率

背景信息

CDN缓存命中率低,会导致源站压力大,静态资源访问效率低。您可以针对导致CDN 缓存命中率低的具体原因,选择对应的优化策略,来提高CDN的缓存命中率。CDN缓 存命中率包括流量命中率和请求命中率。

● 流量命中率 = 命中缓存产生的流量 / 请求总流量

● 请求命中率 = 命中缓存的请求数 / 请求总数 说明

流量命中率越低,回源流量越大,源站的流出流量越大,源站带宽资源占用越大,其代表 了源站服务器收到的负载压力,请重点关注流量命中率。

查看缓存命中率

您可以登录CDN控制台查看流量命中率和请求命中率。

1. 登录华为云控制台,在控制台首页中选择“CDN与智能边缘 > CDN”,进入CDN 控制台。

2. 在左侧菜单栏中,选择“统计分析”。

3. 分别选择“使用量统计”和“访问情况统计”查看“流量命中率”和“请求命中 率”。

5-1 流量命中率

最佳实践 5 如何提高缓存命中率

(32)

5-2 请求命中率

优化缓存命中率

1. 合理设置缓存过期时间

CDN加速的本质是缓存加速,把源站资源缓存在遍布全球的节点上,用户可以就 近从边缘节点获取资源,从而达到加速的效果。您可以通过CDN控制台合理设置 缓存过期时间来提高缓存命中率,建议如下:

– 对于不经常更新的静态文件(如图片类型、应用下载类型等),建议您将缓 存时间设置为1个月以上。

– 对于频繁更新的静态文件(如JS、CSS等),您可以根据实际业务情况设置。

– 对于动态文件(如PHP、JSP、ASP等),建议您将缓存时间设置为0,即不缓 存。

详细的设置步骤和注意事项请见如何设置缓存过期时间。

说明

● 如果源站设置了s-maxage=0、max-age=0、no-cache、no-store、private,CDN侧同 时开启了“缓存遵循源站”功能(此功能默认关闭),CDN节点将无法缓存源站资 源,导致频繁回源。

● 如果您的源站有多个主机,某个相同的资源在多个主机中的Last-modified、Etag、

Content-Length不一致,CDN节点将无法缓存该资源,导致重复回源。

● 如果源站资源更新,请刷新资源对应的URL,以保证用户可以获得最新的资源。

● 如果您修改了缓存规则:

新的规则仅对后面缓存的资源生效,已经缓存的资源需要等缓存过期后,再次缓

存才会遵循新的缓存规则。

如果您想要立即生效,请在修改缓存规则后执行缓存刷新操作。

2. 开启过滤URL参数

目前大多数的网页请求都携带URL参数信息,参数以“?”开始,如果参数没有 包含重要信息(如版本信息等),是否携带该参数访问不会影响用户获得正确的 资源,可以选择开启“忽略URL参数”功能,提高缓存命中率,提升分发效率,

详见URL参数。

典型应用:

– 终端用户首次访问URL“http://www.example.com/1.txt?test1”时,CDN无 缓存,回源请求资源;第二次访问“http://www.example.com/1.txt?test2”

时,由于开通了“忽略URL参数”功能,所以“?”之后的参数不匹配,直接 命中缓存“http://www.example.com/1.txt”。

– 终端用户首次访问URL“http://www.example.com/1.txt?test1”时,CDN无 缓存,回源请求资源;第二次访问“http://www.example.com/1.txt?test2”

时,由于没有开通“忽略URL参数”功能,所以“?”之后的参数也需要匹 配,要重新回源请求“http://www.example.com/1.txt?test2”。

最佳实践 5 如何提高缓存命中率

(33)

3. 预热URL

CDN可以通过缓存预热将源站资源主动缓存到CDN节点,用户访问时就能直接从 CDN节点获取到最新的资源,详见缓存预热。

当您的域名初次接入CDN加速、活动发布时您可以将源站资源预热到CDN节点,

用户访问资源时直接从CDN节点获取,从而提升CDN的缓存命中率。

典型场景:

– 初次接入CDN:域名初次接入CDN时,节点暂未缓存源站资源,此时,您可 以将源站资源预热至CDN节点。后续用户访问资源将直接从就近的CDN节点 获取资源,提升访问速度。

– 安装包发布:新版本安装包或是升级包发布前,提前将资源预热至CDN节 点。正式上线后,海量用户的下载请求将直接由全球加速节点响应,提升下 载速度的同时,大幅度降低源站压力。

– 运营活动:运营活动发布前,提前将活动页涉及到的静态资源预热至CDN节 点。活动开始后,用户访问中所有静态资源均由加速节点响应,海量带宽储 备保障用户服务可用性,提升用户体验。

4. 开启Range回源

Range回源是指源站在收到CDN节点回源请求时,根据HTTP请求头中的Range信 息返回指定范围的数据给CDN节点。Range回源能有效缩短大文件的分发时间,

提升回源效率,提高缓存命中率,详见Range回源。

典型场景:

– 未开通Range时,用户想观看指定片段的视频,而CDN回源时需要获取整个 视频,所以回源流量大于响应给用户的流量,从而造成缓存命中率降低。开 启Range回源后,CDN将分片回源获取资源返回给用户,从而提升缓存命中 率。

5. 其它

– 缓存资源需要更新时,尽量避免刷新目录

当源站某个资源更新时,一般需要通过刷新相应的URL来强制节点缓存资源 过期。刷新目录会将目录内所有的资源全部置为过期,用户下次访问时将无 法命中缓存,全部回源站请求资源,因此尽量避免刷新整个目录,尤其慎重 刷新根目录。

– 避免在URL中携带动态参数

如果您的URL中包含动态参数,如时间戳,CDN无法缓存该资源,导致频繁 回源。

判断 URL 是否命中缓存

1. 在浏览器Chrome上,按F12。

2. 选择“Network”。

3. 查看指定URL的响应头,查看头部信息,进行如下判断:

– 如果有“x-hcs-proxy-type”头部,值为“1”即命中缓存,值为“0”即未命 中缓存,不再查看其它头部;

– 如果无“x-hcs-proxy-type”头部,而有“X-Cache-Lookup”头部,值为

“Hit From MemCache”、“Hit From Disktank”或“Hit From

Upstream”即为命中缓存,其它值表示未命中缓存,不再查看其它头部;

– 如果同时无“x-hcs-proxy-type”、“X-Cache-Lookup”头部,有“age”头 部,则值大于“0”即命中缓存,值为“0”即未命中缓存。

最佳实践 5 如何提高缓存命中率

(34)

6 CDN 日志转存到 OBS

CDN记录了所有域名(包括已删除域名,如果您开通了企业项目,则已删除域名不支 持此功能)被网络用户访问的详细日志,您可以通过CDN控制台查看和下载最近30天 的日志,对您的业务资源被访问情况进行详细分析。

日志转存储服务是华为云CDN配合函数工作流,将CDN日志存储到OBS桶,可以帮助 您将日志存储更长的时间,便于您基于长时间的日志做出自定义的数据分析,有助于 您更好地了解您CDN的服务质量,以及您的终端客户的访问详情,提高您的业务决策 能力。

本文以Python3.6为例,为您介绍通过API创建FunctionGraph函数和Timer触发器,实 现定时将CDN日志转存到OBS。

前提条件

暂时仅支持日志转存到北京四的OBS桶,请您提前准备好位于北京四的OBS桶。

操作步骤

1. 创建委托

a. 登录华为云控制台,在左侧导航栏,选择“管理与监管>统一身份认证服 务”。

b. 在左侧导航栏,选择“委托”页签,单击右上方的“+ 创建委托”。

c. 在创建委托页面,按照如下参数设置委托。

委托名称:FG_TO_CDN。

委托类型:云服务。

云服务:函数工作流FunctionGraph。

持续时间:永久。

最佳实践 6 CDN 日志转存到 OBS

(35)

d. 单击“下一步”,进入为“FG_TO_CDN”委托配置权限界面。

权限选择:OBS OperateAccess 、CDN LogsReadOnlyAccess。

e. 单击“下一步”,配置作用范围。

作用范围:全局服务。

f. 单击“确认”,完成委托配置。

2. 准备函数工作流环境

a. 登录华为云控制台,在左侧导航栏,选择“计算>函数工作流”,region选择

“北京四”。

b. 单击右上方“创建函数”,进入创建函数界面。

选择模板:创建空白函数。

最佳实践 6 CDN 日志转存到 OBS

(36)

输入函数名称:cdn_to_obs(可自定义)。

所属应用:选择默认的“default”。

委托名称:选择已创建好的委托“FG_TO_CDN” 。

企业项目:选择“default”。

运行时语言:选择“Python 3.6”。

代码上传方式:选择“默认代码”。

c. 单击“创建函数”,进入代码编辑界面,将代码示例的代码内容贴入在线 IDE。

最佳实践 6 CDN 日志转存到 OBS

(37)

说明

如果有多个域名的日志需要转存,您需要分别为每个域名创建一个函数工作流。

d. 单击“配置”,进入函数配置界面。

执行超时时间:函数运行的超时时间,超时的函数将被强行停止,建议 设置为900。

说明

如果您发现转存的日志数量不对,请向“函数工作流”服务提工单,增大执行 超时时间。

url :https://cdn.myhuaweicloud.com/v1.0/cdn/logs(CDN日志下载的 url)。

domain_name :xxx.com(需要转存日志的CDN加速域名)。

obsAddress :xxx.com(用于存日志的OBS桶域名)。

destBucket :******(用于存日志的OBS桶名称)。

最佳实践 6 CDN 日志转存到 OBS

(38)

i. 单击右上方“保存”,完成设置。

e. 创建“触发器”。在函数配置界面选择“触发器”,单击右侧“创建触发 器”。

触发器类型:定时触发器 (TIMER)。

定时器名称:自定义的定时器名称,例如:Timer-0001。

触发规则:Cron表达式。

Cron表达式:0 0 8 * * ?(每天早上8点执行一次日志转存储)。

是否开启:开启。

i. 单击“确定”,完成定时触发器设置。

f. 创建测试事件。在函数配置界面,单击右上角“请选择测试事件”下拉框,

选择“配置测试事件”。

最佳实践 6 CDN 日志转存到 OBS

(39)

配置测试事件:创建新的测试事件。

事件模板:空白模板。

事件名称:test。

测试事件:{"message":"CDNLog-OBS"}。

i. 单击“保存”,完成测试事件创建。

g. 测试函数。在函数详情页面,单击右上角“请选择测试事件”下拉框,选择

“test”,单击“测试”。

3. 查看配置是否成功

a. 登录华为云控制台,在左侧导航栏,选择“存储>对象存储服务OBS”。

b. 单击您存储日志的桶,在左侧导航栏选择“对象”。

c. 访问路径:文件夹(桶名称)>文件夹(加速域名)>文件夹(日志日期)>日 志内容。

最佳实践 6 CDN 日志转存到 OBS

(40)

说明

● 当前代码示例仅支持转存当前时间前一日的日志,如果您需要转存日志的加速域名前一 日没有日志产生,则OBS桶侧不会产生相关文件。

● OBS桶将对转存到桶里的日志收费,具体收费规则请参考计费说明。

4. 停止日志转存服务

a. 登录华为云控制台,在左侧导航栏,选择“计算>函数工作流”,region选择

“北京四”。

b. 在左侧导航栏选择“函数”>“函数列表”,选中2中创建的函数名。

c. 在函数详情页选择“触发器”。

d. 单击“停用”,完成配置。

代码示例

代码如下所示:

# -*- coding:utf-8 -*- import requests import datetime import time import os import sys import json

from com.obs.client.obs_client import ObsClient from urllib.parse import urlparse

if sys.version_info.major == 2 or not sys.version > '3':

import httplib else:

import http.client as httplib

current_file_path = os.path.dirname(os.path.realpath(__file__))

# Adds the current path to search paths to import third-party libraries.

sys.path.append(current_file_path)

TEMP_ROOT_PATH = "/tmp/" # Downloads a file from OBS to this directory.

region = 'china' # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.

secure = True # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.

signature = 'v4' # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.

port = 443 # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.

path_style = True # This parameter does not need to be changed and will be used when FunctionGraph accesses OBS.

def handler(event, context):

logger = context.getLogger()

最佳实践 6 CDN 日志转存到 OBS

(41)

queryDate = context.getUserData('queryDate') if queryDate is None:

yesterday = datetime.date.today() + datetime.timedelta(-1) queryDate = yesterday.strftime("%Y-%m-%d")

timeStamp = int(time.mktime(yesterday.timetuple()) * 1000) else:

date = datetime.datetime.strptime(queryDate, "%Y-%m-%d") timeStamp = int(time.mktime(date.timetuple()) * 1000) pageSize = 20

pageNumber = 1

requests.packages.urllib3.disable_warnings()

start(context, queryDate, timeStamp, pageSize, pageNumber)

def start(context, queryDate, timeStamp, pageSize, pageNumber):

logger = context.getLogger() logUrl = context.getUserData('url')

domainName = context.getUserData('domain_name')

params = {'query_date': timeStamp, 'domain_name': domainName, 'page_size': pageSize, 'page_number': pageNumber, 'enterprise_project_id':'ALL'}

headers = {'Content-Type': 'application/json;charset=UTF-8', 'X-Auth-Token':

context.getToken()}

res = requests.get(logUrl, params=params, headers=headers, verify=False) if res.status_code != 200:

logger.info("query log urls: " + res.url + ", error: " + res.text) return ("query log urls: " + res.url + ", error: " + res.text) resJson = json.loads(res.text)

logger.info(res.text) total = resJson['total']

i = 0

for val in resJson['logs']:

i += 1

logger.info(val["link"]) url = urlparse(val["link"]) netlocs = url.netloc.split(":")

conn = httplib.HTTPConnection(netlocs[0], int(netlocs[1])) conn.request('GET', url.path + "?" + url.query)

objName = os.path.join(val["domain_name"], queryDate, val["name"]) put_content_to_obs(context, objName, conn.getresponse())

if pageSize * pageNumber < total:

start(context, queryDate, timeStamp, pageSize, pageNumber + 1)

def put_content_to_obs(context, objName, content):

ak = context.getAccessKey() sk = context.getSecretKey()

obsAddress = context.getUserData('obsAddress') destBucket = context.getUserData('destBucket')

TestObs = ObsClient(access_key_id=ak, secret_access_key=sk,

is_secure=secure, server=obsAddress, signature=signature, path_style=path_style, region=region,

ssl_verify=False, port=port, max_retry_count=5, timeout=20)

resp = TestObs.putContent(destBucket, objName, content=content) if resp.status < 300:

print('requestId:', resp.requestId)

最佳实践 6 CDN 日志转存到 OBS

(42)

else:

print('errorCode:', resp.errorCode) print('errorMessage:', resp.errorMessage)

最佳实践 6 CDN 日志转存到 OBS

(43)

7 获取客户端真实 IP

本章节介绍了不同类型的Web应用服务器(包括Tomcat、Apache、Nginx、IIS 6和IIS 7)如何获取客户端的真实IP。

背景信息

网站接入CDN加速后,源站服务器端从IP头部获取的用户访问IP不是客户端的真实IP。

当您因为业务需要获取客户端真实IP时,可以通过配置网站服务器获取客户端的真实 IP。

代理服务器(CDN、WAF等)在把用户的HTTP、WebSocket、WSS请求转到下一环节 的服务器时,会在头部中加入一条“X-Forwarded-For”记录,用来记录用户的真实 IP,其形式为“X-Forwarded-For:客户端的真实IP,代理服务器1-IP, 代理服务器2- IP,代理服务器3-IP,……”。

因此,您可以通过获取“X-Forwarded-For”对应的第一个IP来得到客户端的真实IP。

Nginx 如何在访问日志中获取客户端真实 IP

如果您的源站部署了Nginx反向代理,可通过在Nginx反向代理配置Location信息,后 端Web服务器即可通过类似函数获取客户的真实IP地址。

1. 根据源站Nginx反向代理的配置,在Nginx反向代理的相应location位置配置如下 内容,获取客户IP的信息。

Location ^ /<uri> { proxy_pass ....;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

2. 后端Web服务器通过类似函数获取客户的真实IP。

request.getAttribute("X-Forwarded-For")

Tomcat 如何在访问日志中获取客户端真实 IP

如果您的源站部署了Tomcat服务器,可通过启用Tomcat的X-Forwarded-For功能,获 取客户端的真实IP地址。

1. 打开“server.xml”文件(“tomcat/conf/server.xml”),AccessLogValve日志 记录功能部分内容如下:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log." suffix=".txt"

pattern="%h %l %u %t "%r" %s %b"/>

最佳实践 7 获取客户端真实 IP

(44)

2. 在pattern中增加“%{X-Forwarded-For}i”,修改后的server.xml为:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log." suffix=".txt"

pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" />

</Host>

3. 查看“localhost_access_log”日志文件,可获取X-Forwarded-For对应的访问者 真实IP。

Apache 如何在访问日志中获取客户端真实 IP

如果您的源站部署了Apache服务器,可通过运行命令安装Apache的第三方模块 mod_rpaf,并修改“http.conf”文件获取客户IP地址。

1. 执行以下命令安装Apache的一个第三方模块mod_rpaf。

wget https://github.com/gnif/mod_rpaf/archive/v0.6.0.tar.gz tar xvfz mod_rpaf-0.6.tar.gz

cd mod_rpaf-0.6

/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

2. 打开“httpd.conf”配置文件,并将文件内容修改为如下内容:

LoadModule rpaf_module modules/mod_rpaf-2.0.so ##加载mod_rpaf模块

<IfModule mod_rpaf.c>

RPAFenable On RPAFsethostname On

RPAFproxy_ips 127.0.0.1 <反向代理IPs>

RPAFheader X-Forwarded-For

</IfModule>

3. 定义日志格式。

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

common

4. 启用自定义格式日志。

CustomLog "/[apache目录]/logs/$access.log" common

5. 重启Apache,使配置生效。

/[apached目录]/httpd/bin/apachectl restart

6. 查看“access.log”日志文件,可获取X-Forwarded-For对应的客户端真实IP。

IIS 6 如何在访问日志中获取客户端真实 IP

如果您的源站部署了IIS 6服务器,您可以通过安装“F5XForwardedFor.dll”插件,从 IIS 6服务器记录的访问日志中获取客户端真实的IP地址。

1. 下载F5XForwardedFor模块。

2. 根据您服务器的操作系统版本将“x86\Release”或者“x64\Release”目录中的

“F5XForwardedFor.dll”文件拷贝至指定目录(例如,“C:\ISAPIFilters”),同 时确保IIS进程对该目录有读取权限。

3. 打开IIS管理器,找到当前开启的网站,在该网站上右键选择“属性”,打开“属 性”页面。

4. 在“属性”页面,切换至“ISAPI筛选器”,单击“添加”,在弹出的窗口中,配 置如下信息:

– “筛选器名称”:“F5XForwardedFor”;

– “可执行文件”:“F5XForwardedFor.dll”的完整路径,例如:“C:

\ISAPIFilters\F5XForwardedFor.dll”

5. 单击“确定”,重启IIS 6服务器。

最佳实践 7 获取客户端真实 IP

(45)

6. 查看IIS 6服务器记录的访问日志(默认的日志路径为:“C:\WINDOWS

\system32\LogFiles\ ”,IIS日志的文件名称以“.log”为后缀),可获取X- Forwarded-For对应的客户端真实IP。

IIS 7 如何在访问日志中获取客户端真实 IP

如果您的源站部署了IIS 7服务器,您可以通过安装“F5XForwardedFor”模块,从IIS 7服务器记录的访问日志中获取客户端真实的IP地址。

1. 下载F5XForwardedFor模块。

2. 根据服务器的操作系统版本将“x86\Release”或者“x64\Release”目录中的

“F5XFFHttpModule.dll”和“F5XFFHttpModule.ini”文件拷贝到指定目录(例 如,“C:\x_forwarded_for\x86”或“C:\x_forwarded_for\x64”),并确保IIS进 程对该目录有读取权限。

3. 在IIS服务器的选择项中,双击“模块”,进入“模块”界面。

4. 单击“配置本机模块”,在弹出的对话框中,单击“注册”。

5. 在弹出的对话框中,按操作系统注册已下载的DLL文件后,单击“确定”。

– x86操作系统:注册模块“x_forwarded_for_x86”

名称:x_forwarded_for_x86

路径:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”

– x64操作系统:注册模块“x_forwarded_for_x64”

名称:x_forwarded_for_x64

路径:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”

最佳实践 7 获取客户端真实 IP

(46)

6. 注册完成后,勾选新注册的模块(“x_forwarded_for_x86”或

“x_forwarded_for_x64”)并单击“确定”。

7. 在“ISAPI和CGI限制”中,按操作系统添加已注册的DLL文件,并将其“限制”改 为“允许”。

– x86操作系统:

ISAPI或CGI路径:“C:\x_forwarded_for\x86\F5XFFHttpModule.dll”

描述:x86

– x64操作系统:

ISAPI或CGI路径:“C:\x_forwarded_for\x64\F5XFFHttpModule.dll”

描述:x64

8. 重启IIS 7服务器,等待配置生效。

9. 查看IIS 7服务器记录的访问日志(默认的日志路径为:“C:\WINDOWS

\system32\LogFiles\ ”,IIS日志的文件名称以“.log”为后缀),可获取X- Forwarded-For对应的客户端真实IP。

最佳实践 7 获取客户端真实 IP

(47)

A 修订记录

发布日期 修订记录

2021-12-28 第九次正式发布。

本次更新说明如下:

● 更新“如何提高缓存命中率”章节。

2021-09-08 第八次正式发布。

本次更新说明如下:

● 更新“CDN日志转存到OBS”代码示 例。

2021-06-18 第七次正式发布。

本次更新说明如下:

● 新增“获取客户端真实IP”

2021-04-28 第六次正式发布。

本次更新说明如下:

● 新增“CDN日志转存到OBS”

2021-04-21 第五次正式发布。

本次更新说明如下:

● 新增“如何提高缓存命中率”

2021-04-02 第四次正式发布。

本次更新说明如下:

● 新增“CDN加速ECS资源”

2021-03-19 第三次正式发布。

本次更新说明如下:

● 更新“CDN加速OBS桶文件”

● 新增“如何设置缓存过期时间”

最佳实践 A 修订记录

(48)

发布日期 修订记录

2020-04-15 第二次正式发布。

本次更新说明如下:

● 更新操作步骤

● 优化相关描述

2019-06-27 第一次正式发布。

最佳实践 A 修订记录

數據

表 4-1 缓存策略配置参数 参数 说明 配置规则 所有文 件 设置CDN节点所有缓存资源的过期时间。 对于新添加的加速域名,CDN默认添加一条“所有文件”缓存过 期时间为30天的规则,此默认规 则允许修改,不允许删除。 文件名 后缀 设置指定文件类型的缓存资源的缓存规则。 对于新添加的业务类型为网站加 速、文件下载加速和点播加速, 且源站为自有源站的加速域名, CDN默认添加一条常规动态文件 (如.php .jsp .asp .aspx)缓存 过期时间为0的规则,对此类动 态文件请求会直接回源。此默认 规

參考文獻

相關文件

The transfer will probably be chunked (HTTP v1.1). When the sheet is done, the scanner will decrement SideCount, increment SideNumber and transition to Pending because

Affidavit: after extending the employment permit, the same construction project will not be used to apply for introduction or renewal of employment of foreigners. (see

In Section 3, the shift and scale argument from [2] is applied to show how each quantitative Landis theorem follows from the corresponding order-of-vanishing estimate.. A number

6. To complete the ‘What’s Not’ column, students need to think about what used to be considered a fashionable thing to do, see, listen to, talk about and is no longer

While we have provided a number of ideas and strategies, we hope that this book will be a useful guide and resource to stimulate teachers’ own ideas and variations, and will

Now, nearly all of the current flows through wire S since it has a much lower resistance than the light bulb. The light bulb does not glow because the current flowing through it

b) Less pressure on prevention and reduction measures c) No need to be anxious about the possible loss.. Those risks that have not been identified and taken care of in the

• When this happens, the option price corresponding to the maximum or minimum variance will be used during backward induction... Numerical