建站/WIKI功能/站點維護

出自Wired
跳至導覽 跳至搜尋

用戶訪問權限

參考:Manual:Preventing_access#Restrict_viewing_of_all_pages

只有三種方案:有無賬戶都可以訪問;僅有賬戶的可訪問;僅有賬戶的可訪問,但能設置指定頁面可被遊客訪問。

如果想禁止遊客訪問(也應該禁止遊客的編輯權限)添加如下代碼:

# 禁止游客访问。
$wgGroupPermissions['*']['read'] = false;

# 禁止游客编辑。
$wgGroupPermissions['*']['edit'] = false;

# 禁止注册,如果是打造私人wiki,而不是单纯的防止垃圾邮件与爬虫。
$wgGroupPermissions['*']['createaccount'] = false;

添加例外(可以被遊客訪問的頁面):

$wgWhitelistRead = [

'圣王H的秘密基地导航页',
'游戏推荐',
'影视推荐',
'动漫推荐',
'MediaWiki:Common.css',
'MediaWiki:Common.js'

];

示例一個是我首頁的標題,最後兩個是css和js文件,都要有(如果依賴它們實現某些功能),不然樣式和功能會損壞,其他頁面根據自己需求加。

 

性能調優

※ 更多性能上的優化見:Manual:Performance_tuning

文件緩存

※ 參考信息:Manual:File_cache

配置文件添加:

$wgUseFileCache = true; // default: false
$wgFileCacheDirectory = "$IP/images/cache"; // default: "{$wgUploadDirectory}/cache" which equals to "$IP/images/cache"
$wgUseGzip = true; # 启用http压缩以更进一步减少资源占用(也可以单独启用它),测试是否有效:https://www.whatsmyip.org/http-compression-test/

非註冊用戶訪問頁面時,伺服器會輸出創建的.html緩存文件,而無需讓數據庫/PHP組織數據,以減少資源佔用(類似於生成靜態網頁生成器,4chan那種討論版大都是這樣)

注意事項:

  • 未創建緩存的頁面只有在非註冊用戶訪問後才會建立緩存,後續訪問才是調用的緩存文件;
  • 請根據 #可能的問題 第一條設定文件夾權限,以免無法建立緩存頁面、用戶編輯後無法刪掉舊緩存文件,導致白啟用文件緩存或非註冊用戶看不到更新。

已知問題:

  • 由於會將中文字符轉為url編碼,所以如果頁面標題過長可能會導致無法創建/訪問緩存文件:
    • 1個中文字符經過urlencode是9個英文字符,若文件名限制在255個字符內:
      • 具體取決於文件系統(終端查詢命令:df -T,這裏以linux較為常用的ext4為例。
    • 緩存頁面的格式是:ns0%3A页面标题的urlencode.html(命名空間|英文冒號:|頁面標題|文件後綴),如果啟用了壓縮還會有一個在此基礎上的.gz文件後綴;
    • 因此,需要標題在(255-3-3-5-3)/9≈26個中文字符內。
  • 用戶編輯頁面後,該頁面的緩存文件就會被刪除(因為已過時),但不會重建緩存文件:
    • 看有人提問過,但沒啥結果;
    • 影響就是第一個訪問此頁面的非註冊用戶會多加載一會兒、多傳輸十幾/幾十KiB的資源,他之後的用戶就正常訪問緩存頁面;
    • 所以可以不管,也可以設置定時任務每隔一天或多久就執行一次:#創建文件緩存

 

懶加載

※ 參考:Manual:$wgNativeImageLazyLoading

配置文件添加:

  • $wgNativeImageLazyLoading = true;

使圖像(內部圖像)設定為懶加載,即在頁面訪問到的時候再請求數據,適用於大量使用圖片的場景,既能避免只看某一塊卻下載所有資源的浪費情況,又能減少圖片資源過多導致的加載堵塞的情況。

已知問題:該設定不會影響嵌入的外部圖片,比如我都是用html代碼嵌入圖片;

  • 解決方案,給嵌入的外部圖像的img標籤設定屬性:loading="lazy",如:
  • <html><img loading="lazy" loading="lazy" style="width: 600px;" src='https://scio.eu.org/WIKI/图片/起居注/2023/Screenshot_20230908-050356.avif' /></html>
    

 

維護腳本

※ 參考:Manual:Maintenance_scripts/List_of_scripts(官方文檔有詳細的介紹,以下內容也都是摘自官方文檔)

需要通過通過命令行(在網站根目錄下)運行,1.40版本以後維護腳本必須用以下規範執行(也可以直接指向.php文件)

php maintenance/run.php 需要执行的脚本/命令

刪除無用內容

※ Mediawiki前端不存在真正的刪除,用戶/管理員將頁面刪除後,只是進入了普通用戶不可見的「存檔表」中,管理員仍舊可以恢復頁面——即數據庫仍舊被佔用,而我們作個人博客用途時刪除頁面的目的基本就是它們只是垃圾數據。

⚠ 警告:清楚所有修订记录会导致失去所有文章的变动记录,其中包括了页面创建的记录/时间 ⚠

常用的刪除腳本:

# 删除已删除页面(进入存档表的)的所有修订记录(含修订内容)。默认是查询,添加 --delete 参数以执行脚本。
php maintenance/run.php deleteArchivedRevisions
php maintenance/run.php deleteArchivedRevisions --delete

# 删除页面的所有现有页面(不含已删除/进入存档表的页面)的旧修订记录(含修订内容),只保留最新版本。不添加参数只查询有多少旧修订记录,添加 --delete 参数,将所有页面的历史修订尽数删除。
php maintenance/run.php deleteOldRevisions
php maintenance/run.php deleteOldRevisions --delete
# 添加页面ID用于删除指定页面的历史记录,适用于个别文章有隐私需求或造成太多数据冗余的情况。不添加 --delete 参数亦是只查询,添加则删除指定页面ID的历史修订记录。# 查询页面ID方式:在目标页面点击左侧边栏的“页面信息”
php maintenance/run.php deleteOldRevisions 28 32
php maintenance/run.php deleteOldRevisions 28 32 --delete

非常用的刪除腳本:

# 删除孤立的修订,处理从数据库中手动删除页面记录后留下的任何孤立修订。--report 参数是显示有多少符合条件的内容,删除此参数以执行脚本。
php maintenance/run.php deleteOrphanedRevisions --report
php maintenance/run.php deleteOrphanedRevisions

# 删除位于虚空(存在但不以任何形式链接到包括现有文章、被删除文章的任何修订历史中)中的文本,正常是不存在这种条目的,默认是查询,添加 --purge 参数以执行脚本。
php maintenance/run.php purgeOldText
php maintenance/run.php purgeOldText --purge

# 删除被删除的文件,被删除文件也是进入了“已删除”文件夹而非真正删除,默认是查询,添加 --delete 参数以执行脚本。
# 说是 --delete 选填,但我不加此参数不提示有多少待删除文件(不知道是否是0个的原因),而直接提示让添加此参数以运行脚本,添加后并运行倒是会提示数量(也是0个)
php maintenance/run.php deleteArchivedFiles --delete

還有一個缺點,那就是無法刪除日誌(特殊:日志),比如文件的上傳和刪除日誌、頁面的創建日誌等等,是不會刪除的,主要是刪的文件和編輯的歷史記錄(修訂)

建立站點地圖

# 参数作用分别为:限制体积在50M内,.xml文件保存路径,标识符,xml文件中记录的xml文件路径(忽略网站根目),完整域名,是否压缩文件,跳过重定向。
php maintenance/run.php generateSitemap --memory-limit=50M --fspath=/var/www/html/mediawiki/sitemap/ --identifier=wiki --urlpath=/sitemap/ --server=https://wiki.scio.icu --compress=no --skip-redirects

# 软链接到网站根目录以便于爬虫获取资源(在网站根目录下运行)。
ln -s ./sitemap/sitemap-index-标识符.xml sitemap.xml

創建文件緩存

※ 此緩存為創建.html緩存頁面以減少伺服器資源佔用,需要配合#文件緩存使用。

# 给所有页面创建.html缓存文件,如果已经被缓存会跳过
php maintenance/run.php rebuildFileCache

# 重新创建缓存文件
php maintenance/run.php rebuildFileCache --overwrite

清除緩存

清除緩存能解決一小部分的問題,主要是頁面本身的變化,重新渲染wikitext語法使其他地方的變動作用到當前頁面,比如引用的內容發生了變化、插入的內鏈失效或生效、wikitext語法或拓展的特殊指令的樣式變化等等。#刷新頁面緩存中說明了對單個頁面的操作,但如果要批量操作,還是需要利用維護工具。

php maintenance/run.php purgePage

已知的問題:

  • 需要使用www-data用戶組內的賬戶運行命令:https://askubuntu.com/a/948488
    • 使用www-data用戶:sudo su -l www-data -s /bin/bash
    • 默認在/var/www/目錄下,除了權限問題(例如無法創建文件)跟正常賬戶一樣使用。
  • 運行命令無響應:
    • 使用:php maintenance/run.php purgePage.php < list.txt
      • www-data用戶組如果沒權限創建文件(list.txt),請在普通/root用戶下創建好,支持中文字符(無法輸入中文就外面編輯好粘貼進去),每行一個頁面的標題即可。

空編輯

清除緩存作用不到頁面之外,而空編輯(A null edit)則是由mediawiki的特色處理方式衍生而來的操作,因為在末尾插入換行符、在現有空格邊再插入空格(多個空格會被渲染為一個空格,除非是行首的空格在wikitext中會被解析為預排格式這種有特殊用途的),便可以提交編輯,但不會被記錄(最近更改、頁面歷史記錄均無)。

但編輯頁面會刷新與之相關的所有內容,例如直接通過xml導入頁面,原頁面擁有分類歸屬或引用了內鏈,導入後儘管會完整渲染樣式,但系統裏沒有相關從屬記錄,例如分類頁找不到該頁面、被引用頁面的鏈入頁面也無該頁面;例如給cargo表添加了列也無法被記錄。清除緩存無法作用到頁面以外的部分,因此空編輯成了最好的解決方案,但手動空編輯也太慢了。

利用了外部js腳本:MassNullEdit實現:

  • 建立頁面:MediaWiki:MassNullEdit.js,粘貼此頁代碼:MediaWiki:MassNullEdit/code.js
  • 建立頁面:MediaWiki:MassNullEdit.css,粘貼此頁代碼:MediaWiki:MassNullEdit.css
  • 編輯:MediaWiki:Common.js,添加內容:importScript('MediaWiki:MassNullEdit.js');
  • 編輯:MediaWiki:Common.css,添加內容:@import url('MediaWiki:MassNullEdit.css');
  • 刷新瀏覽器緩存(ctrl+f5),在左側邊欄會出現「批量空编辑」的選項,點擊後會彈出窗口供輸入頁面標題,每行一個,從「特殊:所有页面」中複製即可,無需刪除多餘的前綴空格。

※ 但畢竟是編輯,相較於清除緩存更消耗時間及伺服器性能。

重建

不過官方提供了更專業的腳本Rebuildall.php來重建所有內容,以應對包括導入頁面後無從屬關係的異常情況,效力大於空編輯。

php maintenance/rebuildall.php

清除緩存作用於頁面內容,空編輯作用於與頁面及頁面內容相關的,而重建腳本則作用於整個站點,是從數據庫層面刷新頁面,速度也比空編輯快,但其作用範圍太廣泛了,遇到疑難雜症(例如「需要的分類」中出現了幽靈分類,沒有任何頁面指向它卻也無法將之去除)可以嘗試,一般頁面連結之類的小問題我還是交給空編輯吧。

 

備份/恢復/升級

對於只涉及頁面的備份與恢復(.xml)

※ 弊端就是所涉內容不會列入特殊:統計信息,亦不進入監視列表。

特殊:所有页面:因為默認的從分類獲取頁面的功能只能查詢一級,可以直接從此複製粘貼列表。你可能需要注意的幾個命名空間:

  • (主):默認的普通文章創作;
  • 用户:給用戶創建的頁面;
  • 文件:上傳的文件(數據庫中有文件頁面與本地資源路徑的索引,因此如果繞過數據庫,就需要重新上傳文件);
  • 模板:創建的模板,如果您還啟用了模块微件等,記得也要備份;
  • mediawiki:主要是MediaWiki:Common.css(css文件)、MediaWiki:Sidebar(側邊欄)、MediaWiki:Mainpage(首頁)

特殊:导出页面:導出頁面數據為.xml文件:

  • 默認不包含修訂,只有最新版本,這樣會減少很多數據冗餘,但就不含創建時間了;
  • 默認不包含模板,如果勾選,那麼會一併備份頁面中使用的模板:xxx頁面。

特殊:导入页面:在新站點上傳文件:

  • 請按照 #可能的問題 第四條設定體積限制;
  • 跨WIKI前綴隨便寫就行,沒有發現實際起到了什麼作用;
  • 建議勾選「將編輯分配到本地存在的同名用戶名下」;
  • 註釋隨便寫,默認的導入原命名空間即可。

其他可能需要調整的:

  • MediaWiki:Mainpage修改了首頁後,將「首頁」頁面其移動到設定的首頁頁面(不必保存重定向);如果已經將目標頁面填充了內容,那直接刪除「首頁」頁面就行。

對於相同web環境的備份與恢復

  • 備份數據庫:LAMP#備份/恢復數據庫
  • 備份網站資源:建議直接在網站根目錄下用zip命令打包所有文件;
  • web環境:您在 部署Web環境 時修改了哪些東西?如果沒有什麼好在乎的修改,可以重新配置環境,如果有,記錄相關修改或導出相關文件即可。
  • 在新伺服器原樣導入即可。

對於相同web環境的升級框架版本

先備份:

  • 數據庫:參考LAMP#備份/恢復數據庫
  • 網站資源:
    • 拓展:./extensions/
      • 只記錄擴展名再從官網下載非預裝擴展的最新版本;
      • 可以參考配置文件中啟用的拓展,亦可用:tree -L 1 -d > tree.txt 獲取當前目錄下的文件夾列表並輸出到tree.txt文件中,識別其中的非預裝擴展並下載下來;
    • 圖片:./images/
    • 配置文件:./LocalSettings.php
    • 網站圖標:
      • /网站根目录/resources/assets/ 下的log文件
      • 如果您修改了皮膚樣式或其他內容,請也對所涉及資源進行備份
    • 其他網站內配置,如:
    • 以及框架資源外的文件,如 :
      • robots.txt
      • 網站根目錄下的圖標文件:favicon.ico

再升級:

  • 按照 安裝指南 重新下載並解壓;
    • 如果跨版本過大請注意注意php與數據庫的兼容性
    • 請不要直接刪除舊文件夾,可以重命名為 文件夹_旧 備用。
  • 測試站點是否可訪問;
  • 將舊配置(LocalSettings.php)文件移動到框架根目錄;
    • 建議重新配置,配置數據庫時,填寫曾用數據庫名,系統會檢測並自動更新數據庫表以使其適用於當前版本。
  • 將最新版本的擴展移動至擴展文件夾(./extensions/),圖片及其他站內外數據也盡數移動回來;
    • 如果通過ftp傳輸而訪問報錯,別忘了設置訪問權限
      • 如果對擴展文件全都賦予了644權限,記得對#代碼塊#模塊(假若有啟用)單獨改下權限以免有些功能無法使用。
  • 更新數據庫及其他東西(網站框架根目錄下運行):
    • php maintenance/run.php update.php
    • 這是最主要的步驟,將對數據庫的更新(內容和表的結構),這個更新是不可逆(或很難/一旦出毛病無法處理)的,所以在更新前務必確保自己備份了數據庫,不論是回滾版本還是防止數據庫損害都有利而無害。

至此框架的升級完成了。