CDN
最佳实践
文档版本 05
发布日期 2022-02-23
版权所有 © 华为技术有限公司 2022。 保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。
商标声明
和其他华为商标均为华为技术有限公司的商标。
本文档提及的其他所有商标或注册商标,由各自的所有人拥有。
注意
您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。
由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。
目 录
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
最佳实践 目 录
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 桶文件
方案优势
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 桶文件
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 桶文件
▪
业务类型:实际业务结合应用场景选择合适的业务类型。▪
服务范围:根据您的业务需要选择服务范围。▪
源站类型:选择“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 桶文件
e. 根据界面提示填写参数配置,下表中未提到的参数可保持默认值。
参数 说明 示例
主机记录 主机记录指域名前缀。 本示例填写:
download 类型 记录集的类型,此处为CNAME
类型。
CNAME-将域名指向另 外一个域名
别名 用于是否将此记录集关联至云服
务资源实例。 否
线路类型 用于DNS服务器在解析域名时,
根据访问者的来源,返回对应的 服务器IP地址。
添加解析线路类型时,切记先添 加默认线路类型,以保证网站可 访问。
全网默认
TTL(秒) TTL指解析记录在本地DNS服务 器的有效缓存时间。如果您的服 务地址经常更换,建议TTL值设 置相对小些,反之,建议设置相 对大些。
默认为“5分钟”,即 300s。
最佳实践 1 CDN 加速 OBS 桶文件
参数 说明 示例
值 需指向的域名。
如果没有开启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 桶文件
数据准备
准备项 说明 示例
网站域名 游戏网站域名。如果您的
加速范围是“中国大陆”
或者“全球”,根据中国
《互联网管理条例》的要 求,此域名必须在工信部 备案并在有效期内才可以 使用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 桶文件
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 桶文件
方式不同,此处以华为云云解析服务为例。其他DNS服务商的CNAME配置方法可 参考配置CNAME域名解析。
a. 登录华为云控制台,在控制台首页选择“网络 > 云解析服务DNS”,进入云 解析服务页面。
b. 在左侧菜单栏中,选择“域名解析 > 公网解析”,进入公网域名列表页面。
c. 在待添加记录集的域名所在行,单击“域名”列的域名名称。本实践中对应 的域名为“game-apk1.com.”。
d. 单击“game-apk1.com”,进入域名解析页面,然后单击右上角“添加记录 集”,进入“添加记录集”弹出框。
e. 根据界面提示填写参数配置,下表中未提到的参数可保持默认值
参数 说明 示例
主机记录 主机记录指域名前缀。 本示例填写:
download
最佳实践 1 CDN 加速 OBS 桶文件
参数 说明 示例 类型 记录集的类型,此处为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 桶文件
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 桶文件
6. 其他云对象存储响应华为CDN的文件请求
7. 华为CDN将文件内容返回给客户端,当下次客户端请求同样的文件时,华为CDN 直接回源到OBS获取。
说明
“数据回源”功能是被动触发式,即只有向OBS发起请求后OBS才会到设置的源站将数据拉取过 来,所以当一个新文件上传到其他云对象存储后,建议业务应用程序向OBS触发一个GET请求来 请求数据(发起GET请求后可关闭连接,无需接收实体数据)。另外该架构会在其他云对象存储 侧产生两份数据流量(针对同一个文件,CDN拉取一次,OBS拉取一次)。
Serverless 触发式上传
不改变原有的上传逻辑,当文件上传到其他云对象存储后,触发函数计算服务,通过 Serverless方式将文件同步到华为云OBS,架构如下:
图1-1 Serverless 触发式上传
该架构需要客户在其他云启用函数计算服务并部署上传文件到OBS的代码,会产生函 数计算服务的费用。
最佳实践 1 CDN 加速 OBS 桶文件
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 资源
配置步骤
1. 在CDN控制台添加加速域名
a. 登录华为云控制台,选择“所有服务 > CDN与智能边缘 > CDN”,进入CDN 管理控制台。
b. 单击左侧“域名管理”,进入域名管理页面。
c. 在域名管理页面单击“添加域名”。
d. 在“添加域名”弹框中配置域名及CDN加速等信息,参考添加CDN加速域 名。
▪
加速域名:此处以download.game-apk1.com为例。▪
服务范围:根据您的业务需要选择服务范围。▪
业务类型:实际业务结合应用场景选择合适的业务类型。▪
源站类型:选择源站IP或源站域名。e. 单击确定,完成域名添加。
最佳实践 2 CDN 加速 ECS 资源
说明
配置过程大概需要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 资源
e. 根据界面提示填写参数配置,下表中未提到的参数可保持默认值。
参数 说明 示例
主机记录 主机记录指域名前缀。 本示例填写:
download 类型 记录集的类型,此处为CNAME
类型。
CNAME-将域名指向另 外一个域名
别名 用于是否将此记录集关联至云服
务资源实例。 否
线路类型 用于DNS服务器在解析域名时,
根据访问者的来源,返回对应的 服务器IP地址。
添加解析线路类型时,切记先添 加默认线路类型,以保证网站可 访问。
全网默认
TTL(秒) TTL指解析记录在本地DNS服务 器的有效缓存时间。如果您的服 务地址经常更换,建议TTL值设 置相对小些,反之,建议设置相 对大些。
默认为“5分钟”,即 300s。
最佳实践 2 CDN 加速 ECS 资源
参数 说明 示例
值 需指向的域名。
如果没有开启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 资源
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 防护资源
防御;然后在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 防护资源
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 防护资源
2. 配置完成后,WAF会为该域名生成一个专属的CNAME。
说明
建议您在配置好WAF后先验证业务是否正常,再修改CDN源站。
3. 将CDN加速域名的源站地址修改为WAF的CNAME域名。
a. 登录华为云控制台,在控制台首页中选择“CDN与智能边缘 > CDN”,进入 CDN控制台。
b. 在左侧菜单栏中,选择“域名管理”。
c. 在域名列表中,单击需要修改的域名或域名所在行的“设置”,进入域名配 置页面。
d. 选择“基本配置”页签。
e. 在源站配置模块,单击“编辑”,系统弹出“修改源站信息”对话框。
▪
类型:源站域名。▪
源站:填写WAF生成的CNAME域名。▪
回源端口:默认端口。最佳实践 3 CDN 加速 WAF 防护资源
说明
● 如果您的WAF是独享模式,需要使用“源站IP”接入CDN,“源站”文本框中请 输入为弹性负载均衡绑定弹性公网IP。
● 如果您的WAF是ELB模式,需要使用“源站IP”接入CDN,“源站”文本框中请 输入WAF实例绑定ELB的弹性公网IP。
完成以上配置后,流量经过CDN转发到WAF,达到加速和Web攻击防护的目的。
最佳实践 3 CDN 加速 WAF 防护资源
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 如何设置缓存过期时间
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 如何设置缓存过期时间
表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 如何设置缓存过期时间
参数 说明 配置规则 缓存过
期时间
达到设置的缓存过期时间后,当 用户向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 如何设置缓存过期时间
说明
新规则仅对后续资源缓存生效,新规则配置完成后,建议您刷新“.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 如何设置缓存过期时间
5 如何提高缓存命中率
背景信息
CDN缓存命中率低,会导致源站压力大,静态资源访问效率低。您可以针对导致CDN 缓存命中率低的具体原因,选择对应的优化策略,来提高CDN的缓存命中率。CDN缓 存命中率包括流量命中率和请求命中率。
● 流量命中率 = 命中缓存产生的流量 / 请求总流量
● 请求命中率 = 命中缓存的请求数 / 请求总数 说明
流量命中率越低,回源流量越大,源站的流出流量越大,源站带宽资源占用越大,其代表 了源站服务器收到的负载压力,请重点关注流量命中率。
查看缓存命中率
您可以登录CDN控制台查看流量命中率和请求命中率。
1. 登录华为云控制台,在控制台首页中选择“CDN与智能边缘 > CDN”,进入CDN 控制台。
2. 在左侧菜单栏中,选择“统计分析”。
3. 分别选择“使用量统计”和“访问情况统计”查看“流量命中率”和“请求命中 率”。
图5-1 流量命中率
最佳实践 5 如何提高缓存命中率
图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 如何提高缓存命中率
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 如何提高缓存命中率
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
d. 单击“下一步”,进入为“FG_TO_CDN”委托配置权限界面。
▪
权限选择:OBS OperateAccess 、CDN LogsReadOnlyAccess。e. 单击“下一步”,配置作用范围。
▪
作用范围:全局服务。f. 单击“确认”,完成委托配置。
2. 准备函数工作流环境
a. 登录华为云控制台,在左侧导航栏,选择“计算>函数工作流”,region选择
“北京四”。
b. 单击右上方“创建函数”,进入创建函数界面。
▪
选择模板:创建空白函数。最佳实践 6 CDN 日志转存到 OBS
▪
输入函数名称:cdn_to_obs(可自定义)。▪
所属应用:选择默认的“default”。▪
委托名称:选择已创建好的委托“FG_TO_CDN” 。▪
企业项目:选择“default”。▪
运行时语言:选择“Python 3.6”。▪
代码上传方式:选择“默认代码”。c. 单击“创建函数”,进入代码编辑界面,将代码示例的代码内容贴入在线 IDE。
最佳实践 6 CDN 日志转存到 OBS
说明
如果有多个域名的日志需要转存,您需要分别为每个域名创建一个函数工作流。
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
i. 单击右上方“保存”,完成设置。
e. 创建“触发器”。在函数配置界面选择“触发器”,单击右侧“创建触发 器”。
▪
触发器类型:定时触发器 (TIMER)。▪
定时器名称:自定义的定时器名称,例如:Timer-0001。▪
触发规则:Cron表达式。▪
Cron表达式:0 0 8 * * ?(每天早上8点执行一次日志转存储)。▪
是否开启:开启。i. 单击“确定”,完成定时触发器设置。
f. 创建测试事件。在函数配置界面,单击右上角“请选择测试事件”下拉框,
选择“配置测试事件”。
最佳实践 6 CDN 日志转存到 OBS
▪
配置测试事件:创建新的测试事件。▪
事件模板:空白模板。▪
事件名称:test。▪
测试事件:{"message":"CDNLog-OBS"}。i. 单击“保存”,完成测试事件创建。
g. 测试函数。在函数详情页面,单击右上角“请选择测试事件”下拉框,选择
“test”,单击“测试”。
3. 查看配置是否成功
a. 登录华为云控制台,在左侧导航栏,选择“存储>对象存储服务OBS”。
b. 单击您存储日志的桶,在左侧导航栏选择“对象”。
c. 访问路径:文件夹(桶名称)>文件夹(加速域名)>文件夹(日志日期)>日 志内容。
最佳实践 6 CDN 日志转存到 OBS
说明
● 当前代码示例仅支持转存当前时间前一日的日志,如果您需要转存日志的加速域名前一 日没有日志产生,则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
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
else:
print('errorCode:', resp.errorCode) print('errorMessage:', resp.errorMessage)
最佳实践 6 CDN 日志转存到 OBS
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
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
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
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”▪
描述:x648. 重启IIS 7服务器,等待配置生效。
9. 查看IIS 7服务器记录的访问日志(默认的日志路径为:“C:\WINDOWS
\system32\LogFiles\ ”,IIS日志的文件名称以“.log”为后缀),可获取X- Forwarded-For对应的客户端真实IP。
最佳实践 7 获取客户端真实 IP
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 修订记录
发布日期 修订记录
2020-04-15 第二次正式发布。
本次更新说明如下:
● 更新操作步骤
● 优化相关描述
2019-06-27 第一次正式发布。
最佳实践 A 修订记录