说起来之前已经测试过使用阿里云OSS的功能,其实就是通过AWS扩展来实现。之所以弃而不用,一来是之前的云服务器固定带宽没有流量费,硬盘容量也充足,用不用感觉差别不大;二来用了AWS扩展后所有图片均上传到了OSS上,本地不再存储,又无法实现同步,心理总觉得不踏实(谬误)。
最近被爬虫弄得身心俱疲,不得已只能将目光再次转向OSS。所以重新记录一下整个扩展的安装过程,也供其他朋友参考。如有错误之处或其他思路,还请留言讨论。

一、安装AWS扩展

虽然在安装时,扩展的最终版本停留在了2020年12月15日,但基于大量维基农场使用它,因此大可安心使用。

  1. 首先将扩展下载至扩展目录extensions中:

    git clone --depth 1 https://github.com/edwardspec/mediawiki-aws-s3.git AWS
  2. 如果没有直接下载至扩展目录,请将其复制到MediaWiki的扩展目录中(例如/var/www/html/w/extensions,具体视自己的安装情况)。
  3. 在MediaWiki的根目录下(如/var/www/html/w/extensions,下同)创建一个名为composer.local.json的文件(也可以通过复制composer.local.json-sample来获得),添加或修改内容如下:

    {
     "extra": {
         "merge-plugin": {
             "include": [
                 "extensions/AWS/composer.json"
             ]
         }
     }
    }

    注意:如果是复制composer.local.json-sample文件的,最好也将其中内容先修改成如上所示的,否则在升级过程中可能会因为其他扩展或皮肤的问题而影响到整个安装过程。

  4. 在MediaWiki的根目录下运行composer update以下载必要的依赖程序。
    注意:不要随意切换成国内的composer源,很有可能会报错(详见《MediaWiki升级,composer update报错》一文)。

二、配置阿里云OSS

之所以我们能通过AWS扩展来使用阿里云的OSS,是因为后者兼容亚马逊的AWS,配置基本相同。

  1. 首先进入阿里云的OSS控制台,新建一个新的bucket。填写bucket名(比如bucket-test0001),并选择与服务器相同的地域(比如杭州),存储类型选择标准存储。
  2. 进入目标bucket,在左侧导航栏中选择权限控制 > 读写权限,在读写权限页签,单击设置,修改为公共读写并保存(扩展的讨论中有提到无需读写权限,但在实际测试中好像设置为私有后图片无法正常显示)。
  3. 点击域名管理,绑定自定义域名以防止直接使用OSS地址(可选),也可以进一步设置CDN加速。其他设置可根据自己的需要(比如防盗链功能)参考官方文档进行调整。
  4. 在RAM控制台中(在bucket左侧导航栏中,选择权限控制 > 访问控制 RAM,并点击前往RAM控制台),点击身份管理 > 用户,创建一个新用户,并记录AccessKey ID和AccessKey Secret。
  5. 回到目标bucket工作台,在左侧导航栏,选择权限控制 > Bucket 授权策略,点击新增授权。授权用户勾选子账号,并选择刚刚新建的用户;授权操作选择读/写;条件中的访问方式可根据实际需要选择(如只需要HTTPS);最后点击确定。

小结:上述工作中需要记录bucket名、所在区域、Endpoint以及它的域名(这些在目标bucket的概览页面中都有),RAM子用户的AccessKey ID和AccessKey Secret(生成的时候一定要记录,否则过后只能找到ID了)以及bucket的CDN域名(如果设置了的话)。

三、同步ECS文件到OSS中(如果全新安装可以跳过这一步)

因为在更换系统前备份过大部分的图片资料,所以首先想到的是在OSS控制台中,通过图形界面上传文件(实际操作中,感觉有部分文件没有上传,尤其是空目录,即便我将它们拖进上传的框中,最终结果还是无法成功)。

系统更新后新添加的文件就比较麻烦,因为MediaWiki上传文件会随机存储在两级子目录中(比如/1/1a),单个文件可以通过文件路径进行排查并上传。数量一旦增加,该方法的效率就极为低下(因为还有缩略图也可能被保存在某个子目录中)。

这里就需要选择阿里云的两个程序,一个是ossfs,一个是ossutil。根据官方描述,前者可能会有一定概率同步失败,即部分文件没有上传或者是下载,好处是直接可以将OSS的bucket挂载到服务器的本地文件系统中,挂载后可以通过本地文件系统操作OSS,实现文件的共享与访问。而后者操作性能和稳定性都更好,适合复杂操作要求。

根据目前的情况,果断选择ossutil作为同步工具。

执行以下代码进行安装:

sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash

然后输入以下命令进行配置:

ossutil config

根据提示:

  1. 设置配置文件路径(默认为:/home/user/.ossutilconfig),回车将使用默认路径。
  2. 设置工具语言(CH或EN),语言默认与操作系统保持一致,不放心的话就选EN。
  3. 分别设置Endpoint、AccessKey ID、AccessKey Secret和STSToken参数。使用STS临时授权账号访问OSS时需要配置STSToken,否则置空跳过即可。

以上设置都可以通过修改/home/user/.ossutilconfig文件进行调整。

最后,通过ossutil命令验证安装是否成功。

现在将ECS中的文件同步至OSS中,命令如下:

ossutil sync /var/www/html/w/images/  oss://bucket-test0001/

其中/var/www/html/w/images/为本地目录(即MediaWiki安装目录下的图片目录),而OSS端可以直接填bucket名(如本例中的bucket-test0001),因为images下的所有内容直接存储于bucket根目录下(如果希望保存在bucket下的images目录,请oss://bucket-test0001/修改成oss://bucket-test0001/images/,并且在扩展配置时增加$wgAWSBucketTopSubdirectory="/images";)。

如果存在同名文件,则ossutil会进行覆写操作的问询。命令如下:

ossutil sync /var/www/html/w/images/  oss://bucket-test0001/
cp: overwrite "oss://bucket-test0001/a/a1/test.jpg"(y or N)?

像在本例中,所有文件都可覆盖,因此可增加-f,--force选项强制执行覆写操作。命令如下:

ossutil sync /var/www/html/w/images/  oss://bucket-test0001/ -f

四、启用和配置AWS扩展

打开配置文件LocalSettings.php,在其中添加如下代码:

# 启用扩展
wfLoadExtension( 'AWS' );

# 配置扩展
// Configure AWS credentials.
// THIS IS NOT NEEDED if your EC2 instance has an IAM instance profile.
$wgAWSCredentials = [
    'key' => 'AccessKey ID',
    'secret' => 'AccessKey Secret',
    'token' => false
];
//The url used for the API (PutObject, etc.)
$wgFileBackends['s3']['endpoint'] = 'https://oss-cn-hangzhou.aliyuncs.com';//填写bucket所处的endpoint
//The url used for showing images. $1 is translated to the bucket name.
$wgAWSBucketDomain = 'bucket-test0001.oss-cn-hangzhou.aliyuncs.com';//bucket的域名,如果开启了OSS的CDN则可以使用CDN域名

// Configure AWS credentials.
$wgAWSRegion = 'oss-cn-hangzhou'; //bucket所处的区域(比如杭州)

// Replace <something> with the name of your S3 bucket, e.g. wonderfulbali234.
$wgAWSBucketName = "bucket-test0001";//bucket名称

// if your images are stored in directory called "some_prefix"
// you can specify an optional prefix
//$wgAWSBucketTopSubdirectory="/some_prefix";//bucket的顶级子目录,默认无需开启

$wgAWSRepoHashLevels = '2'; # Default 0//两级子目录,与MediaWiki本地存储保持一致
# 2 means that S3 objects will be named a/ab/Filename.png (same as when MediaWiki stores files in local directories)

上述所有的信息在配置阿里云OSS那一步中都有记录。

最后,通过特殊:版本查看安装情况,并且可以通过特殊:文件列表页面查看是否所有图片均显示正常。

可能的问题

如果你开启了MultimediaViewer扩展,那么很有可能会出现错误提示且无法正常显示图片。这是因为OSS的CORS策略,所以需要进行一些配置。

打开刚刚开启的bucket,在数据安全->跨域设置中点击创建规则。

弹出窗口中,来源栏填写你的网站地址,如果有CDN域名的话也可以一并填入(注意:网址一定要写全,包括https://),允许METHOD中勾选GET项,然后保存。
2025-03-05 16 12 45.png
等待十几分钟后,重新刷新页面,问题解决。

换一种思路——挂载OSS的Bucket到本地

其实在AWS扩展的文档中也提到过,如果是小型维基(即文件量不是很大的情况),其实可以通过挂载OSS的网盘来实现需求。也就是说,如果我们通过阿里云的ossfs工具,将某个bucket挂载到本地,然后像操作本地文件一样正常地存储网站上传的文件。
首先,我们可以通过以下命令安装ossfs

wget https://gosspublic.alicdn.com/ossfs/ossfs_1.91.5_ubuntu22.04_amd64.deb
dpkg -i ossfs_1.91.5_ubuntu22.04_amd64.deb

版本号可根据阿里云官网选择最合适自己的。

注意:安装过程中可能会提示需要fusemount命令,在Debian 12中,可以通过以下命令安装:

sudo apt install fuse3

其他系统可自行搜索,这里就不再赘述。

执行ossfs --version命令查看ossfs版本信息,以验证安装是否成功。

关于挂载,阿里云提供了两种不同方式(可查看官方文档并根据自己的需要决定),这里简单介绍一下使用账户的AK挂载方式。

首先将存储空间和对应的AccessKey信息写入默认配置文件/etc/passwd-ossfs中,并将文件权限设置为640。

配置文件的格式为$bucket_name:$access_key_id:$access_key_secret,AK信息应保存在配置文件中,每行记录一条信息。

echo bucket-test0001:AAAI************:AAA8x************************* > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs

创建挂载目录并挂载。

mkdir /var/www/html/ossfs
ossfs bucket-test0001 /var/www/html/ossfs -o url=http://oss-cn-hangzhou.aliyuncs.com

说明:

  1. URL地址即为Endpoint。如果Linux ECS云服务器与OSS位于同一地域,请填写内网Endpoint。
  2. 在本例中,可将/var/www/html/w/ossfs替换成images目录(比如/var/www/html/w/images)。如果希望使用新的目录/var/www/html/w/ossfs,则需要在配置文件LocalSettings.php中将文件上传目录修改为:$wgUploadDirectory = '/var/www/html/w/ossfs';
  3. 默认情况下,ossfs只能挂载到空目录下。当试图挂载到非空目录下时,会提示"ossfs: Mountpoint directory /tmp/ossfs is not empty. if you are sure this is safe, can use the 'nonempty' mount option"错误,如果一定要挂载到该目录下,需增加-ononempty参数。

为确保开机自动挂载,请在/etc/fstab中加入如下命令:

ossfs#bucket-test0001 mount_point fuse _netdev,url=url,allow_other 0 0

挂载后就能像正常目录那样存储文件了。不过正像阿里云的文档中所写的,使用ossfs可能会存在程序中止的情况,因此需要通过Supervisor工具来管理和启动ossfs,以实现对OSS的稳定挂载(具体见官方文章说明)。但就Supervisor工具本身来说也有不确定性,所以前期测试着玩可以,又或者AWS的安装不成功但很希望使用OSS的话,可以尝试。

参考资料:

  1. https://www.cnblogs.com/bennylitech/p/18244147
  2. https://github.com/edwardspec/mediawiki-aws-s3/blob/master/README.md
最后修改:2025 年 03 月 07 日
如果觉得我的文章对你有用,请随意赞赏