网站静态资源迁移到阿里OSS的方法,不需要更改网站源代码

随着网站的运行,网站里的静态资源越来越多,网站不仅包含自身的脚本,样式,配图等静态资源,还包括网站内容的需要上传的图片。图片一多,就需要考虑将图片单独分离出去来减轻服务器的IO读写。自建图片服务器虽然没有技术难度,但是考虑到时间,冗余,备份,性能等成本,最后放弃了自建图片服务器,选择使用阿里的OSS+CDN来做网站的静态资源存储。具体方法如下:

1,首先需要准备一个域名或者已有域名的二级域名来引用站点里的静态资源,单独域名做静态资源的引用的好处网上很多,可以根据需要来处理。

2,根据需要购买阿里的OSS和CDN服务,【阿里的OSS和CDN对域名只需要备案,并不要求必须接入阿里云,简化了许多流程】

3,在oss控制台创建Bucket,用来存储自己的静态资源。由于是通过CDN进行访问,不单独进行访问所以读写权限设置成了私有。在CDN里开启私有Bucket回源即可。

4,将服务器上现有的静态资源同步到阿里OSS创建的Bucket里。阿里针对OSS提供了很多可用的工具,根据需要进行选择即可。【阿里OSS工具汇总页面:https://help.aliyun.com/document_detail/44075.html?spm=5176.doc32204.6.1025.IMy0ZG】最后选择了ossutil这个命令行工具进行数据同步,之所以选择这个工具一是没有依赖,二是本身静态资源也就几百G,没必要使用ossimport2这类的工具进行同步。下载工具后,记得将ossutil的路径添加到Windows的系统环境变量里,方便使用。

在CMD里执行同步命令:


x: 切换盘符。
cd x:\files 进入到files文件夹
ossutil64.exe config -e EndPoint -i AccessKeyID -k AccessKeySecret  配置工具替换成自己的id和key
ossutil64.exe cp uploads/ oss://bucket/uploads/ -r -f -u  --snapshot-path=log/
 将uploads文件夹下的内容全部上传到bucket里的uploads文件夹下【oss其实没有文件夹概念的】.
更多ossutil用法可以使用ossutil64.exe help cp进行查看。

5,就是将上传的图片自动同步到阿里的oss里面。为了不修改网站代码,只能从服务器上保存图片的文件夹入手。对服务器上保存图片的文件夹进行监控,有文件创建就提交到oss上。需要用到一个小工具inotifywait 地址:https://github.com/thekid/inotify-win,需要写一个命令行程序通过管道接收inotifywait的文件地址。
syncfileOSS.exe主要代码


namespace syncfileOSS
{
class Program
{
private static Queue ossuploadqueue = new Queue();
static void Main(string[] args)
{
Task.Factory.StartNew(()=>{
while(true)
{
while(ossuploadqueue.Count>0)
{
string path=ossuploadqueue.Dequeue();
foreach (string localdir in appConfig.GetLocalDire())
{
if (path.ToLower().StartsWith(localdir.ToLower()))
{
try
{
//Console.WriteLine("正在向阿里OSS提交文件:" + filepath);
//Console.WriteLine("oss路径:" + appConfig.Ossprefix(s) + filepath.Replace(s, "").Replace("\\", "/"));
log.Info("正在向阿里OSS提交文件:" + path);
appConfig.PutObject(appConfig.Ossprefix(localdir) + path.Replace(localdir, "").Replace("\\", "/"), path);
}
catch(Exception ex)
{
string msg = ex.Message;
if (msg.IndexOf("because it is being used by another process") != -1)
{
ossuploadqueue.Enqueue(path);
Thread.Sleep(300);
}
log.Info("提交失败:" + path + ";错误信息:" + msg);
//Console.WriteLine("提交失败:" + filepath);
}
break;
}
}
}
Thread.Sleep(appConfig.delaytime);
}
});
string line;
while ((line = Console.ReadLine()) != null)
{
string[] lineArr = line.Split(' ');
string eventtag = lineArr[0];
if (eventtag.IndexOf("ISDIR") != -1)
{
continue;
}
string filepath = lineArr[1];
log.Info("正在提交文件:" + filepath);
if (!ossuploadqueue.Contains(filepath))
{
ossuploadqueue.Enqueue(filepath);
}
//Console.WriteLine("正在提交文件:"+filepath);

}
}
}
}

appConfig.cs


namespace syncfileOSS
{
public class appConfig
{
private static string accessKeyId = ConfigurationManager.AppSettings["accessKeyId"].ToString();
private static string accessKeySecret = ConfigurationManager.AppSettings["accessKeySecret"].ToString();
private static string endpoint = ConfigurationManager.AppSettings["endpoint"].ToString();
private static string localmaposs = ConfigurationManager.AppSettings["localmaposs"].ToString();
private static string bucketname = ConfigurationManager.AppSettings["bucketName"].ToString();
///
/// 延迟多少毫秒执行
///
public static int delaytime = Convert.ToInt32(ConfigurationManager.AppSettings["delaytime"].ToString());
private static List locallist =new List();
private static Dictionary maposs = IntiDic();

private static Dictionary IntiDic()
{
Dictionary dict = new Dictionary();
if (string.IsNullOrEmpty(localmaposs)) return dict;
string [] localArr = localmaposs.Split(';');
foreach (string str in localArr)
{
string[] strArr = str.Split('|');
locallist.Add(strArr[0]);
dict[strArr[0]] = strArr[1];
}
return dict;
}
///
/// 获取oss存储的prefix
///
///
 ///
public static string Ossprefix(string localpath)
{
if (maposs.ContainsKey(localpath))
{
return maposs[localpath];
}
return "other/";
}

public static string[] GetLocalDire()
{
return locallist.ToArray();
}

private static OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);
public static void PutObject(string key, string fileupload)
{
client.PutObject(bucketname, key, fileupload);
}
}
}

配置文件信息:


<configuration>
<appSettings>
<add key="accessKeyId" value="AccessKeyID"/>
<add key="accessKeySecret" value="AccessKeySecret"/>
<add key="endpoint" value="EndPoint"/>
<add key="bucketName" value="bucket名字"/>

<!-- localmaposs本地文件夹与阿里oss prefix对应关系,用|分隔,多个对应关系用;分隔,本地文件夹以\结尾-->
<add key="localmaposs" value="x:\pic\test\|news/test/"/>

<!--delaytime 延迟多少毫秒提交 默认为300毫秒  如果不需要实时提交图片,可以设置的时间稍微长一些。-->
<add key="delaytime" value="300"/>
</appSettings>
</configuration>

批处理执行方法


inotifywait.exe -rmq -e create --format "%%e %%w\%%f %%T" x:\pic\test | syncfileOSS.exe
即可监控指定文件夹下文件的创建。

附阿里oss迁移工具程序含源码

分享到:
此条目发表在 Net 分类目录。将固定链接加入收藏夹。

评论功能已关闭。