实现全站静态+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,快乐