呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

为 Django 博客免费开启七牛云 CDN 加速

前言

博客上线已经有将近两年了,一直没有解决访问速度慢的问题(懒),最近每次看到将近20秒的加载时间,是越来越不能忍了,于是研究下准备开通CDN加速。

查了查网上没有一篇说的很明白的文章,以至于走了不少弯路,以下为我开启CDN加速的一种可行方案,分享给大家。

什么是CDN?

CDN 的全称是 Content Delivery Network,即内容分发网络。它可以存储你的站点的静态资源,分发到所有边缘节点,用户在访问的时候会从就近的 CDN 节点获取资源,从而达到访问加速的目的。

形象点讲,可以拿快递物流来举例子,我们在京东购物的时候,通常会发现京东的配送速度很快,经常第二天就到了,甚至有的当天就到货,这是因为京东的仓库遍布全国的城市,用户买的东西会从就近的仓库发货,速度自然快多了!

CDN加速也是同样的原理,开启了CDN加速可以大幅度提高网站的加载速度。

准备工作

完成本文的目的需要选择合适的CDN服务和域名解析服务:

  • CDN服务我们采用七牛云CDN,每个月有免费10G的流量,稳定可靠;
  • 域名解析服务由于我用的是阿里云,所以我以阿里云域名解析为例子;
  • 另外我的博客是基于 Django 的,这个影响不大,只要配置好了你的CDN加速域名,根据个人需要引用到自己的站点中即可;
  • 另外你还需要一个备案的域名;

配置过程

配置简述:

  1. 在七牛云上创建一个存储空间,用于存储源站的资源;
  2. 配置一个七牛云CDN加速域名,作为访问存储空间资源的快速通道;
  3. 在阿里云域名解析中添加一个CNAME解析,创建一个二级域名将它解析到七牛云的加速域名CNAME;
  4. 配置 Django 博客,加载静态资源的时候使用;

配置详解:

1. 在七牛云上注册账号,然后登录后台

2. 创建存储空间

在七牛云的后台点击“对象存储 -> 新建存储空间”,然后填写存储空间名称,用于存放你的网站静态资源,其它默认即可。

3. 配置七牛云CDN加速域名

点击“融合 CDN -> 域名管理 -> 添加域名”,然后填写信息。

  • 域名类型我们使用“普通域名”,即选择一个二级域名作为我们的加速域名,你也可以选择泛域名,即包含你的域名下的所有子域名,但是我没试过;
  • 加速域名填写你指定的用于访问CDN资源的二级域名,注意配置的二级域名不能和你之前配置的重复;
  • 使用场景选择“图片小文件”,假如你需要加速的资源主要是几十M的安装包,那么可以选择下载分发。这里我需要对网站静态文件加速,所以保持默认;
  • 源站配置填写刚刚创建的存储空间,用于保存我的网站静态资源;
  • 其它保持默认就好

点击“创建”,等待几十分钟配置完成。

4. 配置镜像存储

在加速域名配置期间,我们可以先配置下刚创建的存储空间的镜像存储。

七牛的镜像存储服务是一种快速的数据迁移和加速服务,可以帮助用户实现无缝数据迁移,迁移过程中并不影响原有业务系统的访问。

也就说配置镜像存储后,源站资源(文件/图片等)初次访问会自动同步到七牛云存储,不需要我们手动同步网站资源。

点击“对象存储 -> my-cdn -> 镜像存储”,然后填写“镜像源”为你的网站域名,其它保持默认,点击保存设置。

5. 对CDN加速域名进行DNS解析

这个时候加速域名的配置差不多好了,完成后会在你的“融合 CDN -> 域名管理”中多出一条记录:

然后点击加速域名的“配置”,在弹出的页面上方复制七牛云给加速域名分配的CNAME

打开阿里云域名解析,点击“添加记录”。

  • 记录类型选择“CNAME”
  • 主机记录填写“cdn”(即刚才配置的加速域名,这里是要将它DNS解析到七牛云)
  • 记录值填写从七牛云复制过来的加速域名的CNAME
  • 其它保持默认

配置好之后点击确定,等待一小会试着访问“cdn.yangyingming.com”,发现是不是可以访问了呢?这就是对应的你的网站的镜像站点,主要用于存储静态资源。初次访问镜像站点的某个页面会比较慢,待同步之后,再访问会发现速度有了很大提高。

6. 配置 Django 博客中静态资源地址为加速域名

通过七牛云的CDN加速域名,我们就可以快速访问静态资源了,但是博客中还是用老域名访问静态资源,速度当然不会提升了!这里需要我们手动配置下博客,将 yangyingming.com/static/xxx.jpg 这样的静态资源访问链接改为 cdn.yangyingming.com/static/xxx.jpg 的格式。

修改博客源码中 settings.py 文件:

# 静态文件
# STATIC_URL = '/static/'
STATIC_URL = 'http://cdn.yangyingming.com/static/'
# 上传配置
# MEDIA_URL   = '/uploads/'
MEDIA_URL = 'http://cdn.yangyingming.com/uploads/'

这样只要你在模板中静态文件 url 是用 {% static '/static/xxx.jpg' %} 渲染的,那么会自动更改。

这一步我卡了好久,很多博客到七牛云加速域名配置完成后就没有继续介绍加速域名怎么应用到网站中,自己琢磨了一下找到了 Django 博客配置的可行方法,供大家参考。

参考资料

  • 融合CDN-快速入门(七牛云官方文档)
    https://developer.qiniu.com/fusion/manual/1228/fusion-quick-start

  • 七牛云融合CDN到底怎么配置?
    https://blog.csdn.net/javaer_lee/article/details/53521176

  • 配置七牛自定义域名cdn加速,让你的网站飞起来
    https://liuyanzhao.com/2176.html

更新数据库中图片链接为 CDN 格式

下面这一步是我博客的个人步骤,因为有些图片链接是写死在数据库中的,所以我还需要批量更改下数据库中的图片链接格式为CDN格式。

目的

将 mysql 数据库中所有文章的 markdown 图片链接转换为 cdn 格式,比如:

![](/uploads/xxx.jpg) => ![](http://cdn.yangyingming.com/uploads/xxx.jpg)

这样我们在访问这个静态资源时,就能从 cdn.yangyingming.com 这个加速域名中快速获取了。

代码:

#coding=utf8
import re
import pymysql

db = {
    'host' : 'your_ip',
    'port' : 3306,
    'user' : 'your_username',
    'passwd' : 'your_password',
    'db' : 'your_db',
    'charset' : 'utf8',
}

conn = pymysql.Connect(host=db['host'],port=db['port'],user=db['user'],passwd=db['passwd'],db=db['db'],charset=db['charset'])
cursor = conn.cursor()

print('正在查询数据库......')

# 迭代全部记录
for id in range(500):
    sql = 'select * from blog_article where id=%d'%id
    res = cursor.execute(sql)
    # 空记录,跳出
    if res == 0:
        continue
    # 不是空记录,取出数据
    row = cursor.fetchone()

    # 获取文章摘要和文章内容字段等相关信息
    title = row[1]
    desc = row[2]
    content = row[3]
    isMarkdown = row[-3]


    # 只处理 markdown 文本
    if isMarkdown != 1:
        row = cursor.fetchone()
        continue

    print('[%d] 开始处理《%s》......'%(id, title))

    # 替换文章摘要和文章内容字段的 uploads 链接部分为 cdn 格式
    pattern = re.compile(r'!\[\]\(/uploads/(.*?)\)')
    content = re.sub(pattern, lambda m:'![](http://cdn.yangyingming.com/uploads/'+m.group(1)+')', content)
    desc = re.sub(pattern, lambda m:'![](http://cdn.yangyingming.com/uploads/'+m.group(1)+')', desc)

    # 转义双引号和单引号
    content = pymysql.escape_string(content)
    desc = pymysql.escape_string(desc)

    # 更新替换之后的摘要和内容
    sql_update = \
    '''
    UPDATE blog_article SET `content` = "%s",`desc` = "%s" WHERE id = %d
    '''%(content, desc, id)
    cursor.execute(sql_update)

    # 执行改动
    conn.commit()

cursor.close()
conn.close()

参考资料:

  • Fetching row by row from MySQL in Python
    https://kushaldas.in/posts/fetching-row-by-row-from-mysql-in-python.html

  • python操作mysql数据库实现增删改查
    https://www.cnblogs.com/wangyayun/p/6687473.html

  • python 调用pymysql模块遇到\转义问题解决办法
    https://www.cnblogs.com/renfanzi/p/6265235.html

  • pymysql(一)检索、增加、更新、删除数据
    https://blog.csdn.net/m0_37422217/article/details/76696740

  • nginx下强制跳转到www域名
    https://www.cnblogs.com/renew/p/7910641.html

效果

博客开启 CDN 之后速度有了大幅提升,之前20秒的龟速加载速度一下子提升到了2秒左右,舒爽。

之前:

现在:

原创声明

转载请注明:呓语 » 为 Django 博客免费开启七牛云 CDN 加速