# 接入CDN服务
接入CDN服务可以在服务器的带宽和性能有限的情况下,有效的加快用户访问系统的速度。本文主要介绍SuccBI如何接入CDN服务。
# CDN加速类型
- 静态资源加速。 站点需要支持动静分离,静态资源使用单独的CDN域名来访问。
- 全站加速。 不区分动态资源和静态资源,整个站点使用一个域名作为CDN的加速域名,一般CDN服务不会加速动态请求,反而会由于回源导致响应时间更长。也有一些支持全站加速的CDN服务,例如腾讯的ECDN (opens new window),多用于无法动静分离的站点。
SuccBI已支持动静分离,配置CDN后只有静态资源会通过CDN加速,避免了动态资源响应慢的问题,同时节省CDN的流量。
# 准备域名
- 源站域名:SuccBI实际业务域名。
- 加速域名:需要使用CDN加速的域名。SuccBI只会使用CDN加速静态资源,需要能通过该域名访问静态资源,因此也要使用该域名反向代理SuccBI服务,可以是和源站域名同源的二级域名。
例如源站域名为demo.succbi.com
,加速域名为static.succbi.com
,使用static.succbi.com
访问的资源都会通过CDN加速。
# 注册、开通CDN服务
首先需要选择一个CDN服务商开通CDN服务,常见的服务商有:
# 基础配置
开通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)官方文档,设置开启即可。
# 更改系统设置
- 在系统设置 > 外部服务 > CDN中配置好加速域名,例如
static.succbi.com
,保存后即可生效。 - 在系统设置 > 安全设置 > 安全等保中启用跨域,并配置跨域信任域为源站域名,例如:
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回源请求,然后再进行跳转,以此类推,就会出现反复重定向问题,最终导致出现报错。
解决方法:
# 如何自定义哪些 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 => {
};