这周我的网站备案被我注销了,因此带来了一场网站访问危机。其中最大的问题就是我使用的七牛云图床随着备案的注销直接把我配置的图床子域名冻结了,导致我博客使用的图片直接无法访问。这篇文章记录一下我在这场事件中的处理方案。

前言

事件背景

首先说一下国内的政策:首先,根据规定,服务器在国内的网站,必须备案才能上线,否则很可能直接被封,导致网站无法访问。而备案一般都是由云服务商代为提交备案,所以就是你的服务器在哪家云厂商,就由哪家代为提交备案。

我最开始备案的时候云服务器在阿里云,所以当时是提交资料让阿里云备案的,最后备案成功也是挂载阿里云这边的。而去年开始我的云服务器改到了腾讯云,最近阿里云的人就告知我由于服务器没有使用他们的让我把备案迁走。

当前的问题

自动备案注销之后,我其实面临了三个问题:

  1. 注销之后重新申请备案需要先等域名信息备案管理系统把我之前备案的记录删除才可以在云平台提交申请,因此我在等待备案审批之前还要先等待注销清理,这将是一个非常不确认的时间
  2. 备案注销后,网站可能随时面临无法访问的风险,根据国内网站的规定,没有备案的网站很可能直接被封
  3. 网站的子域名也丢失了备案信息,导致在七牛云配置的存储空间被冻结,进而导致我网站使用的图床全部失效,图片无法访问

前两个问题其实还好,至少目前为止网站还可以访问,至于备案,也只是时间问题,但是第3个问题直接影响了我网站的访问,不得马上解决。

七牛云图床失效的解决方案

解决七牛云图床失效的问题,我采取了两个方案,其中方案一是临时方案,但是也是操作代价最小的方案;方案二是一个灾备方案,两者可以结合起来使用。

方案一:使用临时空间

首先,图床失效的问题根本原因是个人给空间配置的子域名失效了,导致空间里面的内容无法访问也无法下载,而不是内容消失了,所以解决的根本方法就是如何再生成一个子域名。

我首先使用了一个临时方案,就是重新创建了一个空间(跟原本的不同域),因为七牛云会默认给新创建的空间分配一个有效期为30天的临时域名,这样就可以临时白嫖30天。

创建异地临时空间

直接在空间管理中创建一个新的空间,最好是异地,这样方便进行跨域同步。

然后添加一个跨区域同步任务,将原本的空间的数据全部同步给新空间。

同步完成任务配置之后,就会自动开始同步数据,并且每当有新文件上传到旧空间也会自动同步到新空间,由此就可以使用新空间的临时域名访问原来的图片了。

修改 Nginx 中子域名

当确认使用新空间的临时域名也可以访问原本的图片后,就可以去Nginx修改配置,将原本配置为私有子域名的地方换成新空间的临时域名。

比如我的配置:

# 图床映射,添加自己的图床地址即可
    location ^~ /cdn/ {
        #proxy_pass http://pic.tendcode.com/;
        proxy_pass http://**.hb-bkt.clouddn.com/;
    }

配置生效之后,查看博客的图片显示,可以看到已经全部恢复,并且之后上传到原空间的图片也可以很快就可以访问。

这个方案只是临时解决问题,但是缓冲期有一个月,足够搞定备案了,等到备案搞定之后再把子域名修改回来即可。

方案二:使用本地文件

上面的临时方案虽然可以暂时解决图床访问问题,但是只有30天有效期,肯定不能就这么算了。

而且由于这次的备案问题导致图床直接无法访问和下载也是让我意识到了使用图床的风险,一旦图床失效,直接导致我网站的图片无法访问,如果哪天图床文件都找不回来了,我岂不是直接丢失了这些图片。想到这里,我不得不长远考虑……

于是,我想到了把图床数据备份到本地。

使用 rclone 备份数据到本地

关于如何把云平台的对象存储文件同步到本地,我找到了一个有效的开源工具 rclone,这个命令行工具支持各种支持 S3 协议的对象存储的数据同步,可以很方便的将整个七牛云空间的数据同步到本地。

rclone的安装和使用这里不过多描述,直接见官网就行,我也是按照文档操作的。

使用官方推荐的下载安装脚本进行安装:

sudo -v ; curl https://rclone.org/install.sh | sudo bash

然后生成一个七牛云的配置文件,具体生成方式参考文档:七牛云配置

比如生成后,我的配置文件 ~/.config/rclone/rclone.conf 内容大概是这样的:

[qiniu_north]
type = s3
provider = Qiniu
access_key_id = ***************************
secret_access_key = ***************************
region = cn-north-1
endpoint = s3-cn-north-1.qiniucs.com
location_constraint = cn-north-1
acl = public-read
storage_class = STANDARD

首先创建一个本地目录用来存放文件:

mkdir -p /var/www/html/cdn/

然后执行命令将整个空间的文件复制到本地,并忽略已经存在的文件(增量同步):

rclone copy qiniu_north:blog-img-2 /var/www/html/cdn/ --ignore-existing -v -P

第一次执行会需要一定的时候,可以看到同步进度,后续执行就是增量同步,只会同步新增的文件,比较快,可以看到类似输出:

2024/08/29 18:09:56 INFO  : 2024/08/202408291750433.png: Copied (new)
2024/08/29 18:09:56 INFO  : 2024/08/202408291757563.png: Copied (new)
Transferred:      412.853 KiB / 412.853 KiB, 100%, 0 B/s, ETA -
Checks:               450 / 450, 100%
Transferred:            2 / 2, 100%
Elapsed time:         0.8s
2024/08/29 18:09:56 INFO  : 
Transferred:      412.853 KiB / 412.853 KiB, 100%, 0 B/s, ETA -
Checks:               450 / 450, 100%
Transferred:            2 / 2, 100%
Elapsed time:         0.8s

然后可以设置成定时任务,定时同步:

0 * * * * /bin/rclone copy qiniu_north:blog-img-2 /var/www/html/cdn/ --ignore-existing -v -P >> '/var/log/rclone.log' 2>&1

Nginx 配置本地图片访问

将图床文件同步到本地后,就可以配置一下 Nginx 访问规则,将图片文件的访问改成本地,我原本的配置是这样的:

location ^~ /cdn/ {
        proxy_pass http://pic.tendcode.com/;
    }

改成本地访问之后就是这样的:

location ^~ /cdn/ {
        # 本地文件
        root /var/www/html;
        autoindex off;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
    }

当然,这个本地访问的配置被我验证成功之后就注释掉了,我目前还是使用的图床配置,只不过经过这次的事情之后,我的博客相当于支持了远程和本地两种方式的配置,这是更加稳妥的。

总结

免费图床的使用还是有一定风险的,图片是网站非常重要的一种资源,一旦失效,影响是非常大的,因此,为了避免丢失的风险,尽量还是在本地做一次定时同步,将远程的资源在本地进行一次备份,这样才可以放心的使用远程数据。

后记

一个多星期的备案停站直接把网站的访问量搞没了,这是我网站的访问量统计数据:

访问量