折腾hexo博客2


实现全站静态+cdn+https

  • 其实这些东西不怎么重要,不过自己就是想玩玩
  • cdn速度快些而且稳定,https的 安全标志就很好看,而且对seo好一些

确定需求

  • 因为自己的服务器可能不太稳定,或者自己总是拿来搞别的,所以必须要用对象存储(各家叫法不同,统一叫这个)
  • 为了静态站的访问速度和稳定性,需要配置cdn
  • 为了seo和安全的小标志,需要https的证书

基本知识

  • 多看看各大云的文档就懂了

静态网站

即网站只有静态html js css等内容,,内容是固定不变的,所有用户浏览返回的HTML页面相同,一般优点是速度快

cdn(内容分发网络)

使用户可就近取得所需内容,提高用户访问网站的响应速度

https

简单讲是HTTP的安全版,需要安装个证书

对象存储(oss)

可以理解为你自己的网盘,可玩性很高,可能要收点钱

CDN回源对象存储(oss)的流量

文件存在对象存储,直接取出到公网是外网流出流量,被cdn节点取出是cdn回源流量,这两种价格不同

计费规则

当请求通过CDN加速回源到OSS获取资源时,计费流量包括CDN加速产生的“CDN流出流量”,以及CDN回源到OSS产生的“OSS流出流量“两部分

对比

我考虑的有三家公司

这里没有考虑资源包,因为网站访问量不大,资源包一定会浪费的

阿里云

最大,最稳定,可配置的地方最多

cdn 价格0.24/G,计费周期为天,

https每万次请求0.05 可以忽略不计,

搭配对象存储,回源流量0.15/G,计费周期为小时(一般四舍五入可以忽略不计),

新用户有一定优惠(也不多)

腾讯云

很稳定,基本配置功能都有

cdn 0.21/G,按每日从腾讯云 CDN 节点流出的实际流量计费。不区分http和https

搭配对象存储, CDN 回源流量费用 = 0.15 x 日累计 CDN 回源流量G

可以直接配置免费https证书

送对象存储包,cdn流量包10G

七牛云

比较稳定,基本配置功能都有

cdn每月送10g免费http流量,https流量0.28/G,按月份结算

每月送10g对象存储,10g回源流量免费

可以直接配置免费https证书

  • 看下来结果是想白嫖是几乎不可能的,多多少少都有点扣费项,一般是在回源流量和https cdn流量上

配置

最后自己决定是七牛云的图床,博客部署在腾讯云(不一定是最划算或者最合适的,差别应该不大)

域名解析,配置证书,对象存储和cdn的配置,等等就省略了,基本操作

一键部署到腾讯云对象存储并cdn url预热

关于cdn刷新预热看这个

https://cloud.tencent.com/document/product/228/44389

hexo生成静态文件

hexo g

写段python

关于配置key等就忽略了

先安两个库

pip install -U cos-python-sdk-v5
pip install tencentcloud-sdk-python

实现了监测文件是否更改,如果更改上传到对象存储并url预热

# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.cdn.v20180606 import cdn_client, models
import sys
import logging
import json
import hashlib
import os


def md5(s) -> str:
    m = hashlib.md5()
    if isinstance(s, str):
        m.update(s.encode())
    elif isinstance(s, bytes):
        m.update(s)
    else:
        return "md5值有误"
    return m.hexdigest()


logging.basicConfig(level=logging.INFO, stream=sys.stdout)
secret_id = ''  # 替换为用户的 secretId
secret_key = ''  # 替换为用户的 secretKey
region = ''  # 替换为用户的 Region
token = None  # 使用临时密钥需要传入 Token,默认为空,可不填
scheme = 'https'  # 指定使用 http/https 协议来访问 COS,默认为 https,可不填
config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token, Scheme=scheme)
# 2. 获取客户端对象
client = CosS3Client(config)

website = 'https://blog.carrot2.cn/'
md5_db_path='/root/md5.json'
blog_path='/root/blog/public'

# 检查本地文件,根据md5判断文件是否修改
if os.path.isfile(md5_db_path):
    md5_db = json.load(open(md5_db_path, 'r'))
else:
    md5_db = {}

os.chdir(blog_path)
files = os.popen('find -type f').read().splitlines()

urls = []
for file in files:
    cont = open(file, 'rb').read()
    if file[2:] in md5_db:
        if md5(cont) == md5_db[file[2:]]:
            # 假如存在且md5相同,那就不上传
            continue
    # 到这里的肯定是以前不存在的或者md5改变的
    md5_db[file[2:]] = md5(cont)
    response = client.put_object(
        Bucket='xxxxxxxxxxx',
        Body=cont,
        Key=file[2:],
        EnableMD5=True
    )
    urls.append(file[2:])
    print(response)
json.dump(md5_db, open(md5_db_path, 'w'))

# cdn预热
try:
    cred = credential.Credential(secret_id, secret_key)
    httpProfile = HttpProfile()
    httpProfile.endpoint = "cdn.tencentcloudapi.com"

    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    client = cdn_client.CdnClient(cred, "", clientProfile)
except TencentCloudSDKException as err:
    print(err)

# api有限制 20个每秒
for url in urls:
    req = models.PushUrlsCacheRequest()
    params = {
        "Urls": [website+url]
    }
    req.from_json_string(json.dumps(params))
    resp = client.PushUrlsCache(req)
    print(resp.to_json_string())

后记

最后网站访问加载速度很快,全站https,快乐


文章作者: Carrot2
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Carrot2 !
评论
  目录