# 接入CDN服务

接入CDN服务可以在服务器的带宽和性能有限的情况下,有效的加快用户访问系统的速度。本文主要介绍SuccBI如何接入CDN服务。

# CDN加速类型

  1. 静态资源加速。 站点需要支持动静分离,静态资源使用单独的CDN域名来访问。
  2. 全站加速。 不区分动态资源和静态资源,整个站点使用一个域名作为CDN的加速域名,一般CDN服务不会加速动态请求,反而会由于回源导致响应时间更长。也有一些支持全站加速的CDN服务,例如腾讯的ECDN (opens new window),多用于无法动静分离的站点。

SuccBI已支持动静分离,配置CDN后只有静态资源会通过CDN加速,避免了动态资源响应慢的问题,同时节省CDN的流量。

# 准备域名

  1. 源站域名:SuccBI实际业务域名。
  2. 加速域名:需要使用CDN加速的域名。SuccBI只会使用CDN加速静态资源,需要能通过该域名访问静态资源,因此也要使用该域名反向代理SuccBI服务,可以是和源站域名同源的二级域名。

例如源站域名为demo.succbi.com,加速域名为static.succbi.com,使用static.succbi.com访问的资源都会通过CDN加速。

# 注册、开通CDN服务

首先需要选择一个CDN服务商开通CDN服务,常见的服务商有:

  1. 腾讯云 (opens new window)
  2. 阿里云 (opens new window)
  3. 华为云 (opens new window)
  4. Cloudflare (opens new window)

# 基础配置

开通CDN服务后需要完成如下基础配置:

# 域名

参考阿里云 (opens new window)腾讯云 (opens new window)官方文档添加并配置域名,将加速域名配置为之前准备好的static.succbi.com源站域名配置为demo.succbi.com

# CNAME

加速域名添加成功后,CDN服务商会分配对应的CNAME地址,需要完成CNAME配置,CDN加速服务才会生效。参考阿里云 (opens new window)腾讯云 (opens new window)官方文档,将之前准备好的static.succbi.com映射到腾讯云提供的CNAME域名。

# HTTPS证书

为了保证传输安全,正式项目一般都会使用HTTPS协议,CDN服务中也需要同步配置HTTPS证书。参考阿里云 (opens new window)腾讯云 (opens new window)官方文档配置HTTPS证书。

# 回源配置

CDN节点未缓存请求资源或缓存资源已到期时,会回源站获取资源,返回给客户端,并将资源缓存,需要配置以下选项:

# 回源HOST

源站决定了回源时,请求到哪个IP,而回源HOST决定回源请求访问到该IP上的哪个站点,具体可参考阿里云 (opens new window)腾讯云 (opens new window)。这里设置为加速域名,即static.succbi.com

# 回源协议

指回源时使用的协议和客户端访问资源时的协议保持一致,即如果客户端使用HTTPS方式请求资源,当CDN节点上未缓存该资源时,节点会使用相同的HTTPS方式回源获取资源,具体可参考阿里云 (opens new window)腾讯云 (opens new window)。这里设置为HTTPS

# 缓存配置

使用CDN加速静态资源时,CDN会将源站上的资源缓存到距离客户端最近的CDN节点上。当访问该静态资源时,可直接从CDN的缓存节点上获取,有效避免通过较长的链路回源,提高资源访问效率,需要配置以下选项:

# 缓存HTTP响应头

CDN节点响应用户的HTTP请求时,需要增加如下HTTP响应头以实现跨域访问,配置方法参考阿里云 (opens new window)腾讯云 (opens new window)官方文档。

响应头
Access-Control-Allow-Origin *
Access-Control-Allow-Methods POST,GET
Access-Control-Allow-Credentials true

# 缓存过期时间

为了保证CDN缓存命中率,将js,css,json,spg文件后缀的缓存过期时间设置尽可能长,配置方法参考阿里云 (opens new window)腾讯云 (opens new window)官方文档。

# 缓存键规则

SuccBI静态资源的url都带有版本号参数,可以避免版本更新后CDN依然使用旧的缓存。但是可能部分CDN服务默认会忽略url参数,只用路径作为缓存 key,此时需要做一些额外的设置,阿里云 (opens new window)腾讯云 (opens new window)都提供了过滤参数的选项,关闭或设置为不过滤即可。

# 性能优化

设置加速域名的性能优化功能,缩小访问文件的体积,提升加速业务的效率,需要配置以下选项:

# 智能压缩

对静态文件类型进行Gzip压缩,有效减少用户传输内容大小,参考阿里云 (opens new window)腾讯云 (opens new window)官方文档,设置开启即可。

# 更改系统设置

  1. 系统设置 > 外部服务 > CDN中配置好加速域名,例如 static.succbi.com,保存后即可生效。
  2. 系统设置 > 安全设置 > 安全等保中启用跨域,并配置跨域信任域为源站域名,例如:https://demo.succbi.com

至此,SuccBI接入CDN服务配置已完成,可打开源站域名的任意页面,监控静态资源请求路径是否为加速域名,以此判断是否配置成功。

# 常见问题

# 修改了CDN服务配置后,访问业务域名发现修改未生效

由于CDN节点回源后将本次获取的静态资源缓存,因此修改配置后,需要手动刷新CDN缓存,强制CDN节点回源并获取最新文件,可参考阿里云 (opens new window)腾讯云 (opens new window)官方文档进行操作。

# 配置了错误的CDN域名,导致系统无法访问

此时可以添加启动参数-Dsucc.disableCDN=true来禁用 CDN,参考:启动时支持的环境变量。然后重启环境将设置修改正确即可。

# 跨域异常

如果加载 CDN 域名下的资源时出现了跨域错误,请先检查更改系统设置步骤中是否启用了跨域,并正确配置了跨域信任域。 如果已经正确配置了,有可能是反向代理服务器或者 CDN 服务的相关配置中添加了一些额外的跨域响应头,请检查并去掉这些配置。

# 重定向的次数过多异常

问题分析:

源站开启了HTTP重定向至HTTPS的功能,并且CDN控制台上配置的回源端口为80。在这种情况下,由于CDN回源端口为80,客户端无论是通过HTTP还是HTTPS访问CDN加速域名时,CDN在回源的时候都是使用HTTP请求源站,此时会触发源站的HTTPS强制跳转逻辑,然后源站会要求CDN重新发送一个HTTPS的请求,但是CDN回源的时候仍然会发送HTTP回源请求,然后再进行跳转,以此类推,就会出现反复重定向问题,最终导致出现报错。

解决方法:

确认回源HOST设置为加速域名回源协议设置为HTTPS

# 如何自定义哪些 url 使用/不使用 CDN 加速?

SuccBI 内部有自己的规则来判断哪些请求是静态资源,需要通过CDN加速。如果内部判断规则不符合预期,想要某些特定的请求地址使用/不使用CDN加速,可以通过脚本接口来自定义规则:

/**
 * 判断一个url是否需要走cdn域名(如ajax请求或者js模块加载的url)。
 *
 * 系统内部有自动判断某个url是否走cdn域名,通过此函数还可以进一步个性化这个逻辑,覆盖系统内置的判断。
 *
 * 1. 需要在系统设置中设置cdn域名此函数才有效
 *
 * @param url 要判断是否走cdn的url,以'/'开头、含url参数、不包含contextpath。
 * @returns  根据不同的返回结果会有不同的后续执行逻辑:
 * 	1. true,走cdn
 *  2. false,不走cdn
 * 	3. undefined,留给系统自己判断
 */
SZ.events.onCheckNeedCDN = (url: string): boolean => {
	
};
是否有帮助?
0条评论
评论