COS加CDN部署静态网站

颜值即正义,以前用WordPress搭建的博客太丑了,没有好看有免费的主题,于是转战hexo,一般都是使用的GitHub存放网页,但是这在国内打开速度实在不忍直视,于是部署在了腾讯云上,使用COS+CDN,记录为笔记。

先部署在GitHub上的

搭建Hexo


安装程序

  1. 安装Node.js
  2. 安装Git
  3. 安装hexo
1
npm install -g hexo-cli

本地搭建

  1. 在任意目录下新建文件夹folder

  2. 右键Git Bash

  3. 执行hexo init folder成功提示
    INFO Start blogging with Hexo!

  4. 进入folder目录,执行npm install

  5. 执行下列命令

    1
    2
    hexo generate
    hexo server
    显示内容为
    
    INFO  Start processing
    INFO  Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.

    此时在浏览器中输入上面URL可以看到初始页面

    发布到GitHub

  6. 在GitHub里新建仓库,命名为username.github.io

  7. 复制当前仓库地址https://github.com/yourname/yourname.github.io.git

  8. 编辑_config.yml文件,看意思来配置就好了,这里列出关键的

    #Deployment
    ##Docs: https://hexo.io/docs/deployment.html
    deploy:

    type: git
    repo: https://github.com/betamaoIS/betamaoIS.github.io.git
    branch: master

    即repo的值为2复制的值

  9. 在bash里面执行

    1
    2
    3
    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
    ssh-keygen -t rsa -C "Github的注册邮箱地址"(引号中的内容替换为你的邮箱)

    之后,打开c://Users/yourname/.ssh/id_rsa.pub将其全部添加到GitHub的个人设置->SSH and GPG keys里面

  10. 发布文章

    1
    2
    3
    4
    hexo clean #清除缓存 网页正常情况下可以忽略此条命令
    hexo generate #生成
    hexo server #启动服务预览,非必要,可本地浏览网页
    hexo deploy #部署发布

解决错误

执行hexo deploy后,若出现error deployer not found:git错误,执行命令解决

1
npm install hexo-deployer-git --save

新建文章

  1. 执行hexo new "title"会在\source_posts\目录下生成title.md文件,使用markdown语法编辑

  2. 发布

    1
    hexo g -d

    更换主题

    之前说了,之所以换博客,就是冲着颜值来的,默认的还是不能满足需求,知乎上有很多漂亮的主题推荐,这里先随便换一个,以后再来
    先去下载一个主题
    将其解压到themes目录,再在_config.yml更改主题为spfk

    #Extensions
    ##Plugins: https://hexo.io/plugins/
    ##Themes: https://hexo.io/themes/
    theme: spfk
    再执行

    1
    git pull

    效果

    参考kami的博客

部署至腾讯云


腾讯云对学生是挺优惠的,比阿里好很多,比如对象存储和CDN免费额度挺大的,个人博客站不被打足够了。至于怎么开启这些直接看官方文档就好了,这里只说两个地方

发布内容

要是用GitHub,可以直接执行hexo d发布,但是现在用了COS了,就要换一种方法,可以自己写脚本,但是我偷懒了,直接用腾讯自带的文件同步工具,但是似乎有问题,总感觉每次同步都会重复上传很多文件,(不知道是不是感觉出了偏差),经检查,当生成新文件时,hexo会重新生成部分不会改变的文件到public目录,这样文件时间变了,但内容确实没变,于是读了下官方给的代码,这里似乎有问题,没有仔细看:

如图,当文件最后修改时间变了时会比较md5值,但是官方的代码写的是:

这两个是字符串,若是没有其他特别的操作这个一般情况下都是不相等的,于是意味着只要文件最后修改时间变了就会全部重传,把代码改下,然后到opbin\rebuild.bat就好了(需要安装maven)

更新内容

emmmm,这是才开始遇到的坑,由于CDN缓存,更新的内容不会立即生效,需要过很长时间,可以手动刷新,当然是用官方提供的API会简单很多,这里写了个脚本,支持刷新目录或URL:

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
#coding:utf-8
import requests
import time
import random
import base64
import hashlib
import hmac
import json
reqUrl = "https://cdn.api.qcloud.com/v2/index.php?"
secretKey = '' #自己滴
SecretId = "" #自己滴
publicPara={
"Action":"",
"Timestamp":int(time.time()),
"Nonce":random.randint(0,10000),
"SecretId":SecretId
}

def sign(dict,secretKey,method="POST"):
sortedList= sorted(dict.iteritems(), key=lambda d:d[0], reverse = False)
srcStr="%scdn.api.qcloud.com/v2/index.php?"%(method)
for tmpTuple in sortedList:
srcStr+="%s=%s&"%(tmpTuple[0],tmpTuple[1])
srcStr=srcStr[0:-1]
# print srcStr
signStr = base64.b64encode(hmac.new(secretKey, srcStr, digestmod=hashlib.sha1).digest())
# print signStr
return signStr

def refresh(urlList,dirOrUrl="Url"):
if dirOrUrl not in ("Url","Dir"):
print "参数类型错误:dirOrUrl=Url/Dir"
return
data=publicPara.copy()
data["Action"]="RefreshCdn"+dirOrUrl
i = 0
for url in urlList:
if not url.startswith(("http://","https://")):
print "URL必须以:http://或者https://开头"
return
key=dirOrUrl.lower()+"s.%d"%(i)
value=url
i+=1
data[key]=value
Signature=sign(data,secretKey)
data["Signature"]=Signature
response = requests.post(url=reqUrl,data=data)
return response.json()
if __name__=='__main__':
urlList=["http://blog.betamao.me",]#指定要刷新的url或目录,可支持列表
jsonResponse = refresh(urlList=urlList,dirOrUrl="Dir")#指定要刷新的对象是url还是目录
print json.dumps(jsonResponse, ensure_ascii=False).encode('utf-8')

哇,就这样吧