Alien的博客

静态网站迁移至阿里云OSS的实战过程

本文为参加阿里云最佳上云实践评选所撰写

之前公司里有大量的静态网站需要维护,一直以来都是用Nginx来提供服务,相关同事通过FTP来管理网站。网络结构是这样的。

维护起来真是累死人了,要给每个人创建一个FTP账号,每个FTP账号权限还都不一样。服务器上还要做负载均衡,还要做数据同步。每天还担惊受怕,担心服务器上宕机。后来实在忍不了了就去决定把这些网站全面迁移至阿里云的OSS上,阿里云的OSS直接可以提供web服务的。

接下来就简单介绍一下我迁移网站的过程以及遇到的一些问题。

一、网站文件迁移

首先根据静态网站的数量创建了一大堆的Bucket,这里刚上来就遇到了一点小问题,当我创建Bucket的时候,提示”Bucket数量超过上限”,于是我火速给提了工单给阿里云,阿里云工程师答复说每个账号默认最多创建10个Bucket,在我的要求下,工程师允许我多开了几个Bucket。创建完Bucket后就可以把网站文件都上传了,因为我创建Bucket时设置的是公共读的权限,所以会自动生成一个Bucket域名供用户访问的,在”Bucket属性”中的”域名管理”中就可看到,通过这个域名可以查看网站是否正常。

二、更改域名指向

这个时候访问Bucket的域名就可以访问网站了,但是我们需要使用自己的域名才行。这里只需两步搞定。

首先依然在”Bucket属性”中的”域名管理”中,添加一个自己的域名。

然后去DNS服务器上把自己域名添加一个CNAME记录,指向此Bucket的外网域名。

等待DNS缓存刷新之后访问自己的域名就可以实现网站的访问啦

至此,其实网站的迁移就已经结束了,但是还有许多细节要调整呢。

三、默认首页

我们平时访问http://alientest.oss-cn-hongkong.aliyuncs.com/和http://alientest.oss-cn-hongkong.aliyuncs.com/alien/ 这种域名的时候会自动访问所在目录下的一个默认首页的,这里也是需要在OSS上配置一下才行的。

在”Bucket属性”中的”静态网站”页面,直接写一个默认首页的文件名就可以了。

但是这OSS上这样的设置只能在访问根目录的时候生效,在访问http://alientest.oss-cn-hongkong.aliyuncs.com/alien/这种子目录的时候依然访问的是http://alientest.oss-cn-hongkong.aliyuncs.com/index.html页面,我还以为阿里云的出了BUG,于是赶紧向阿里云的工程师咨询。结果阿里云的工程师答复说OSS的网站功能就是这样设计的,不支持子目录下的默认首页。这下我就犯难了,难道这种子目录就必须使用绝对路径来访问么?

后来我们老大给出了一个让我相当佩服的解决方法,在根目录下的index.html文件中加了一段JS代码让他检测访问的路径实现跳转。

这种代码的意思就是如果访问的路径中包含/alien/那么就跳转到http://alientest.oss-cn-hongkong.aliyuncs.com/alien/index.html这个页面中。完美解决了子目录中不支持默认首页的功能。

(以上Bucket和域名都是我为了写这篇文章临时创建的)

四、访问日志

之前使用Nginx的时候是可以通过日志来检查网站有没有异常,在OSS中日志需要手动开启,先创建一个用于存放日志的Bucket,然后在网站的Bucket里”Bucket属性”-“日志管理”中指向新创建的Bucket就行了,可以把所有网站的Bucket日志都放到一个Bucket中,使用日志前缀来区分。

利用阿里云的其他服务来分析日志这事儿我这篇文章里就先不写了。OSS上对静态网站的支持还有一些其他的功能这里也暂时不写了,大家自己去摸索吧,都挺简单的。

五、权限管理

之前是有些同事是通过FTP可以管理网站内容的,在OSS身上要实现类似的功能就要借助于他的”访问控制 RAM”(https://ram.console.aliyun.com/)产品了。

通过”访问控制”可以创建子账号,并且根据需求赋予子账号不同的权限。

首先呢,在”用户管理”中新建要给用户,这个很简单了就不说了。

复杂的是需要给这些用户分配策略,在RAM内置的策略中OSS相关的策略只有两个,”AliyunOSSFullAccess”和”AliyunOSSReadOnlyAccess”,一个是可以读写OSS中的所有数据,另一个是可以读OSS中的所有数据,这两个策略权限都太大了,我这里需要具体控制到OSS下的每个Bucket的权限,只能自己自定义授权策略了。

我这里就简单给出两个例子吧,也是我其中正在用的策略。

第一个是授予访问OSS中alientest这个Bucket的所有权限,就是可读可写可删。


 {
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListBuckets"
      ],
      "Effect": "Allow",
      "Resource": "acs:oss:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": "oss:*",
      "Resource": [
        "acs:oss:*:*: alientest",
        "acs:oss:*:*: alientest /*"
      ]
    }
  ]
}

第二个是授予访问OSS中alientest这个Bucket的只读权限。


 {
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:ListBuckets",
        "oss:GetBucketAcl"
      ],
      "Effect": "Allow",
      "Resource": "acs:oss:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects",
        "oss:GetObject"
      ],
      "Resource": [
        "acs:oss:*:*: alientest",
        "acs:oss:*:*: alientest/*"
      ]
    }
  ]
}

自定义策略写起来还是挺简单的,可以很灵活的定义各种不同的策略。创建完策略后就可以把策略授权给不同用户了。

这样就把各种权限就开放给其他同事了,我在也不用管理一大堆账号密码了,省心啊。

六、用CDN给网站加速

利用阿里云的CDN服务给OSS的网站加速好处是大大的。首先加快网站的访问就不说了,最重要的是省钱啊,OSS的外网访问费用是00:00-08:00(闲时):0.25元/GB

8:00-24:00(忙时):0.50元/GB。而阿里云的CDN按照流量计费的话在10T流量内只需0.36元/GB,而且用得越多与便宜,况且CDN还能选择按照带宽计费。

启用CDN功能也是两步搞定。

首先在阿里云的CDN上添加一个新域名,源站类型选择OSS,并且指定Bucket。

创建完成后在域名的"基本信息"中有一个CNAME的域名,在DNS服务器上把这个域名指向这个CNAME就行啦。

七、使用HTTPS访问网站

既然都写到这里了,那就继续进一步吧,让网站支持HTTPS。

也是非常简单的。首先在阿里云的云盾(https://yundun.console.aliyun.com)中的"证书服务"中申请一个证书(有免费的证书哦)。

申请成功后直接点"推送",推送到CDN。

然后就完事儿了,比Nginx上简单多了吧。

然后可以在CDN上设置是否强制使用HTTPS。另外这里要说一下的是启用HTTPS服务后,CDN的使用会多花一点钱的,具体去查CDN资费吧,其实也不贵。

好了,以上就是我迁移网站到OSS上的整个过程,介绍了我目前用到的一些主要的功能,在迁移过程中遇到的一些坑我写在里面了,希望对你有所帮助。