备份的网站文件和数据库,存放备份是个问题。存放到哪里更安全可靠,且要实现自动循环备份,不用手动操作就完美了。找了很多的资料,有使用ftp自动上传到本地的循环备份方法,还有使用阿里的对象存储OSS循环备份的……但是配置这些又得花费不少的时间(对我而言)。
网上搜索参考了一些资料,其实相关的资料并不多,还非常的零散且并没有适用性。因为每个人的环境配置都不会相同,因此资料仅能作为参考,最后是否能配置成功,还是得自己花时间去摸索、测试。我这里选择了对象存储OSS,这个我觉得是最放心、省心的,前提是自己能配置成功。(从来没有接触过的产品,还要购买存储容量。40G存储容量,半年5元,就玩一下吧。流量、请求数都是需要按量计费的。)
一、安装 Python SDK
环境准备
OSS Python SDK适用于Python 2.6、2.7、3.3、3.4、3.5版本。
查看版本
执行命令python -V查看Python版本。
查看版本后,使用 exit() 退出python。(我没用过还真不知道怎么退出)
安装python-devel
[root@iz2zecnv***0sp3z ~]# yum install python-devel
Loaded plugins: fastestmirror
base | 3.6 kB 00:00
epel | 3.2 kB 00:00
extras | 3.4 kB 00:00
mysql-connectors-community | 2.5 kB 00:00
mysql-tools-community | 2.5 kB 00:00
mysql57-community | 2.5 kB 00:00
updates | 3.4 kB 00:00
webtatic | 3.6 kB 00:00
(1/2): epel/x86_64/updateinfo | 939 kB 00:00
(2/2): epel/x86_64/primary | 3.6 MB 00:00
Loading mirror speeds from cached hostfile
* webtatic: uk.repo.webtatic.com
epel 12782/12782
Resolving Dependencies
--> Running transaction check
...
Complete!
安装SDK
[root@iz2zecnv***0sp3z ~]# pip install oss2
Collecting oss2
Downloading http://mirrors.aliyun.com/pypi/packages/fe/c6/ab8293c1bcfa5487fe8326c29714767b085d2475fec30d59b71ca77ea006/oss2-2.*.0.tar.gz (139kB)
100% |████████████████████████████████| 143kB 1.5MB/s
...
Successfully installed aliyun-python-sdk-core-2.*.4 aliyun-python-sdk-kms-2.*.0 crcmod-1.7 oss2-2.*.0 pycryptodome-3.*.2
You are using pip version *.*.*, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
验证SDK版本
[root@iz2zecnv***0sp3z ~]# python
Python 2.*.* (default, Oct 30 2018, 23:45:53)
[GCC 4.*.* 20***3 (Red Hat 4.*.*-*)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import oss2
>>> oss2.__version__
'2.*.0'
>>>
验证crcmod
>>> import crcmod._crcfunext
>>>
没有任何提示,表明crcmod库的C扩展模式安装成功。如有错误提示,请参考阿里官方文档。
二、创建存储空间(Bucket)
这里直接在对象存储OSS控制台创建即可。

主要注意区域,相同区域内的产品内网可以互通不计流量。读写权限设为私有,必须的。至于其他的设置,创建好空间之后进入基础设置,再根据自己的需要设置完成即可。
三、配置服务器备份及上传脚本
python脚本,负责上传到OSS的upload.py
如下代码:
# -*- coding: utf-8 -*-
from __future__ import print_function
import os, sys
import oss2
auth = oss2.Auth('LT**AccessKeyId**fX', '8u**AccessKeySecret**ha')
bucket = oss2.Bucket(auth, 'https://oss-cn-**Endpoin**-internal.aliyuncs.com', 'f**bucket**s')
#本地文件路径,要传入参数
filePath = sys.argv[1]
#传到OSS上的名称
fileName = filePath.split("/")[-1]
#上传进度条
def percentage(consumed_bytes, total_bytes):
if total_bytes:
rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
print('\r{0}% '.format(rate), end='')
sys.stdout.flush()
#上传文件
oss2.resumable_upload(bucket, fileName, filePath, progress_callback=percentage)
print('\rUpload to OSS Success!')
以上代码,我们需要填上AccessKeyId与AccessKeySecret,还有Endpoint与bucket,其他的不用修改。我就是在这个脚本这里浪费了许多时间,因为不懂怎么传入参数。
其实是非常多的不懂,包括首次测试执行upload.py还遇到了问题。必须python /路径/upload.py
测试upload.py过程中,总是上传失败。比如我要上传/backup/mysql_bak.gz
传入参数执行,成功上传了。
python /root/upload.py /backup/mysql_bak.gz
因为我们备份的数据库文件的文件名是一个年月日时间命名的文件,文件名是一个变量,所以我们传入的这个参数也必须是一个变量。
用sh脚本执行upload.py传入参数
#!/bin/bash
DATE=`date +%Y%m%d%H%M`
FILENAME=wpcontent
BACKUP_PATH=/backup
python /root/upload.py ${BACKUP_PATH}/${FILENAME}_${DATE}.tar.gz
sh脚本代码中的DATE我们要修改一下,不能计算到分钟。计算到分钟的话,备份数据库与上传是没问题。备份网站文件的话,如果文件容量比较大,压缩时间比较长。那么备份网站开始的时间如果是19点35分,完成备份之后花费了5分钟,到19点40分才执行upload.py问题就来了。会出现找不到文件,因为变量(时间已经过去了5分钟)
因此修改DATE参数,只需精确到小时即可。
#!/bin/bash
DATE=`date +%Y%m%d%H`
备份网站并上传到OSS
我这只备份WordPress的wp-content这个文件夹。
#!/bin/bash
DATE=`date +%Y%m%d%H`
fileName=wpcontent
BACKUP_PATH=/backup
html_PATH=/var/www/html/wp-content
###这里-czPf参数,如果不加上P的话,会提示tar: 从成员名中删除开头的“/”###
tar -czPf $BACKUP_PATH/${fileName}_${DATE}.tar.gz $html_PATH && python /root/upload.py ${BACKUP_PATH}/${fileName}_${DATE}.tar.gz
###打包压缩好网站文件&&然后执行上传到OSS###
###本地保留5天的备份文件###
find ${BACKUP_PATH} -mtime +5 -name "${fileName}_*.tar.gz" -exec rm -f {} \;
数据库备份这里不说了,到这里基本完成站点备份的工作。对象存储OSS那边,设置一下生命周期,我觉得已经满意了。可以高枕无忧了,不然这几天一直都在折腾这搬迁刚刚结束的网站。
就到这里先吧,太累了,需要休息一段时间,再找东西折腾。