March 1, 2019

博客迁移至https及免费https CDN实现

自从chrome要求https之后一直想把博客转移到https,其实去年就已经弄好了证书什么的,解析也都弄好了,使用的时候发现由于安全机制https不能加载http的资源。由于本站服务器什么的都是国外的,所以资源一直用的是七牛的cdn加速的,但是七牛只提供http的免费资源,要用https的时候就需要收费了,再加上网信办各种坑爹的备案机制,之前买的已备案域名也被七牛屏蔽了,所以决定告别国内的所有服务商了,正好看到之前大佬同事写的一个jsDelivr免费CDN的方案,一切技术都很成熟,就直接开搞了。现在本站就是完全https的了,正好记录一下这个方案。

1.申请自动更新的https证书

使用acms.sh来申请
acms.sh是一个从 let‘s encrypt 生成免费的证书的工具

# 安装
wget -O - https://get.acme.sh | sh

# 使用dns认证域名,此处使用dnspod,需要去dnspod面板生APItoken
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d xxx.com

# 签发证书
acme.sh --renew -d xxx.com
申请完成后你将会在~/.acme.sh/xxx.com下看到你的证书文件

接下来使用nginx解析,我用的是nginx的docker

# nginx配置文件,要把对应的证书路径改对
server
{
  listen 443 ssl;
  server_name zzs0.com;
  ssl_certificate /etc/nginx/certs/zzs0.com.cer;
  ssl_certificate_key /etc/nginx/certs/zzs0.com.key;
  rewrite ^/(.*) https://www.zzs0.com/$1 permanent;
}

# 如果是docker的话启动挂载命令
#!/bin/bash
docker stop nginx && docker rm nginx
docker run --name nginx --net=host -p 80:80 -p 443:443 -v /root/.acme.sh/zzs0.com:/etc/nginx/certs -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

这样的话https的证书问题就解决了

2.使用https的cdn

其实第一步都很好弄,弄好之后你的网站里面不能有任何http的请求和资源,不然的话还是会提示不安全。开头我说了,境外网站一般使用国内cdn来加速,但是国内cdn只提供免费的http流量,用https的话就要收费,而且还需要有备案的域名。之前一直没办法解决,但是正好看到了大佬同事的一个解决方案,使用 Github,jsDelivr,TravisCI来搭建。先介绍下这三个东西应该就能明白了。

1.Github不用说了,托管代码,也就是cdn静态资源文件都放到这里面
2.jsDelivr,这是一个新出的工具,它会自动去拉取github或npm上面项目的release并做成cdn,本来是解决比如国内访问github或者npm过慢的问题,但是它并没有限制哪些项目,也就是说你自己随便写个东西发布release它也可以拉取做成cdn,可以看到它在中国的节点非常多,而且速度真的很快,本博客就是例子

3.TravisCI,一个自动化构建的机器人,好在你不需要自己去服务器搭建了,他官方提供服务

所以核心思路就是建一个github仓库用来放静态资源,每次push上去的时候自动触发Travis去打包发布到release,然后你自己的网站或者博客直接用jsDelivr的通用链接去请求就行了

主要就是TravisCI的脚本,新建一个.travis.yml在你的项目里,其中GITHUB_KEY是github调用第三方api的token,需要自己去控制套生成。

language: node_js # 升级版本需要依赖 npm
node_js: stable

install: true # 无需安装依赖,调过安装

branches:
  only:
  - master # 只发布 master 分支

before_script:
- git config --global user.name "travis" # 配置 travis git 信息
- git config --global user.email "[email protected]"

script:
- git push -f https://[email protected]/ccbikai/cdn.git `npm version patch -m "%s [ci skip]"` # 打 Tag,发布到 Github Release, 使用 [ci skip] 调过 CI, 防止死循环
- git push -f https://[email protected]/ccbikai/cdn.git HEAD:master #将新版本文件推送回 Github

至此,整个项目就完成了。
P.S.在说一个用github当免费图床的办法,就是用上面的方法去同步,但是github仓库有1G的限制,所以可以通过建立多个仓库,然后用不同的命名方式来当图床,可以写脚本来完成。

十分感谢大佬提供的方案:
https://chi.miantiao.me/make-a-cdn-by-github-jsdelivr-travisci/