默认情况下,Wordpress的图片附件都是保存在源码的wp-content/uploads
目录下,随着网站内容的不断增加,附件目录下的文件会越来越多,每次备份文件动辄几个G的数据要备份,很是麻烦。因此就人想到要将图片附件从网站主机分离出来,通过FTP传输到自建的FTP存储空间内。但这样无疑会带来不可控的因素,比如FTP存储空间的稳定性、安全性,以及成本。
远程FTP存储不失为是一个不错的选择,可选择的服务商也很多,相关的插件可以参考WPFTP,但我在这里介绍的插件则是使用S3存储,可以支持Backblaze B2
,相比起自建FTP或外购FTP空间,个人认为S3
的服务会更稳定,存储相对安全,价格也较为低廉,而且如果你存储的数据不足10G,搭配Cloudflare
,甚至都不用钱。这也是本站目前采取的存储方案。
关于Backblaze B2搭配CloudFlare的方法,可以参考这篇文章:通过CloudFlare转换规则隐藏Backblaze B2的bucket路径
S3-Uploads
S3-Uploads旨在成为一个轻量级的”即插即用”解决方案,用于将上传的内容存储在亚马逊S3上,而非本地文件系统。
它的主要目标是提供一个高度稳健的S3接口,没有任何”花哨”的功能,也没有WP-Admin用户界面或其他多余的东西。但它配备了一些有用的WP-CLI
命令,可以列出S3上的文件,以及将您现有的库迁移到S3上。
TL;DR
S3-Uploads优点:
- 免费、开源,GitHub可立取,Github:https://github.com/humanmade/S3-Uploads
- 支持
S3标准协议
,可直接对接AWS S3
存储 - 除对接
AWS S3
,还可以对接其他
支持S3标准协议的存储桶 - 原生支持
WP CLI
命令,方便迁移数据
S3-Uploads不足:
- 与部分插件存在兼容性问题,主要原因是因为S3-Uploads是直接暴力接管
wp-content/uploads
目录,所有用到这个目录的其他插件,在接管后出现大量读写S3的问题,可能会造成S3服务的操作项计费暴增。 - 没有WP-Admin用户界面,在
wp-config.php
配置完成后,配置上就没有多余的动作了,非常极客,小白劝退
插件安装使用
插件要求
- PHP >= 7.1
- WordPress >= 5.3
插件有两种安装方法,第一种是使用composer.phar
进行安装,第二种是下载插件包放插件目录。两种方法各有优劣,全凭喜好就好。
使用composer进行安装
这就像是laravel
一类的程序那样,直接在网站目录下执行
composer require humanmade/s3-uploads
命令执行之后,网站根目录下新增vendor
目录,里面是插件依赖的第三方库,注意不要删了。
注意⚠️!通过这个方法安装后,需要在wp-config.php
配置文件查找wp-settings.php
,要在它前面插入Composer’s autoloader自动加载项,否则插件启用后会出错。
建议在“That’s all, stop editing! Happy publishing”这段文字前面加上
require_once __DIR__ . '/vendor/autoload.php';
如下面的代码片段:
...
require_once __DIR__ . '/vendor/autoload.php';
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if (!defined('ABSPATH')) {
define('ABSPATH', __DIR__ . '/');
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
...
下载插件包安装
这个方法就直接到官方release下载插件包,然后上传到插件管理器就好了。这个方法适合网站空间没有composer
命令,只需要前往官方release页面,下载manual-install.zip
,然后上传安装即可。但这个方法存在一定的制约,如果你的网站php运行时版本是8,则有可能这个方法不适合你,因为manual-install.zip
打包时使用的php运行时是7,如果composer.json
要求的php运行时版本与你实际网站的运行时不匹配,则会报错。
建议有条件的,直接在插件目录里,clone仓库后,进插件目录执行composer install
解决php版本依赖和第三方库依赖的问题。
cd wp-content/plugins
git clone https://github.com/humanmade/S3-Uploads s3-uploads
cd s3-uploads
composer install
插件安装完成之后,切忌,先不要去Wordpress管理后台启用插件!继续往下看!
存储桶配置
插件安装之后,需要第一时间在wp-config.php
添加插件配置定义,主要是S3存储库的配置,分两种情况
AWS大厂云
define( 'S3_UPLOADS_BUCKET', 'my-bucket' );
define( 'S3_UPLOADS_REGION', '' ); // the s3 bucket region (excluding the rest of the URL)
// You can set key and secret directly:
define( 'S3_UPLOADS_KEY', '' );
define( 'S3_UPLOADS_SECRET', '' );
// Or if using IAM instance profiles, you can use the instance's credentials:
define( 'S3_UPLOADS_USE_INSTANCE_PROFILE', true );
插件原生支持AWS S3
,S3_UPLOADS_BUCKET
为存储桶名称,可以直接填存储桶名称,如果想放在存储桶的目录里,可以将该值设为存储桶/目录名,如:my-bucket/my-folder
S3_UPLOADS_REGION
为存储桶区域,这个按AWS官方名称准确填写,参考:http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
其他云
如需对接其他云服务商的S3存储桶,包含自建minio
服务,也包含廉价的S3存储桶,如Backblaze B2
、Scaleway
等,则可以按本方法进行对接。
只需在wp-content/mu-plugins/
添加s3-endpoint.php
文件,填入以下内容:
<?php
// Filter S3 Uploads params.
add_filter( 's3_uploads_s3_client_params', function ( $params ) {
$params['use_aws_shared_config_files'] = false;
$params['endpoint'] = 'https://your.endpoint.com';
$params['use_path_style_endpoint'] = true;
$params['debug'] = false; // Set to true if uploads are failing.
return $params;
} );
该文件里的endpoint
设为目标S3存储桶的endpoint
,注意⚠️,如果添加了这个文件,则原配置里的S3_UPLOADS_REGION
不再有效。
其他配置
默认动作
插件是即插即用的,一旦启用插件,那么后续的上传操作就会被接管到S3存储桶,但有时候需要临时暂停该动作,例如在使用WP-CLI
迁移媒体库到S3存储桶之前,则可以暂停,待迁移完毕之后再让插件接管。主要是这段配置:
// Default behaviour
define('S3_UPLOADS_AUTOENABLE', false);
重写URL地址
默认情况下,S3存储桶有默认的对外访问地址,比如[bucket name].s3.amazonaws.com/uploads/[file path]
,这个地址直接使用可能会有隐患,一般情况下是绑定自己的子域名,那么可以在wp-config.php
添加以下配置:
// Define the base bucket URL (without trailing slash)
define( 'S3_UPLOADS_BUCKET_URL', 'https://your.origin.url.example/path' );
如果需要自动重写Wordpress原附件的地址,则可以添加:
// disable URL rewriting alltogether
define( 'S3_UPLOADS_DISABLE_REPLACE_UPLOAD_URL', true );
WP-CLI应用
S3-Uploads是一个轻量级的插件,连WP-Admin用户可操作的界面都没有。所有有意义的操作都集中在WP-CLI里,主要有以下几个命令可用:
验证S3存储桶
wp s3-uploads verify
执行后,插件会尝试上传文件,而后再删除文件,以确定S3存储桶是否可用,如命令执行成功,则代表S3存储桶配置正确
Success: Looks like your configuration is correct.
Attempting to upload file s3://my-bucket/wp-content/uploads/3790271186.txt
File uploaded to S3 successfully.
Attempting to delete file. s3://my-bucket/wp-content/uploads/3790271186.txt
File deleted from S3 successfully.
列出S3存储桶内容
使用该命令,可以直接列出S3存储桶指定目录下的文件和目录
wp s3-uploads ls [<path>]
上传媒体库到S3存储桶
该命令是重要命令,可将现有媒体库的内容上传到目标S3存储桶
wp s3-uploads upload-directory <from> <to> [--verbose]
例如:
wp s3-uploads upload-directory /path/to/uploads/ uploads
当然也支持通用的cp命令:
wp s3-uploads cp <from> <to>
最后
对于数据量比较大的网站,将附件存放在其他地方可以节省非常多的存储空间,实现的方式也有许多。S3-Uploads插件是开源的插件,也许会有一些小问题,如果你不想折腾,可以考虑其他方案。
FTP方案可以参考这篇文章:WPFTP插件实现自建FTP存储空间分离WordPress图片静态文件存储
WP Offload Media S3插件可以参考这篇文章:Amazon S3+WP Offload Media Lite插件实现WordPress静态文件加速(但如要同步已有文件则需要使用Pro付费版)
您也可以联系文章作者本人进行修改,若内容侵权或非法,可以联系我们进行处理。
任何个人或组织,转载、发布本站文章到任何网站、书籍等各类媒体平台,必须在文末署名文章出处并链接到本站相应文章的URL地址。
本站文章如转载自其他网站,会在文末署名原文出处及原文URL的跳转链接,如有遗漏,烦请告知修正。
如若本站文章侵犯了原著者的合法权益,亦可联系我们进行处理。
hi6个月前0
请问有详细一点的自己搭建的教程吗你好7个月前0
你好,可以再帮我看看吗? 我已经按照你的方法设定了,还是一样,wordpress后台的 Purge Varnish Cache 插件还是清除不到cache,依旧显示 the varnish control terminal is not responding at。谢谢https://mjj.today/i/Srk2Tz https://mjj.today/i/Srkcoi你好7个月前0
对,你说的没错,我配置的时候改了一些东西,现在我按照你的教学,可以启动了,网页可以缓存了,不过wordpress 清除cache 那个插件没用的,我输入本地回环地址127.0.0.1 :6082 ,再输入API key ,插件显示the varnish control terminal is not responding at 127.0.0.1:6082,就你图片那样,然后试一下点击清除cache 那里,他显示error,研究了一天,还是没有不行。你好7个月前1
你好,为啥我按照你的方法,到第三部分,去到真正后源的服务器设定Varnish 部分,我填了真正后源的IP跟端口跟域名,然后重启 Varnish ,就出现这样了? 这是怎么回事? 谢谢[Linux] AMH 7.1 https://amh.sh[varnish-6.6 start] ================================================== =========== [OK] varnish-6.6 is already installed. Could not delete 'vcl_boot.1713549650.959259/vgc.sym': No such file or directory Error: Message from VCC-compiler: VCL version declaration missing Update your VCL to Version 4 syntax, and add vcl 4.1; on the first line of the VCL files. ('/home/usrdata/varnish/default.conf' Line 1 Pos 1) ...#---Running VCC-compiler failed, exited with 2 VCL compilation failedchu7个月前0
很完善的教程‘hu7个月前0
我用gmail EMAIL_SERVER="smtp://********@gmail.com:bpyfv*********chry@smtp.gmail.com:587"叽喳7个月前0
MAIL_SERVER="smtp://no-reply@vort.me:password123@wednesday.mxrouting.net:587"大佬 这个使用outlook 或者gmail 是什么样子的格式? 邮寄已经开启smtp了hu7个月前0
输入框的问题解决了,我没有设置反代,NEXTAUTH_URL改为域名+端口就好了