使用前介绍
对于WordPress来说,用户上传的文件、主题都在wp-content目录下,首先会占据服务器磁盘空间,然后用户的访问可能因此受到服务器带宽的限制。不管是哪一点,这次的文章可以将OSS空间直接作为wp-content的空间,换句话说就是用户上传的文件会直接到OSS,配合CDN就可以做到分布式加速,可以说非常的nice。对于一些宽带较小的服务器来说还是可以的。
这种方法最棒的地方在于,附件上传空间变为OSS,有256T空间去上传,不再怕VPS空间小了。并且可以附带的是,还可以配合CDN进行分布式地区加速,对带宽又可以很友好了。
虽然说阿里云OSS可以挂载不同地区不同提供商的服务器,但是对于同地区的阿里云服务器,阿里云的OSS提供内网访问,也就可以省去一部分的传输费用。
开始前的必要操作
- 请你一定要备份,因为我也不知道由于各种原因你的文件会不会丢失,如果你不备份,出现的损失就要你自己承担了(只要备份了,失败之后还是很容易恢复的)。本文所有内容不一定我自己实践过,而是有些扩展内容是根据经验写出的,所有一定要有备份以防出现问题(不管是因为我的内容还是不同版本之间的差异)。至少要对你操作的文件夹进行备份,例如本文处就要备份wp-content/uploads文件夹,执行例如下面这样的代码。
cp uploads/ uploads-bak # 备份一份
- 创建一个阿里云OSS容器,如果你还没有开通阿里云OSS,可以在这里开通:阿里云OSS。此处为了节省一些不必要的开支,可以不用开启类似同城备份、版本控制之类的额外消费项目(如果你需要的话,那就没事了),记得读写权限那里要选择公共读,以便CDN访问方便。如果你使用的也是阿里云的服务器,尽量选择相同地区的OSS,这样可以节省传输费用。然后留意一些下面的Endpoint
- 安装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。
开始挂载
接下来我们开始挂载,目前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。
你现在需要将刚刚临时存储的文件移动到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配置,然后再新增原站信息中选择OSS域名,在下拉菜单中选择之前创建的OSS域名(一般是容器名+endpoint)。
如果需要验证域名,就根据提示去验证。添加完成后去DNS服务商那里添加对应的CNAME解析记录(CloudFlare记得选DNS only)
添加完成后可以看到下面的样子
开启HTTPS
一般来说为了安全也要开启HTTPS,不然浏览器也显示不安全,阿里云CDN也支持免费的SSL证书。
点击上图的配置按钮,点击新页面左侧的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域名了。
redirect
换成permanent
即可使用301永久跳转,可以在使用一段时间后再切换对图片进行压缩、水印处理
如果需要对图片进行压缩或者水印,可以直接在OSS处开启图片处理。
首先进入OSS管理页面,点击左侧的数据处理->图片处理,点击添加样式,根据页面提示完成对图片质量、水印等的设置(以样式compressed举例)
然后再点击访问设置按钮,选择自定义分隔符(以!举例)
重新设置刚刚的伪静态为
rewrite ^/wp-content/uploads $scheme://blog-assets.nya.pink/$uri!compressed redirect;
# 在刚刚的基础上添加了!compressed
即可将所有的访问跳转到对应样式的图片上。
这种方法可以对每个上传的图片都加上水印,或者进行压缩减小传输体积。因为没有完全测试过所以大家看情况使用。
不想用了,怎么恢复
- 删除伪静态跳转(并清理浏览器缓存)
- 使用
unmount /path/to/wp-content/uploads
卸载挂载的OSS磁盘,并删除其开机自启项 - 使用ossutil或者其他方式将OSS的文件恢复至uploads文件夹(可以在卸载磁盘前先复制下来,然后卸载后重新移动至uploads文件夹)
- 根据需求删除ossfs、ossutil、OSS容器及其CDN服务
如果是过程中出现错误了想要恢复,请卸载挂载的OSS并将备份文件恢复,删除伪静态(如果有),即可完成恢复。
要是只上传静态文件,还不如用插件
是这样的,Wordpress也主要上传的是静态文件,得益于WP优秀的插件环境,在WP上使用插件就足够了,这个方法是一种小众方法。
我自己用这个主要也是给我的Nextcloud网盘当文件空间,相比服务器本身的磁盘还是要大很多的。不过Nextcloud的下载还没有插件能实现直接从OSS下载,准备以后研究一下。
256TB是理论上限,实际过百T就会有售后来联系你做解决方案了。
另外,OSS的存储费用不小,而且现在CloudFlare带宽联盟免流有点玄学,就有时候能免有时候免不了,可能是cf的L2回源节点那边问题吧。
而且文中的用法并不是最优解,服务器仍然需要承担大量的GET请求并回复Redirect,其中TTFB不可忽略,也是会减慢加载速度的。
我这边想到的方法是通过对PHP fastCgi Buffer的Regex操作实现对输出内容的全局替换以更改链接,或者直接用OSS Upload类型的插件,S3兼容的就行,即媒体库同步。
而且OSS存储费用不小,毕竟随便一个1年的博客都有十多G的存储,流量就更离谱了,被打很容易就天价账单。
是大佬了,256T是linux磁盘查询到的256T,实际容量肯定不止这些,写文章时为了标题党写的256T;其实服务器Redirect文中应该也提出了并不好,建议Wordpress使用插件在返回页面前就进行替换;天价账单这个,也要看怎么用了,我以前的博客更新不频繁,两三年下来全站备份也不超过5G,现在我的OSS收费没有超过一个月一两毛吧,另外实际上这个方法是我自己Nextcloud用的方法,除了每次更新的时候频繁使用OSS文件收费会高一些之外,不到10G收费还可以。不过如果可以的话,其实我一直想在Nextcloud开发一个插件,能让用户下载文件的时候直接使用OSS下载,而不用OSS -> 服务器 -> 用户,不用受到服务器限制,不知道FastCGI可不可以也实现这种方法。
要是阿里服务器的话还好,只用付空间费用(内网),但是其他家的服务器用oss,被攻击了就惨了
确实,不过其他大厂家也都有对象存储的服务,比如腾讯云COS
所有上传流量都不计费的吧
如果是Ossfs,好像记API调用费用,虽然不知道对文件的操作怎么算