在 MediaWiki 中使用騰訊云 COS 對象存儲存儲圖像
前言
鄙人是某小MC服的服主,平常為了記錄服內(nèi)的破事和一些基本概念便選用了 MediaWiki 為服務(wù)器知識庫的框架,陸陸續(xù)續(xù)用到現(xiàn)在也有2個年頭了。
最近在日常維護(hù)摸魚的時候發(fā)現(xiàn)空間占用越來越大了。一查發(fā)現(xiàn) wiki 目錄下的 /images 文件夾占了 2.6 GB 多。
我用的是騰訊云(香港)的輕量云主機(jī),空間只有 30 GB。一直這樣下去 30G 的空間可能會越用越少。于是經(jīng)過一番資料查閱后,打算把圖片數(shù)據(jù)從 wiki 本體中分離開,遷移到騰訊云的 COS 對象存儲。
雖然我自己在建站這方面基本一竅不通,但還是這里寫個專欄記錄一下(免得以后忘了自己怎么操作的),除了給自己看以為希望能幫到有同樣需求的人。感覺中文互聯(lián)網(wǎng)上關(guān)于 MediaWiki 的教程還是偏少(為了搞短鏈接折騰了大半個月)。

特點
圖片如果存在 MediaWiki 默認(rèn)的附件目錄下,用久了以后占用會越來越大,再加上機(jī)子上還跑著朋友的網(wǎng)站,肯定不夠用,于是果斷轉(zhuǎn)用騰訊云 COS 對象存儲。
圖片加載速度變快(取決于存儲桶地域)。我的主機(jī)在香港,更換后加載頁面圖片快了許多(存儲桶在上海,訪問是福州電信)。
減少空間占用。遷移后站點只有 200 MB 了,比朋友的 XenForo 站點還少了很多。
但是但是,存儲桶的費用需要額外支付,你可以購買資源包。
TTFB 會慢一些。使用 MemCached + PHP 操作碼緩存能起到優(yōu)化的效果。


環(huán)境
圖方便所以用的是寶塔面板,文中以寶塔面板 + CentOS 為例示范。
MediaWiki 版本: 1.39.1
寶塔面板版本: 7.9.7
站點 PHP 版本: 8.1
Nginx 版本: 1.22.1
MySQL 版本:?5.6.50
系統(tǒng): CentOS 7.6
主機(jī): 騰訊云 輕量應(yīng)用服務(wù)器 香港(2C2G 30M)

開始安裝
使用騰訊云 COS 實現(xiàn)外部存儲需要使用到一款 MediaWiki 擴(kuò)展。GitHub 鏈接見下,根據(jù)頁面信息來看,支持 1.35 及以上的版本。我在 1.39.1 下實測一切正常。
https://github.com/RazeSoldier/MediaWiki-extension-QCloudStorage
有經(jīng)驗的站長可以直接進(jìn)入 GitHub 頁面安裝并配置。
但無論如何,操作前請備份!操作前請備份!操作前請備份!

插件安裝
這一步是下載擴(kuò)展本體。進(jìn)入寶塔面板的“文件”頁,切換路徑到你的 wiki 擴(kuò)展目錄下(/extensions),點擊“終端”按鈕??寺}庫,并等待命令執(zhí)行完成即可。
git clone https://github.com/RazeSoldier/MediaWiki-extension-QCloudStorage.git


1、這一步是重命名。命令執(zhí)行完成后關(guān)閉臨時終端窗口。刷新頁面,擴(kuò)展目錄(/extensions)下會出現(xiàn)名為?mediaWiki-extension-QCloudStorage 的文件夾,將它重命名為 QCloudStorage。
2、這一步是安裝 PHP 依賴包,這一步很重要。擴(kuò)展除了本體以外還需要其他的 PHP 依賴包。切換至寶塔面板的“網(wǎng)站”頁,點擊你的站點。進(jìn)入“站點修改”窗口后,選擇 Composer 選項卡。
如果提示缺少 Composer 管理器,請安裝后繼續(xù)。選項卡內(nèi)的 PHP 版本根據(jù)你主機(jī)的實際情況選擇(我安裝了 2?個版本的 PHP),執(zhí)行用戶切換為 root?以避免權(quán)限不足。執(zhí)行目錄切換到?/extensions/QCloudStorage 下。也就是我們剛剛重命名的文件夾。
以上步驟都操作后,點擊綠色的“執(zhí)行按鈕”,開始安裝依賴,如果下載速度很慢可以切換為阿里源。安裝完成后寶塔會出現(xiàn)“安裝完成”的提示。安裝完成后,重啟 PHP。

3、這一步是加載擴(kuò)展。進(jìn)入寶塔面板的“文件頁”,對?wiki 目錄下的 LocalSettings.php 文件進(jìn)行編輯。在其中添加以下內(nèi)容。
wfLoadExtension( 'QCloudStorage' );
加載擴(kuò)展后可在 wiki 的“特殊:版本”頁面中驗證是否安裝。


COS 配置
安裝步驟完成后,我們需要騰出手來確定 COS 的基本信息。請確保你了解以下關(guān)于 COS 的信息。
存儲桶名稱(如 bucket-114514)
存儲桶地域(如 上海、北京)
騰訊云?SecretID
騰訊云 SecretKey
存儲桶的權(quán)限模式不能是“私有讀寫”,“公有讀私有寫”或“公有讀寫”可以。此外,存儲桶最好離主機(jī)近一點。
存儲桶信息可在騰訊云控制臺內(nèi)查詢,SecretID 和 SecretKey 為騰訊云賬號 API 密鑰管理中的信息??梢允褂弥髻~戶也可以新建子賬號。


配置
安裝步驟完成后,我們需要對 QCloudStorage 擴(kuò)展進(jìn)行基本的配置。請不要關(guān)閉?LocalSettings.php?的編輯窗口。接下來的操作依舊與?LocalSettings.php 相關(guān)。
1、在?LocalSettings.php?添加根據(jù)你的 COS 配置信息添加信息。只有添加注釋的行才能修改,其余的請一個字符也不要修改,注意大小寫。
$wgFileBackends[] = [
'name' => 'qcloud',
'class' => \RazeSoldier\MWQCloudStorage\QCloudFileBackend::class,
'wikiId' => 'wiki',
'bucket' => 'bucket-114514', // 你的存儲桶名字。格式: `<name>-<appid>`
'lockManager' => 'fsLockManager',
'viewpoint' => 'https://cdn.example.com', // 自定義域名,一般用不到,CDN?或者全球加速之類的才需要。如果不需要不要添加此行。
];
$wgQCloudAuth = [
'region' => 'ap-guangzhou',// 存儲桶地域
'secretId' => 'XXX', // 騰訊云 SecretID
'secretKey' => 'XXX', // 騰訊云?SecretKey
];
添加好以上參數(shù)后,保持并關(guān)閉文件編輯器。在“特殊:版本”頁面刷新,刷新沒有提示崩潰信息則說明配置無誤。
2、開始轉(zhuǎn)移舊圖像。進(jìn)入寶塔面板的“文件頁”,切換到 /maintenance 目錄下,點擊上方的“終端”按鈕,在終端窗口內(nèi)輸入以下內(nèi)容。
php copyFileBackend.php --src local-backend --dst qcloud --containers local-public
也許 PHP 會提示 "syntax error" 和 "PHP warning" 等,無需在意。在這之后出現(xiàn) "Copying file(s)..." 后就意味著文件開始像 COS 存儲桶轉(zhuǎn)移。具體的操作時間取決于你的主機(jī)上傳速率、已有的圖像大小。
如果發(fā)生錯誤,請檢查存儲桶信息配置、安裝 PHP 依賴包是否有誤。
我花了6個小時轉(zhuǎn)移。文件夾總大小雖然只有?2.6 GB,但里面的小文件、產(chǎn)生的略縮圖很多,建議掛在那。寶塔貌似頁面關(guān)閉終端也會斷開,擔(dān)心斷開的可以用 SSH 操作。


3、再次打開?LocalSettings.php 編輯窗口,在里面添加以下內(nèi)容。本段的任何文字都不需要修改。
$wgLocalFileRepo = [
'name' => 'local',
'class' => \RazeSoldier\MWQCloudStorage\QCloudRepo::class,
'backend' => 'qcloud',
];
保存并關(guān)閉編輯器,刷新頁面即可。
4、進(jìn)入騰訊云存儲桶“安全管理”選項卡中的“跨域訪問CORS設(shè)置”,按照站點信息添加規(guī)則。


這一步是為了避免以下情況做的,避免不對跨域進(jìn)行設(shè)置從而導(dǎo)致 MediaViewer 無法加載圖片。如果沒這個問題可以跳過這步。

驗證是否生效的話,在已上傳文件里隨便找個圖片打開看看原鏈接是不是指向 COS 的就行了。但一般來說只要?$wgLocalFileRepo 添加在 LocalSettings.php 文件中就會立刻生效的,就算有問題你刷新頁面后也能發(fā)現(xiàn)。
確定一切沒問題后就可以刪除 /images 文件夾了。刪除后空間一下子多了起來,看著舒服多了,就 200 MB 出頭。

踩過的坑
配置后提示 MediaWiki internal error 和 QCloud not found 是為什么?
PHP 依賴包安裝有誤。退回去看看那一步哪里出了問題。如果確定安裝后還是報錯,重啟 PHP 應(yīng)該能解決。
轉(zhuǎn)移舊圖像出錯是為什么?
檢查 PHP 依賴包安裝是否有誤。如果無誤再檢查下輸入的命令有沒有問題?
轉(zhuǎn)移過程中可以有其他用戶編輯嗎?
這我還真沒試過,但轉(zhuǎn)移時別讓用戶上傳文件,可以暫時禁用。編輯頁面和數(shù)據(jù)庫有關(guān),和圖庫反而沒啥關(guān)系,編輯頁面應(yīng)該不影響。但還是建議都暫時停一下。
為啥和 GitHub 頁面中步驟不一樣?
我按照自己經(jīng)驗寫的,盡量把踩過的坑寫出來。。。按照原文也可以的嘿嘿
為啥我轉(zhuǎn)移完文件后圖片都沒加載出來?
確定配置文件里的參數(shù)都沒問題,重啟 Nginx 看看。
配置好了,但是訪問速度變慢了?
可以配置對象緩存可以緩解速度,使用 MemCached + PHP 操作碼緩存后網(wǎng)站的 TTFB?已經(jīng)與未配置 COS 時的速度接近(我這邊 3s~4s?左右,已經(jīng)是能接受的范圍內(nèi)了,未優(yōu)化的時候速度能到 15s?甚至更高)??梢詤⒖脊俜疥P(guān)于性能優(yōu)化的文檔,當(dāng)然具體為啥我也不太清楚(看 Issues 貌似是騰訊云那邊拉取對象耗時的原因)。。。
https://www.mediawiki.org/wiki/Manual:Performance_tuning/zh
如果可以的話,配置 CDN 也許也可以提升加載時間。