博客搬家、换域名、动静分离、CDN 加 HTTPS

这两天花了些时间把博客从 GCP 搬回国内

七七八八折腾了几天,这里把折腾都记录下来,以便查阅

搬家

这部分其实是最简单的,买域名买主机,我选择的是腾讯云,因为是真的便宜

域名简单,按自己喜欢的买就好了,最长续费 10 年,有优惠券就早点用,如果这个域名还蛮好的话

域名买完尽早开始做域名的实名,这个大概一个工作日还是不到就能完成,很快

主机至少买 1 核 1G吧,我买的 1 核 2G,双十一做活动,230 几三年,真的良心

系统 CentOS7,区域只有北京可以选

主机买好了就可以开始做网站备案了,按腾讯的提示一步一步来就行,不需要幕布,用小程序提交,我这次总共审批耗时 20 个工作日打满,一个月吧

备案开始审批的时候可以开始配置安全组,并关联到实例,具体操作可以看宝塔的说明

然后修改 SSH 密码,设置快照周期和保存数量,注意免费空间容量,会有费用问题

然后安装宝塔面板,同样按官网的教程来即可

进入面板后做相应的升级、安装和修改,除非明确知道网站访问量大,否则还是推荐用 Apache,可以避免很多坑,我现在用的是 Ngnix,后悔了

更新 PHP 如果失败,是因为内存不够,添加虚拟内存后更新即可,更新完毕建议关闭虚拟内存,代码如下

//创建交换分区并开启

dd if=/dev/zero of=/swapfile bs=64M count=16
mkswap /swapfile
swapon /swapfile

//关闭交换分区并删除交换分区 文件

swapoff /swapfile
rm /swapfile

面板的设置里修改端口,然后再安全组里做对应修改

关于面板绑定域名,我觉得为了能保证可以登录,暂时先不要,其他按需求设置即可

除了 LAMP,还要装 phpMyAdmin,Pure-Ftpd,Linux工具箱,PHP守护,腾讯云COS(按需安装),宝塔SSH终端(按需安装),Nginx免费防火墙

在php 里面还要安装插件 opcache 和 memcached,带 d 的版本,会自动安装外部的 memcached 程序

搬家有两个方案,一个是原服务器的内容整体复制过来,包括文件和数据库,还一个是用新装的方式,然后导入内容,这个麻烦很多,但是新博客是相对比较干净的,这里我选择后者

折腾之前先备份原主机的内容,网站目录整体打包下载,数据库从宝塔面板里备份后下载,然后进 phpMyAdmin 导出为 SQL 文件再下载一次,确保万无一失

新主机装 WP 可以直接用面板的远程下载

如果打开 WP 官网 429 的话,需要直接挂梯子下载,大陆和香港一般都会同时 429,直接日本吧

然后按照原来博客的插件开始一个个在新博客上安装,同样的有概率直接安装会失败,因为 429,需要本地挂梯子下载好后后台上传安装

参照老博客,分别设置新博客及插件,重点在于固定连接,以及各插件的设置

在设置好固定链接后需要在宝塔面板的网站设置中将伪静态选择为 WordPress 模板,并开启防盗链

缓存类、图片压缩类、安全防御类插件启用,国内主机用不了 DCL 插件,TablePress这个插件要从原博客导出表单

如果安装插件提示修改 user.ini文件失败,在 SSH 中用 chattr -i 来解除该文件的锁定,再修改权限,搞定后改回原始权限再锁定隐藏

//解锁
chattr -i /你网站文件夹/.user.ini

//上锁
chattr +i /home/wwwroot/你网站文件夹/.user.ini

W3 缓存插件能选memcached就选memcached,剩下一个选 op,CDN  和 minfy 先不开

从老博客的后台打包下载主题,然后再新博客前台上传安装,然后清理干净主题中 header.php 和  footer.php 中残留的代码,并在 footer 中添加备案码和链接

到这里新的博客差不多就建立起来了

至于内容和媒体的迁移,放在下面换域名和动静分离的过程里

 

换域名

原博客在工具里选择导出全部内容,下载 xml 文件

再选择导出媒体,下载 xml 文件(为了可以分批处理)

先导入媒体,选择下载附件,新博客会从老博客中下载所有的媒体并按原参数导入,如果还做了动静分离,也就是静态文件如图片视频等储存在 COS 或者 OSS 等对象存储中,那么先执行动静分离的设置后再导入

可能是因为网络还是什么问题,我这里导入媒体下载过程中一次只能导入 85 张图片,然后就卡住,这时可以分析媒体 xml 文件,保留头尾后,把中间内容切片,我这里是 50 张图一份,再分别导入分片后的媒体 xml 文件,核对媒体数量,成功

对于全文 xml 文件,用编辑器打开,搜索替换修改域名,如果做了动静分离,要考虑图片替换后的域名,别弄错了

最后导入全文 xml,也可以选择下载附件,看看有没有不在的附件,然后查看文章,连接及图片正常即可

 

动静分离

如果以后你的网站访问量都很小,那么上了 CDN 后不做动静分离是很方便的,如果为了速度,也愿意支付 COS 存储带来的一点点费用,那么动静分离是最好的选择,能避免缓存失效后 CDN 再次提取缓存这个过程中的缓慢

我用的 WPCOS 插件,按插件说明来即可,简单说一下,公共读私有写,不加密,开启防盗链,允许空 referer(也就是浏览器直接打开该图片,看自己需求是否开启),默认加速域名不开,开启自定义加速域名即可(会同时打开 CDN,建议二级域名 img),然后再解析中设置img 的 CNAME,在访问管理中建立子账号,只给与 COS 读取权限,并生成秘钥填入插件,为了确保后续全站 CDN 能避开域名替换问题以及不重复缓存,建议插件中的加速域名加上后续地址 /wp-content/uploads ,但目前插件有点 BUG,并不能解析后续地址,在 COS 中仍然是根目录下简历年份文件夹,解决方案,一个修改 CDN 的插件中排除文件,按年份添加排除,这样的比较容易漏,还一个就是我上面建议的方法,修改加速域名,CDN 的插件就不用做改动,不会有遗漏,但是因为 WPCOS 的 BUG,每次上传完后需要手动把文件复制到子文件夹 /wp-content/uploads 中才能正常引用

在腾讯云的 CDN 中,修改 img 域名的配置,关过滤参数,添加防盗链,IP 限制(单 img 域名,可以给大一些,或者等一段时间再开启,系统会自动推荐值),Range 和 301 302 回源都开启,带宽限制开启(单个域名可以设大一点)

最后上传一个文件,看上传和引用过程是否正常

 

上 CDN

在腾讯云的 CDN 中新建两个或者多个加速域名,比如cdn0、1,回源到主机 IP(不建议填域名,能减少解析次数),关过滤参数,添加防盗链,IP 限制(多个 CDN 域名,可以给小一些,或者等一段时间再开启,系统会自动推荐值),缓存设置如下图,Range 和 301 302 回源都开启,带宽限制开启(多个域名可以设小一点),SEO 优化开启,在解析中设置好二级域名的 CNAME

在 W3 插件中开启 CDN,选择通用镜像,域名中填入两个 CDN 域名,在下面的排除文件中填入(详见动静分离部分内容)

{uploads_dir}/*.gif
{uploads_dir}/*.jpg
{uploads_dir}/*.png

并在上面的包含文件中删除对应的内容,保存清缓存,隐私模式刷新看结果,F12 看资源加载的域名是否已经为 cdn 域名

minfy开启,如果是 Nginx 话,默认参数如果导致丢失 css 和 js,可以手动修改 Nginx 的配置文件,把 w3 的配置文件添加进去(具体操作见Google),不过我更建议在 Minfy 的设置中直接把 rewrite 关掉,简单省事

在面板的 Nginx免费防火墙中打开 CDN 开关

如果想要进一步强化,比如说自动更新 CDN 缓存,可以参考这里,不过根据我是实验来看,因为 W3TC 的存在,这里不需要我来管

有说要在白名单里加入搜索引擎的域名,但是我觉得 CDN 缓存的是静态内容,就算禁止了也无所谓吧,这里留个底,先看看不加是什么效果

 

上 HTTPS

在腾讯云的 SSL 中为主域名,img,以及cdn 域名申请证书,大概半小时后审批下来,下载主域名的证书,然后再宝塔面板中点击网站设置,按说明在 SSL 的其他证书中分别填入,并打开强制 HTTPS,在配置文件的标签页中的 SSL 区域注释并添加以下内容,来源这里

#ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

第一组是为了去除不安全的 v1 协议,第二组修改为更安全的加密方式,第三组是为了开启 HSTS,强制启动 HTTPS,避免 301 跳转挟持

关于 HSTS 的 Preload 设置可以看这里,我并没有做,目前看起来没啥问题,而且取消 Preload 貌似很麻烦

在当前模板的 functions.php 文件中添加下列代码,作用是把文章中的 http 链接都转为 https

//把 http 转为 https
add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
    if( is_ssl() ){
        function fanly_ssl_main ($content){
            $siteurl = get_option('siteurl');
            $upload_dir = wp_upload_dir();
            $content = str_replace( 'http:'.strstr($siteurl, '//'), 'https:'.strstr($siteurl, '//'), $content);
            $content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), 'https:'.strstr($upload_dir['baseurl'], '//'), $content);
            return $content;
        }
        ob_start("fanly_ssl_main");
    }
}

在腾讯云的 CDN 中的域名管理中,开启 HTTPS 并绑定相应的证书,开启强制跳转 HTTPS 并改为 301 跳转,再开启HTTP2.0,在 HTTP Header 配置中添加自定义 header,参数为Strict-Transport-Security,取值为max-age=31536000; includeSubdomains; preload,结尾不含分号(该设置是否起效不太清楚,实测好像并没有啥用)

如果遇到跨域访问问题,在 HTTP Header 配置添加Access-Control-Allow-Origin,取值为*即可,或者在自己的网站头中添加,具体 Google

搞定好用 https://myssl.com/ 检查是否全部合规以及是 A+

发表评论

电子邮件地址不会被公开。 必填项已用*标注