WordPress挂载阿里云OSS+CDN加速网页并获得256T空间
本文最后更新于 996 天前,其中的信息可能已经有所发展或是发生改变。

使用前介绍

对于WordPress来说,用户上传的文件、主题都在wp-content目录下,首先会占据服务器磁盘空间,然后用户的访问可能因此受到服务器带宽的限制。不管是哪一点,这次的文章可以将OSS空间直接作为wp-content的空间,换句话说就是用户上传的文件会直接到OSS,配合CDN就可以做到分布式加速,可以说非常的nice。对于一些宽带较小的服务器来说还是可以的。

这种方法最棒的地方在于,附件上传空间变为OSS,有256T空间去上传,不再怕VPS空间小了。并且可以附带的是,还可以配合CDN进行分布式地区加速,对带宽又可以很友好了。

虽然说阿里云OSS可以挂载不同地区不同提供商的服务器,但是对于同地区的阿里云服务器,阿里云的OSS提供内网访问,也就可以省去一部分的传输费用。

因为可能WordPress更新之类的操作会用到wp-content目录,所以可能快速的文件操作会导致一些额外的费用,因此本文将以wp-content/uploads文件夹为例,完成仅对上传的文件进行操作的示例。
本文以CentOS、Nginx为例
注意事项
由于挂载的磁盘目录是通过网络进行操作的,所以由于不同服务器的网络环境不同,可能出现上传图片等附件或处理上传的文件时间变长的现象,请根据自己实际需求来考虑。并且可能因为一些WordPress插件可能对挂载目录进行多次、快速访问,造成插件后台变慢、OSS额外收费等,请及时查看相关信息并决定是否继续使用。

开始前的必要操作

  1. 请你一定要备份,因为我也不知道由于各种原因你的文件会不会丢失,如果你不备份,出现的损失就要你自己承担了(只要备份了,失败之后还是很容易恢复的)。本文所有内容不一定我自己实践过,而是有些扩展内容是根据经验写出的,所有一定要有备份以防出现问题(不管是因为我的内容还是不同版本之间的差异)。至少要对你操作的文件夹进行备份,例如本文处就要备份wp-content/uploads文件夹,执行例如下面这样的代码。
cp uploads/ uploads-bak # 备份一份
  1. 创建一个阿里云OSS容器,如果你还没有开通阿里云OSS,可以在这里开通:阿里云OSS。此处为了节省一些不必要的开支,可以不用开启类似同城备份、版本控制之类的额外消费项目(如果你需要的话,那就没事了),记得读写权限那里要选择公共读,以便CDN访问方便。如果你使用的也是阿里云的服务器,尽量选择相同地区的OSS,这样可以节省传输费用。然后留意一些下面的Endpoint
Endpoint
  1. 安装ossfs,按照官方[1]的方法,可以用以下代码来完成(CentOS)
wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm
sudo yum install ossfs_1.80.6_centos7.0_x86_64.rpm

4. 按照ossutil(可选,wp-content/uploads文件较多的时候可以用这种方法查看迁移进度)。安装方法和配置可以查看官方的教程:https://help.aliyun.com/document_detail/120075.html。大概步骤就是:

wget http://gosspublic.alicdn.com/ossutil/1.7.5/ossutil64 #注意下载位置
chmod 755 ossutil64
./ossutil64 config #根据官方给出的教程配置ossutil
ln -s /path/to/ossutil64 /usr/local/bin #执行后可直接使用ossutil64进行访问,而不需要进入目录。注意替换路径

挂载OSS到目录

参考官方[2]的做法,首先对ossfs进行配置:在/etc/passwd-ossfs文件中按$bucket_name:$access_key_id:$access_key_secret的样式添加内容。其中bucket_name是你创建的oss bucket的名字,access_key_id和access_key_secret为阿里云账户的access key信息,如果没有可以在https://ram.console.aliyun.com/manage/ak中生成一个。(为了安全考虑,推荐使用阿里云自己也推荐的子账户access key方法。)

echo $bucket_name:$access_key_id:$access_key_secret >> /etc/passwd-ossfs # 注意替换其中的内容
chmod 640 /etc/passwd-ossfs # 官方建议的文件权限

准备文件

接下来在挂载之前,我建议提前将文件上传至OSS。为了方便后续访问,记得将文件上传至OSS的对应目录(例如本文需要上传到OSS的/wp-content/uploads文件夹),如果没有的话记得提前建立(可以使用ossutil的mkdir命令,也可以直接在OSS网页端的文件管理新建目录)。

上传方式有两种:非ossutil式ossutil式,非ossutil式由于不显示传输进度,建议仅在文件较少较小的情况下使用,否则建议用ossutil。

非ossutil方法

mkdir /tmp/uploads # 建立临时目录
systemctl stop nginx # 停止网页服务器,防止由于网页运行增加新的页面
cd /path/to/wp-content/uploads # 导向uploads文件夹
mv * /tmp/uploads

暂时先将文件移动到/tmp/uploads,等挂载完毕后移动回去就算上传了。

开始挂载

接下来我们开始挂载,目前uploads文件夹应该已经是空的了。首先为了保证目录的所属人正确,记得使用id命令查看一下你的nginx的用户的uid和gid:

[root@localhost]# id www
uid=1001(www) gid=1001(www) groups=1001(www)

然后执行挂载:

ossfs $bucket_name:/wp-content/uploads /path/to/wp-content/uploads -ourl=oss-cn-beijing-internal.aliyuncs.com -ouid=1001 -ogid=1001 -oumask=007 -o allow_other

其中的bucket_name是你的OSS容器名字;记得更换其中本地uploads文件夹的路径$bucket_name:/wp-content/uploads是指把容器内的/wp-content/uploads文件夹挂载过来;-ourl的参数上面所说的Endpoint的链接,同地区阿里云服务器使用带internal的内网访问可避免公网传输费;-ouid、-ogid参数是刚刚id命令查出的用户的uid和gid,可以保证用户所属正确;剩下的参数是目录权限,具体可以参考官方文档[3]

挂载完成后,如果你使用了宝塔面板,可以看到在文件管理或者首页看到一个256T的挂载磁盘

挂载点

并且可以在文件管理处直接管理OSS文件,其中的修改也会同步到OSS。也就是说以后上传的图片都会在这里并同步到OSS。

刚刚没有使用ossutil的朋友注意

你现在需要将刚刚临时存储的文件移动到OSS挂载的目录,来达到上传文件的目的:

cd /tmp/uploads # 转至刚刚的临时目录
mv * /path/to/wp-content/uploads/ # 移动所有文件到刚刚挂载的目录

这个过程没有任何提示信息显示,所以要等待它自己完成。具体时间要看服务器带宽、文件数量和大小决定。

最后我们把刚刚停止的Nginx启动回来

systemctl start nginx

设置开机自启动

对于CentOS来说,直接在/etc/rc.d/rc.local中添加刚刚执行挂载的命令就可以了,这个文件会在开机自动执行,然后挂载OSS。可以使用下面的方法,也可以直接vim /etc/rc.d/rc.local来用编辑器添加

# 记得替换内容,引号为刚刚执行的挂载命令
echo "ossfs $bucket_name:/wp-content/uploads /path/to/wp-content/uploads -ourl=oss-cn-beijing-internal.aliyuncs.com -ouid=1001 -ogid=1001 -oumask=007 -o allow_other" >> /etc/rc.d/rc.local

目前为止我们就已经完成了挂载OSS的全部操作。

开启CDN加速

配置阿里云CDN

首先要开通阿里云CDN,已开通的话可以跳过。没开通的自行开通即可。

回到我们刚刚的OSS管理页面,在左侧传输管理->域名管理中添加要使用的CDN域名

添加要使用的CDN域名

添加后,点击域名对应的阿里云CDN加速下面的未配置,即可跳转到CDN配置界面。

CDN配置

填写域名和相关信息后,选择适合自己的CDN配置,然后再新增原站信息中选择OSS域名,在下拉菜单中选择之前创建的OSS域名(一般是容器名+endpoint)。

如果需要验证域名,就根据提示去验证。添加完成后去DNS服务商那里添加对应的CNAME解析记录(CloudFlare记得选DNS only)

添加完成后可以看到下面的样子

开启HTTPS

一般来说为了安全也要开启HTTPS,不然浏览器也显示不安全,阿里云CDN也支持免费的SSL证书。

点击上图的配置按钮,点击新页面左侧的HTTPS配置,点击HTTPS证书右侧的编辑配置然后选择开启HTTPS安全加速,选择免费域名并勾选下面的复选框(或者选择自己上传证书也可以)

添加HTTPS证书

完成之后阿里云会自动申请证书并添加和续费。HTTPS开启成功后就可以在下面编辑一些HTTP/2、TLS版本、HSTS之类的信息了,按照自己需求完成就可以。

添加URL跳转规则

目前我们只是把上传的内容放到了OSS,并没有通过CDN去访问,现在我们需要将内容跳转到我们的CDN上去。

在WordPress站点的伪静态(Nginx中网站的conf文件)配置中添加如下规则:

rewrite ^/wp-content/uploads $scheme://blog-assets.nya.pink/$uri redirect;
# 记得修改其中的CDN域名

现在内容就会自动跳转到我们的CDN域名了。

注意
需要注意的是,这种方法还是会请求一次服务器,但是因为不加载图片本身而是返回302/301,也可以做到很多的加速效果。最好的方法还是找一个插件,在博客生成文章的适合就替换掉图片链接,可以直接减少对服务器的请求,再次加速。(目前应该很多CDN插件中应该也有这样的功能)
注意x2
如果确定要用这个方案,可以把伪静态中的redirect换成permanent即可使用301永久跳转,可以在使用一段时间后再切换

对图片进行压缩、水印处理

如果需要对图片进行压缩或者水印,可以直接在OSS处开启图片处理。

首先进入OSS管理页面,点击左侧的数据处理->图片处理,点击添加样式,根据页面提示完成对图片质量、水印等的设置(以样式compressed举例)

设置图片样式

然后再点击访问设置按钮,选择自定义分隔符(以!举例)

重新设置刚刚的伪静态为

rewrite ^/wp-content/uploads $scheme://blog-assets.nya.pink/$uri!compressed redirect;
# 在刚刚的基础上添加了!compressed

即可将所有的访问跳转到对应样式的图片上。

这种方法可以对每个上传的图片都加上水印,或者进行压缩减小传输体积。因为没有完全测试过所以大家看情况使用。

不想用了,怎么恢复

  1. 删除伪静态跳转(并清理浏览器缓存)
  2. 使用unmount /path/to/wp-content/uploads卸载挂载的OSS磁盘,并删除其开机自启项
  3. 使用ossutil或者其他方式将OSS的文件恢复至uploads文件夹(可以在卸载磁盘前先复制下来,然后卸载后重新移动至uploads文件夹)
  4. 根据需求删除ossfs、ossutil、OSS容器及其CDN服务

如果是过程中出现错误了想要恢复,请卸载挂载的OSS并将备份文件恢复,删除伪静态(如果有),即可完成恢复。

文章首发于https://blog.orangii.cn/2021/wp-mount-oss-cdn/,转载请注明出处。博客所有文章遵循CC BY-NC 4.0协议

评论

  1. 常瑞
    iPhone Safari
    3 年前
    2021-12-21 19:18:19

    要是只上传静态文件,还不如用插件

    • 博主
      常瑞
      Windows Chrome
      3 年前
      2021-12-21 22:54:43

      是这样的,Wordpress也主要上传的是静态文件,得益于WP优秀的插件环境,在WP上使用插件就足够了,这个方法是一种小众方法。
      我自己用这个主要也是给我的Nextcloud网盘当文件空间,相比服务器本身的磁盘还是要大很多的。不过Nextcloud的下载还没有插件能实现直接从OSS下载,准备以后研究一下。

  2. Windows Chrome
    已编辑
    3 年前
    2021-12-08 17:57:38

    256TB是理论上限,实际过百T就会有售后来联系你做解决方案了。
    另外,OSS的存储费用不小,而且现在CloudFlare带宽联盟免流有点玄学,就有时候能免有时候免不了,可能是cf的L2回源节点那边问题吧。
    而且文中的用法并不是最优解,服务器仍然需要承担大量的GET请求并回复Redirect,其中TTFB不可忽略,也是会减慢加载速度的。
    我这边想到的方法是通过对PHP fastCgi Buffer的Regex操作实现对输出内容的全局替换以更改链接,或者直接用OSS Upload类型的插件,S3兼容的就行,即媒体库同步。
    而且OSS存储费用不小,毕竟随便一个1年的博客都有十多G的存储,流量就更离谱了,被打很容易就天价账单。

    • 博主
      AHdark
      Windows Chrome
      3 年前
      2021-12-08 19:02:32

      是大佬了,256T是linux磁盘查询到的256T,实际容量肯定不止这些,写文章时为了标题党写的256T;其实服务器Redirect文中应该也提出了并不好,建议Wordpress使用插件在返回页面前就进行替换;天价账单这个,也要看怎么用了,我以前的博客更新不频繁,两三年下来全站备份也不超过5G,现在我的OSS收费没有超过一个月一两毛吧,另外实际上这个方法是我自己Nextcloud用的方法,除了每次更新的时候频繁使用OSS文件收费会高一些之外,不到10G收费还可以。不过如果可以的话,其实我一直想在Nextcloud开发一个插件,能让用户下载文件的时候直接使用OSS下载,而不用OSS -> 服务器 -> 用户,不用受到服务器限制,不知道FastCGI可不可以也实现这种方法。

  3. 常瑞
    iPhone Safari
    3 年前
    2021-11-21 7:22:00

    要是阿里服务器的话还好,只用付空间费用(内网),但是其他家的服务器用oss,被攻击了就惨了

    • 博主
      常瑞
      Windows Chrome
      3 年前
      2021-11-21 9:32:05

      确实,不过其他大厂家也都有对象存储的服务,比如腾讯云COS

    • 常瑞
      Windows Chrome
      3 年前
      2021-12-08 17:58:42

      所有上传流量都不计费的吧

      • 博主
        AHdark
        Windows Chrome
        3 年前
        2021-12-08 19:03:52

        如果是Ossfs,好像记API调用费用,虽然不知道对文件的操作怎么算

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
橙橙梓
甘城猫猫
颜文字
Emoji
小恐龙
花!
上一篇
下一篇