edwardspec / mediawiki-aws-s3
允许MediaWiki使用Amazon S3存储上传的文件。
Requires
- aws/aws-sdk-php: ^3.67
- composer/installers: ~1.5
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-09 00:53:52 UTC
README
扩展:AWS - https://www.mediawiki.org/wiki/Extension:AWS
功能:将图像存储在Amazon S3而不是本地目录中。
需要的原因:当图像在S3中时,运行MediaWiki的Amazon EC2实例不包含任何重要数据,可以被自动扩展创建/销毁。
安装
注意:此版本的Extension:AWS需要MediaWiki 1.35+。对于MediaWiki的较旧版本(1.27-1.34),请使用以下说明:https://github.com/edwardspec/mediawiki-aws-s3/blob/REL1_34/README.md
1) 下载扩展: git clone --depth 1 https://github.com/edwardspec/mediawiki-aws-s3.git AWS
2) 将AWS目录移动到您的MediaWiki的"extensions"目录中,例如 /var/www/html/w/extensions
(假设MediaWiki在/var/www/html/w
)。
3) 创建文件 /var/www/html/w/composer.local.json
,内容如下
{ "extra": { "merge-plugin": { "include": [ "extensions/AWS/composer.json" ] } } }
4) 从 /var/www/html/w
运行 composer update
(以下载依赖项)。如果您尚未安装Composer,请参阅https://www.mediawiki.org/wiki/Composer了解如何安装它。
5) 为图像创建一个S3存储桶,例如 wonderfulbali234
。注意:此名称将出现在图像URL中。
6a) 如果您的EC2实例具有IAM实例配置文件(推荐),请将“所需IAM权限”(见下文)中的所有内容复制到IAM角色的内联策略中。请参阅https://console.aws.amazon.com/iam/home#/roles
6b) 如果您的EC2实例没有IAM配置文件,则获取AWS API密钥/密钥。您需要将其写入LocalSettings.php(见下文)。
7) 修改LocalSettings.php(见下文)。
LocalSettings.php中的配置
wfLoadExtension( 'AWS' ); // Configure AWS credentials. // THIS IS NOT NEEDED if your EC2 instance has an IAM instance profile. $wgAWSCredentials = [ 'key' => '<something>', 'secret' => '<something>', 'token' => false ]; $wgAWSRegion = 'us-east-1'; # Northern Virginia // Replace <something> with the name of your S3 bucket, e.g. wonderfulbali234. $wgAWSBucketName = "<something>"; // if your images are stored in directory called "some_prefix" // you can specify an optional prefix $wgAWSBucketTopSubdirectory="/some_prefix";
如果您未通过$wgAWSCredentials指定凭据,则它们将使用默认凭据链检索。这意味着它们来自IAM实例配置文件(如果此EC2实例具有)或来自环境变量AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和AWS_SESSION_TOKEN
。
所需的IAM权限
将<something>
替换为您的S3存储桶名称,例如wonderfulbali234
。
{ "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::<something>/*" ] }, { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::<something>" ] }
自定义S3域名
您可以使用域名来存储图像(例如,img.mysite.com
)。当您希望CDN(如CloudFlare)缓存您的图像时,需要此功能。有关详细信息,请参阅[https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html 存储桶的虚拟主机托管]。
1) 在您的DNS提供商处,添加一个CNAME条目。例如,将img.mysite.com
指向<your-wgAWSBucketName>.s3.<location>.amazonaws.com
)。
2) 在LocalSettings.php中设置$wgAWSBucketDomain
。以下值是受支持的
$wgAWSBucketDomain = 'img.mysite.com'; // This will use <bucket-name>.cloudfront.net $wgAWSBucketDomain = '$1.cloudfront.net'; // Default $wgAWSBucketDomain = '$1.s3.amazonaws.com';
迁移图像
默认情况下,扩展将所有图像存储在存储桶的最高级目录中。
如果您正在迁移现有的images
文件夹,MediaWiki将使用哈希目录结构。您需要将其添加到您的LocalSettings.php
中,以便正确生成图像路径。
$wgAWSRepoHashLevels = '2'; # Default 0 # 2 means that S3 objects will be named a/ab/Filename.png (same as when MediaWiki stores files in local directories) $wgAWSRepoDeletedHashLevels = '3'; # Default 0 # 3 for naming a/ab/abc/Filename.png (same as when MediaWiki stores deleted files in local directories)
如果您的images
文件夹以前是为多个拆分到不同子目录的wiki服务的,您需要设置$wgAWSBucketTopSubdirectory
。不建议新wiki使用此设置。
$wgAWSBucketTopSubdirectory = '/something'; # images will be in bucketname.s3.amazonaws.com/something/File.png instead of bucketname.s3.amazonaws.com/File.png.
故障排除
我的维基使用了扩展:多媒体查看器(或以弹出窗口显示图片),但现在它们不工作
如果您遇到此问题,请将CORS策略附加到包含图片的S3存储桶。这将允许托管您的维基的域中的JavaScript(在这种情况下,扩展:多媒体查看器的弹出显示脚本)从Amazon S3 URL下载图片。例如,如果您的维基的域是www.example.com
,您可以使用以下策略
<CORSConfiguration> <CORSRule> <AllowedOrigin>http://www.example.com</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> </CORSRule> </CORSConfiguration>
即使扩展显示已安装,仍然使用本地存储
如果某些设置缺失,可能会发生这种情况。请确保您至少设置了$wgAWSBucketName
和$wgAWSRegion
。
即使扩展显示已安装,我仍然得到异常
如果某些设置缺失,可能会发生这种情况。请确保设置了$wgAWSRegion
(即使您的配置不使用它,例如,当使用非亚马逊提供商时)。
非标准配置
使用其他与S3兼容的服务(而非Amazon S3本身)
您可以使用支持S3 API的非亚马逊软件(如Apache CloudStack、Digital Ocean等)来代替Amazon S3本身。要启用此功能,请将以下行添加到LocalSettings.php中
//The url used for the API (PutObject, etc.) $wgFileBackends['s3']['endpoint'] = 'https://my-custom-url'; //The url used for showing images. $1 is translated to the bucket name. $wgAWSBucketDomain = '$1.my-custom-url';
请确保也设置了$wgAWSBucketName
和$wgAWSRegion
。
某些软件(如MinIO)不使用子域名进行存储桶,在这种情况下,您需要以下配置
$wgFileBackends['s3']['use_path_style_endpoint'] = true;