这是一篇过期文章 230824

本篇文章已过期。

  • 本文为网站早期文章,内容过于粗糙和简单
  • PicGo 配置已随版本更新而变化
  • 部分内容已整合至其他文章中

为 WordPress 博客网站开启 CDN 加速

服务器部署在阿里云,使用了腾讯云的 CDN 加速。

使用 CDN:内容分发网络 CDN 从零开始配置 CDN - 快速入门 - 文档中心 - 腾讯云 (tencent.com)

QQ截图20220412210237

源站配置应该像下图这样。如果选择 COS,那么还要去腾讯云那里接入备案,接入备案前提还要买它的服务器…

image-47-1024x427

如果网站支持 HTTPS,并开启了强制跳转,那么这里回源协议不用选 HTTPS。

啊,关于 CDN 的理解,走了很多弯路,现提供以下网址进行学习:
使用腾讯CDN加速WordPress - 云+社区 - 腾讯云 (tencent.com)
内容分发网络 CDN 源站配置 - 配置指南 - 文档中心 - 腾讯云 (tencent.com)
CDN的配置回源HOST与源站的区别 (aliyun.com)

提示:不管是在对 CDN 操作也好,还是对域名解析进行操作也好,都要等待一段时间才能生效。控制台提示操作成功了,也是要再等一会的。

开启 CDN 的过程中,出现了登录问题,解决方案是(腾讯云):

image-42-1024x375

参考:
php用cdn打不开,开启 CDN 后 wordpress 后台打不开的解决办法_柳不是刘的博客-CSDN博客
解决WordPress配置百度云CDN,后台无法登录问题_美洽技术的博客-CSDN博客
内容分发网络 CDN 域名接入常见问题 - 快速入门 - 文档中心 - 腾讯云 (tencent.com)
wordpress 不更新 加了CDN 用户购买 - CSDN

为 COS 开启 CDN

如果需要对 COS 存储桶进行加速,我采用文档(对象存储 CDN 加速概述 - 开发者指南 - 文档中心 - 腾讯云 (tencent.com))提供的第一种方法,使用默认 CDN 加速域名进行加速。

配置好后的配置图如下:

image-45-1024x231

如果平时在粘贴地址时使用了 PicGo 软件,注意在“使用自定义域名”这一栏填上默认 CDN 加速域名:

这样,在 PicGo 上传图片后得到的地址就是加速域名地址。

参考:内容分发网络 CDN COS-CDN 计费说明 - 购买指南 - 文档中心 - 腾讯云 (tencent.com)

上面两项做完结果:

问题

如果页面缓存还是有点问题,比如编辑了文章后,查看文章时并没有刷新。进入文章页面没有显示用户登录等。目前还没想到比较好的解决方法,在腾讯云 刷新预热-内容分发网络 - 控制台 (tencent.com) 这里提交 URL 可以暂时的解决问题。

尝试的解决方案:在 functions.php 下添加自动刷新腾讯云控制台 CDN 缓存的操作。不懂有没有用(来源:wordpress腾讯CDN缓存实现发布/更新文章/评论自动刷新-轻刻年轮 (ly522.com))。有用!有用!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* 需要填写你的密钥,访问 https://console.qcloud.com/capi 获取 SecretId 及 $secretKey */
$secretKey = '填写你的密钥';
$secretId = '填写你的密钥';

//更新或发布文章清理本文和首页CDN缓存
add_action('publish_post', 'Clean_By_Publish', 0);

//提交评论更新本文CDN缓存
add_action('comment_post', 'Clean_By_Comments',0);

//评论被审核更新本文CDN缓存
add_action('comment_unapproved_to_approved', 'Clean_By_Approved',0);

//发布文章更新CDN缓存函数
function Clean_By_Publish($post_ID){
global $secretKey,$secretId;
$url = get_permalink($post_ID);
$action='RefreshCdnUrl';
/*要清理的页面,默认包含首页和文章页面,需要清理其他页面请自行发挥*/
$PRIVATE_PARAMS = array(
'urls.0' => home_url(),
'urls.1' => $url ,
);
$HttpUrl="cdn.api.qcloud.com";
/*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
$HttpMethod="POST";
/*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
$isHttps =true;
/*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
$COMMON_PARAMS = array(
'Nonce' => rand(),
'Timestamp' =>time(NULL),
'Action' =>$action,
'SecretId' => $secretId,
);
/***********************************************************************************/
CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
}

//提交评论清理文章CDN函数
function Clean_By_Comments($comment_id)
{
global $secretKey,$secretId;
$comment = get_comment($comment_id);
$url = get_permalink($comment->comment_post_ID);
$action='RefreshCdnUrl';
/*参数*/
$PRIVATE_PARAMS = array(
'urls.0' => $url,
);
$HttpUrl="cdn.api.qcloud.com";
/*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
$HttpMethod="POST";
/*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
$isHttps =true;
/*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
$COMMON_PARAMS = array(
'Nonce' => rand(),
'Timestamp' =>time(NULL),
'Action' =>$action,
'SecretId' => $secretId,
);
/***********************************************************************************/
CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
}

//评论被审核清理CDN缓存函数
function Clean_By_Approved($comment)
{
global $secretKey,$secretId;
$url = get_permalink($comment->comment_post_ID);
$action='RefreshCdnUrl';
/*参数*/
$PRIVATE_PARAMS = array(
'urls.0' => $url,
);
$HttpUrl="cdn.api.qcloud.com";
/*除非有特殊说明,如MultipartUploadVodFile,其它接口都支持GET及POST*/
$HttpMethod="POST";
/*是否https协议,大部分接口都必须为https,只有少部分接口除外(如MultipartUploadVodFile)*/
$isHttps =true;
/*下面这五个参数为所有接口的 公共参数;对于某些接口没有地域概念,则不用传递Region(如DescribeDeals)*/
$COMMON_PARAMS = array(
'Nonce' => rand(),
'Timestamp' =>time(NULL),
'Action' =>$action,
'SecretId' => $secretId,
);
/***********************************************************************************/
CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps);
}

//请求主函数,无需改动
function CreateRequest($HttpUrl,$HttpMethod,$COMMON_PARAMS,$secretKey, $PRIVATE_PARAMS, $isHttps)
{
$FullHttpUrl = $HttpUrl."/v2/index.php";
/***************对请求参数 按参数名 做字典序升序排列,注意此排序区分大小写*************/
$ReqParaArray = array_merge($COMMON_PARAMS, $PRIVATE_PARAMS);
ksort($ReqParaArray);
/**********************************生成签名原文**********************************
* 将 请求方法, URI地址,及排序好的请求参数 按照下面格式 拼接在一起, 生成签名原文,此请求中的原文为
* GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&Nonce=345122&Region=gz
* &SecretId=AKIDz8krbsJ5yKBZQ ·1pn74WFkmLPx3gnPhESA&Timestamp=1408704141
* &instanceIds.0=qcvm12345&instanceIds.1=qcvm56789
* ****************************************************************************/
$SigTxt = $HttpMethod.$FullHttpUrl."?";
$isFirst = true;
foreach ($ReqParaArray as $key => $value)
{
if (!$isFirst)
{
$SigTxt = $SigTxt."&";
}
$isFirst= false;
/*拼接签名原文时,如果参数名称中携带_,需要替换成.*/
if(strpos($key, '_'))
{
$key = str_replace('_', '.', $key);
}
$SigTxt=$SigTxt.$key."=".$value;
}
/*********************根据签名原文字符串 $SigTxt,生成签名 Signature******************/
$Signature = base64_encode(hash_hmac('sha1', $SigTxt, $secretKey, true));
/***************拼接请求串,对于请求参数及签名,需要进行urlencode编码********************/
$Req = "Signature=".urlencode($Signature);
foreach ($ReqParaArray as $key => $value)
{
$Req=$Req."&".$key."=".urlencode($value);
}
/*********************************发送请求********************************/
if($HttpMethod === 'GET')
{
if($isHttps === true)
{
$Req="https://".$FullHttpUrl."?".$Req;
}
else
{
$Req="http://".$FullHttpUrl."?".$Req;
}
$Rsp = file_get_contents($Req);
}
else
{
if($isHttps === true)
{
$Rsp= SendPost("https://".$FullHttpUrl,$Req,$isHttps);
}
else
{
$Rsp= SendPost("http://".$FullHttpUrl,$Req,$isHttps);
}
}
//var_export(json_decode($Rsp,true));
return json_decode($Rsp,true);
}
function SendPost($FullHttpUrl, $Req, $isHttps)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $Req);
curl_setopt($ch, CURLOPT_URL, $FullHttpUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1 );
if ($isHttps === true) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
$result = curl_exec($ch);
return $result;
}