---
order: 4
navTitle: CDN
---
# 接入CDN服务

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

## CDN加速类型{#type}

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

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

## 准备域名{#prepare-domain}

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

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

## 注册、开通CDN服务{#subscribe}

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

1. [腾讯云](https://cloud.tencent.com/product/cdn)
2. [阿里云](https://www.aliyun.com/product/cdn)
3. [华为云](https://www.huaweicloud.com/product/cdn.html)
4. [Cloudflare](https://www.cloudflare.com/zh-cn/cdn)

## 基础配置{#base-config}

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

### 域名{#domain}

参考[阿里云](https://help.aliyun.com/document_detail/122181.html?spm=5176.11785003.0.dtree-leaf.5046142fi0qgJz)、[腾讯云](https://cloud.tencent.com/document/product/228/41215)官方文档添加并配置域名，将`加速域名`配置为之前准备好的`static.succbi.com`，`源站域名`配置为`demo.succbi.com`。

### CNAME{#cname}

加速域名添加成功后，CDN服务商会分配对应的CNAME地址，需要完成CNAME配置，CDN加速服务才会生效。参考[阿里云](https://help.aliyun.com/document_detail/27144.htm?spm=a2c4g.11186623.2.30.42d8504dn0ZSB9#task-187531)、[腾讯云](https://cloud.tencent.com/document/product/228/3121)官方文档，将之前准备好的`static.succbi.com`映射到腾讯云提供的CNAME域名。

### HTTPS证书{#https}

为了保证传输安全，正式项目一般都会使用HTTPS协议，CDN服务中也需要同步配置HTTPS证书。参考[阿里云](https://help.aliyun.com/document_detail/27118.html?spm=a2c4g.11174283.6.624.3d6b70350yglON)、[腾讯云](https://cloud.tencent.com/document/product/228/41687)官方文档配置HTTPS证书。

## 回源配置{#back-to-origin}

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

### 回源HOST{#origin-host}

源站决定了回源时，请求到哪个IP，而回源HOST决定回源请求访问到该IP上的哪个站点，具体可参考[阿里云](https://help.aliyun.com/document_detail/27131.html?spm=a2c4g.11186623.6.603.41a7f625ps1myN)、[腾讯云](https://cloud.tencent.com/document/product/228/41334)。这里设置为**加速域名**，即`static.succbi.com`。

### 回源协议{#origin-protocol}

指回源时使用的协议和客户端访问资源时的协议保持一致，即如果客户端使用HTTPS方式请求资源，当CDN节点上未缓存该资源时，节点会使用相同的HTTPS方式回源获取资源，具体可参考[阿里云](https://help.aliyun.com/document_detail/34949.html?spm=a2c4g.11186623.6.604.758466f2w5kRUn)、[腾讯云](https://cloud.tencent.com/document/product/228/41334)。这里设置为**HTTPS**。

## 缓存配置{#cache}

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

### 缓存HTTP响应头{#response-header}

CDN节点响应用户的HTTP请求时，需要增加如下HTTP响应头以实现跨域访问，配置方法参考[阿里云](https://help.aliyun.com/document_detail/27137.html?spm=a2c4g.11186623.6.618.786b5241cswn4j)、[腾讯云](https://cloud.tencent.com/document/product/228/41737)官方文档。

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

### 缓存过期时间{#cache-expiration}

为了保证CDN缓存命中率，将`js,css,json,spg`文件后缀的缓存过期时间设置尽可能长，配置方法参考[阿里云](https://help.aliyun.com/document_detail/27136.html?spm=a2c4g.11186623.6.616.705b487cHUzG1W)、[腾讯云](https://cloud.tencent.com/document/product/228/47672)官方文档。

### 缓存键规则{#cache-key-rules}

SuccBI静态资源的url都带有版本号参数，可以避免版本更新后CDN依然使用旧的缓存。但是可能部分CDN服务默认会忽略url参数，只用路径作为缓存 key，此时需要做一些额外的设置，[阿里云](https://help.aliyun.com/document_detail/27128.html?spm=5176.11785003.0.dexternal.5046142fi0qgJz)、[腾讯云](https://cloud.tencent.com/document/product/228/47671)都提供了`过滤参数`的选项，关闭或设置为不过滤即可。

## 性能优化{#optimization}

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

### 智能压缩{#intelligent-compression}

对静态文件类型进行Gzip压缩，有效减少用户传输内容大小，参考[阿里云](https://help.aliyun.com/document_detail/27127.html?spm=a2c4g.11186623.6.647.189bf625Ua5bGJ)、[腾讯云](https://cloud.tencent.com/document/product/228/41736)官方文档，设置开启即可。

## 更改系统设置{#config-syssettings}

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

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

## 常见问题{#FAQ}

### 修改了CDN服务配置后，访问业务域名发现修改未生效{#cdn-cache}

由于CDN节点回源后将本次获取的静态资源缓存，因此修改配置后，需要手动刷新CDN缓存，强制CDN节点回源并获取最新文件，可参考[阿里云](https://help.aliyun.com/document_detail/27140.html?spm=a2c4g.11186623.6.692.39e8210cDtcxyf)、[腾讯云](https://cloud.tencent.com/document/product/228/6299)官方文档进行操作。

### 配置了错误的CDN域名，导致系统无法访问{#cdn-domain-config-error}

此时可以添加启动参数`-Dsucc.disableCDN=true`来禁用 CDN，参考:[启动时支持的环境变量](../basic-install/jvm-sys-properties.md)。然后重启环境将设置修改正确即可。

### 跨域异常{#CORS-error}

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

### 重定向的次数过多异常{#too-many-redirects}

**问题分析：**

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

**解决方法：**

确认[回源HOST](#origin-host)设置为`加速域名`、[回源协议](#origin-protocol)设置为`HTTPS`

### 如何自定义哪些 url 使用/不使用 CDN 加速？{#custom-rules}

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

```typescript
/**
 * 判断一个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 => {
	
};
```
