MediaWiki
简介
Wiki是一种在万维网上开放且可供多人协同创作的超文本系统,Howard G. Cunningham于1995年实现了世界上第一个Wiki系统——波特兰模式知识库,该系统最早是为了方便模式社区的交流而搭建。在搭建该系统的过程中,Howard提出了Wiki的概念,Howard将wiki定义为“一种允许一群用户用简单的描述来创建和连接一组网页的社会计算系统”。
波特兰模式知识库在发展过程中,发展出了一系列辅助写作的工作,而且网络上也出现了各种模仿者,其中最出名的模仿者是维基百科。
MediaWiki用PHP语言编写,最初是为维基百科量身打造的自由开源的wiki套件。目前非营利的维基媒体基金会下辖的所有wiki项目以及MediaWiki都建基于此套软件上。此外还有大量Wiki软件基于MediaWiki搭建。
原理
MediaWiki的语法和普通的Html是有区别的,编写更为简单,但是表现能力比Html较弱,但是MediaWiki的语法可以混合Html标签。
表现能力
MediaWiki的语法提供了以下内容的语法。
内容 | 语法 |
---|---|
文字 | 两个或者更多'包裹起来的文字可以展现不同的样式,
例如两个''包裹起来表示斜体,三个表示粗体,五个实现粗斜体。 使用类Html标签<big>,<small>,<font>,<span>也可以修改文字的样式。 |
标题 | 一至六个=包裹起来的内容代表标题,从一到六分别表示1级至6级标题。 |
列表 | #号或者*开头的内容可以表示列表,其中#代表有序列表,*代表无序列表,#或者*的个数代表列表的层级。 |
链接 | [[]]包裹起来的内容代表链接 |
扩展能力
架构
使用
安装
源码安装
MediaWiki的源码可以从两个渠道获取,
release版本可以从网站官网下载,目前最新的版本是1.3.8。
其他非release版本可以从git仓库下载。
需要注意的是git库下载的非release版本的代码只包括核心部分代码,扩展例如extends和skins文件夹的内容均为空,需要自行下载进行扩展。
MediaWiki的扩展可以从官网的扩展分类页面查询,对应的皮肤在皮肤分类页。
软件依赖
MediaWiki至少依赖php运行环境和一款web服务器,例如apache或者nginx。
MediaWiki目前不支持php8,在使用php8运行的过程,执行Math扩展发生错误:TypeError: array_key_exists(): Argument #2 ($array) must be of type array, stdClass given,降级到php7.4可以解决问题。
为了运行MediaWiki,php需要安装以下插件:
intl calendar pdo pdo_mysql mysqli gd exif
值得注意的是exif插件,如果不安装该插件,则不能正确获取jepg格式图片的长宽信息,从而不能正确展示以及压缩图片。
作为web服务器,nginx或者apache承担网站入口流量,以及和php交互,其配置样例如下:
server {
listen 80;
server_name www.hengzhou.info;
root /var/www/html;
index index.html index.htm index.php;
client_max_body_size 5m;
client_body_timeout 60;
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
location /rest.php {
try_files $uri $uri/ /rest.php?$args;
}
location ^~ /maintenance/ {
return 403;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
try_files $uri /index.php;
expires max;
log_not_found off;
}
location = /_.gif {
expires max;
empty_gif;
}
location ^~ /cache/ {
deny all;
}
location /dumps {
root /var/www/mediawiki/local;
autoindex on;
}
}
扩展问题
MediaWiki提供了很多特殊页面可以对界面展示进行扩展和表达。
自定义样式可以在MediaWiki:Common.css配置。
每种皮肤还有自己不同的扩展方式,例如Tweek皮肤可以配置导航栏以及边栏的各种信息,详见官网。
MediaWiki:Math插件需要安装Mathoid,Mathoid只能使用node10进行编译和运行。
MediaWiki:CodeEditor插件的高亮功能需要python支持。
图片上传默认是保存在本地的Images文件夹,对于集群应用来说,需要保存在单独的server,MediaWiki:AWS插件可以实现该功能,腾讯云的COS组件兼容S3协议,可以直接使用。
Extension:PinyinSort可以让分类按照文档标题的首字母进行排序。
特殊:特殊页面 是Wiki上所有的特殊页面。
MediaWiki可以删除页面的Tab,具体参考https://www.mediawiki.org/wiki/Manual:Remove_Tabs
VisualEditor
VisualEditor目前是MediaWiki带的默认的编辑器。
当通过nginx的docker访问mediawiki的docker是产生如下错误。
Error contacting the Parsoid/RESTBase server: (curl error: 7) Couldn't connect to server
通过抓包发现:
15:16:21.577510 IP 127.0.0.1.44078 > 127.0.0.11.49400: UDP, length 35
0x0000: 4500 003f 9226 4000 4011 aa7b 7f00 0001 E..?.&@.@..{....
0x0010: 7f00 000b ac2e c0f8 002b fe48 5864 0100 .........+.HXd..
0x0020: 0001 0000 0000 0000 0377 7777 0961 6967 .........www.aig
0x0030: 6574 7469 6e67 0363 6f6d 0000 0100 01 etting.com.....
15:16:21.577526 IP 127.0.0.1.44078 > 127.0.0.11.49400: UDP, length 35
0x0000: 4500 003f 9227 4000 4011 aa7a 7f00 0001 E..?.'@.@..z....
0x0010: 7f00 000b ac2e c0f8 002b fe48 4567 0100 .........+.HEg..
0x0020: 0001 0000 0000 0000 0377 7777 0961 6967 .........www.aig
0x0030: 6574 7469 6e67 0363 6f6d 0000 1c00 01 etting.com.....
15:16:21.581521 IP 127.0.0.11.53 > 127.0.0.1.44078: 22628 1/0/0 A 127.0.0.1 (51)
0x0000: 4500 004f 5dd4 4000 4011 debd 7f00 000b E..O].@.@.......
0x0010: 7f00 0001 0035 ac2e 003b fe58 5864 8180 .....5...;.XXd..
0x0020: 0001 0001 0000 0000 0377 7777 0961 6967 .........www.aig
0x0030: 6574 7469 6e67 0363 6f6d 0000 0100 01c0 etting.com......
0x0040: 0c00 0100 0100 0000 0100 047f 0000 01 ...............
15:16:21.602505 IP 127.0.0.11.53 > 127.0.0.1.44078: 17767 0/0/0 (35)
0x0000: 4500 003f 5de7 4000 4011 deba 7f00 000b E..?].@.@.......
0x0010: 7f00 0001 0035 ac2e 002b fe48 4567 8180 .....5...+.HEg..
0x0020: 0001 0000 0000 0000 0377 7777 0961 6967 .........www.aig
0x0030: 6574 7469 6e67 0363 6f6d 0000 1c00 01 etting.com.....
15:16:21.602817 IP 127.0.0.1.37290 > 127.0.0.1.80: Flags [S], seq 4247007679, win 65495, options [mss 65495,sackOK,TS val 232739462 ecr 0,nop,wscale 7], length 0
0x0000: 4500 003c a20a 4000 4006 9aaf 7f00 0001 E..<..@.@.......
0x0010: 7f00 0001 91aa 0050 fd24 31bf 0000 0000 .......P.$1.....
0x0020: a002 ffd7 fe30 0000 0204 ffd7 0402 080a .....0..........
0x0030: 0ddf 5286 0000 0000 0103 0307 ..R.........
15:16:21.602822 IP 127.0.0.1.80 > 127.0.0.1.37290: Flags [R.], seq 0, ack 4247007680, win 0, length 0
0x0000: 4500 0028 0000 4000 4006 3cce 7f00 0001 E..(..@.@.<.....
0x0010: 7f00 0001 0050 91aa 0000 0000 fd24 31c0 .....P.......$1.
0x0020: 5014 0000 f0ee 0000 P.......
请求在过程中曾经访问127.0.0.1:80,而127.0.0.1是为了测试在本地配置的域名,所以修改wiki的docker中的host,将域名指向nginx,问题解决。
样式问题
隐藏首页标题:
{{DISPLAYTITLE:<span style="position: absolute; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);">{{FULLPAGENAME}}</span>}}
常见问题
安装过程中测试环境链接不上数据库,如果使用docker,请排查不同docker容器之间的网络联通性。
安装之后,默认php的error_reporting设置为EALL,需要修改php.ini文件,同时生成的LocalSettings.php可能会包含有error_report信息,需要手动删除。
VisualEditor编译器如果出现链接rest失败,可能是nginx配置文件的问题。