安装和自定义 MediaWiki

作者:Reuven M. Lerner

多年前,我第一次接触到维基的想法。一位同事告诉我一个网站,该网站邀请读者成为作者和编辑。他说,随着时间的推移,维基百科会不断增长,包含大量的知识,这些知识来自集体经验,而不需要任何集中的协调分配或编辑。我的第一反应是非常矛盾的。一方面,一个由善意和守纪律的用户组成的社区确实可以在许多有用的方面使用维基。但与此同时,这似乎是在邀请混乱。而且,不可否认的是,混乱有时确实是结果。

多年来,维基百科变得越来越普遍。现在有几十种不同的软件包可用,几乎涵盖了每种编程语言和每个 Web/数据库框架。问题不再是维基百科是否可用,或者安装起来有多容易,而是维基百科是否是适合您需求的工具,以及现有软件包中哪个最适合您的组织。

虽然关于公共维基百科的长期可行性,至少在一定程度上仍然悬而未决,但令人惊叹的维基百科项目已经证明,获得出人意料的好结果是可能的。在我撰写这篇文章几周前发布的一项研究报告称,在科学相关文章方面,维基百科的准确性仅略低于《大英百科全书》。考虑到《大英百科全书》是由付费专家撰写和编辑的,而维基百科则依赖志愿者(当然,他们也可能是专家),很明显,维基百科不一定会导致我所担心的混乱。

话虽如此,我强烈感觉到维基百科的声誉得以维护,不是因为公众对维基百科的内在喜爱,而是因为有一支由维基百科人组成的敬业团队在幕后运作,以确保内容可行。

正如我在上面写到的,有很多选项可以在您自己的 Web 服务器上创建维基百科。其中一个最著名的软件包是为维基百科提供支持的软件包,称为 MediaWiki。在本文中,我们将讨论如何在您自己的服务器上安装 MediaWiki,如何创建和编辑静态内容,以及如何甚至创建动态特殊页面。

安装 MediaWiki

虽然维基百科包含大量文本,但运行它的 MediaWiki 软件却出奇的小巧、易于理解且易于安装。该软件本身是用 PHP 编写的,它依赖 MySQL 数据库来存储内容和索引。也就是说,MediaWiki 站点上的任何页面都不以文件的形式存在于磁盘上;相反,它们是由 PHP 程序动态创建的,为每个单独的访问者汇集了许多元素。

因此,要安装 MediaWiki 软件,您需要一台运行 PHP 和 MySQL 的服务器。PHP 可以在多个平台上运行,但为了本文的目的,我们将假设您正在使用 Apache 服务器,并且 PHP(至少 4.1.2,尽管首选 4.3)和 MySQL(至少 3.2.x,但首选 4.0.x)的版本都相对较新。大多数现代 Linux 发行版都包含 PHP 和 MySQL,或者可以从在线存储库中轻松获取它们。您需要 Apache 和 MySQL 的管理权限才能安装 MediaWiki。如果您没有运行自己的服务器,您可能需要请系统管理员帮助修改相应的配置文件。

虽然您可以直接从 SourceForge 下载 MediaWiki 软件,但您应该在 MediaWiki 主站点 www.mediawiki.org 上查找它。进入该页面后,单击版本和下载链接(在页面右侧),然后单击当前稳定版本的相应链接。仅当您了解可能与之相关的问题时,才下载旧版本或实验版本。

该软件以 .tar.gz 文件的形式提供,其中包含版本号。例如,我下载的文件名为 mediawiki-1.5.3.tar.gz,表明我下载的是 1.5.3 版本,截至 2005 年 12 月 21 日为最新版本。将该文件保存在临时位置(我通常更喜欢将此类文件放在名为 /downloads 的目录中);在处理完 Apache 配置后,我们将返回到它。

如果您的站点仅运行 MediaWiki 软件,则可能没有理由修改您的 Apache 配置文件,传统上该文件名为 httpd.conf。在这种情况下,您可以按照 MediaWiki 站点上的说明,将 .tar.gz 文件解压缩到站点的 htdocs 目录中。如果您的发行版使用另一个目录作为其文档根目录,您显然必须适应您发行版的首选项。

虚拟服务器

如果您想将 MediaWiki 安装放在现有 Apache 安装上的虚拟服务器中,您需要修改 Apache 配置文件,以在您的系统上创建一个新的虚拟主机。HTTP 的现代版本要求 Web 浏览器从特定的主机名请求文档。Apache 中的虚拟主机功能允许一台 Web 服务器为许多不同的主机名提供文档,即使所有名称都解析为单个 IP 地址。如果您只是想尝试 MediaWiki,而不影响您站点的其余部分,或者如果您的站点的大部分内容在与 MediaWiki 大部分不兼容的框架(例如 Zope 或 Ruby on Rails)下运行,那么虚拟主机可能是一个明智之举。我经常使用此类虚拟主机来试验新软件和配置,而不会对现有的稳定站点造成潜在的危害。

Apache 的 VirtualHost 部分允许您配置一个或多个此类虚拟服务器,每个服务器都有自己的配置。在为我的系统配置 MediaWiki 时,我需要在 httpd.conf 中添加以下 VirtualHost 部分

<VirtualHost 69.55.225.93>

ServerName wiki.lerner.co.il
    ServerAlias mediawiki.lerner.co.il wikipedia.lerner.co.il
ServerAdmin reuven@lerner.co.il

DocumentRoot /usr/local/apache/v-sites/wiki.lerner.co.il/www/
DirectoryIndex index.php

CustomLog
/usr/local/apache/v-sites/wiki.lerner.co.il/logs/access-log combined
CustomLog
/usr/local/apache/v-sites/wiki.lerner.co.il/logs/referer-log referer
ErrorLog /usr/local/apache/v-sites/wiki.lerner.co.il/logs/error-log

</VirtualHost>

VirtualHost 部分的前两行定义了这个新虚拟服务器的名称和别名。通过添加别名,我可以确保即使人们输入不同的名称,他们也会到达正确的位置。(因为我已经要求我的托管公司将 lerner.co.il 域中的所有主机名都别名为我的服务器的 IP 地址,所以我可以随时添加和删除新的虚拟主机,而无需修改 DNS 配置。)然后我将 ServerAdmin 设置为我自己的电子邮件地址,以确保错误消息会将人们定向到我。

接下来,我指示 wiki 的根目录(即 Apache 应该在其中查找定义它的 PHP 程序的位置)位于 /usr/local/apache/v-sites 下,我在那里放置了我机器上的所有虚拟服务器。然后,每个站点都会根据其名称获得一个子目录,该子目录下有两个目录(www 和 logs)。因此,在上述配置中,我已将 DocumentRoot 定义为 v-sites/wiki.lerner.co.il/www 下,并将访问、引用和错误日志放在 v-sites/wiki.lerner.co.il/logs 下。

将上述配置添加到 httpd.conf 后,我重新启动 Apache。此时,如果我转到 http://wiki.lerner.co.il,我会收到错误消息,因为我尚未安装该软件。

要安装 MediaWiki 软件,我下载最新的 .tar.gz 文件,并在 v-sites/wiki.lerner.co.il 中打开它

cd /usr/local/apache/v-sites/wiki.lerner.co.il/
tar -zxvf /downloads/mediawiki-1.5.3.tar.gz
mv mediawiki-1.5.3 www

完成此操作后,我将我的 Web 浏览器指向 http://wiki.lerner.co.il,并收到一条消息,说我仍然需要配置该软件。但是权限设置不太正确,这意味着 MediaWiki 无法写入其配置目录。MediaWiki 并没有以难以理解的错误消息中止,而是友好地告诉我文件系统权限存在问题,甚至提醒我如何使用 chmod 来解决问题。

更改权限后,MediaWiki 然后向我显示了初始配置屏幕。老实说,我没有做太多事情;我输入了我的维基的名称 (ReuvenWiki),并且几乎保留了所有其他内容的默认值。我在维基系统本身中为 WikiSysop 用户输入了密码。而且,我输入了数据库用户的密码,并输入了 MySQL 管理用户的密码。

请记住,您在这里跟踪三种类型的用户名,这可能有点棘手。您的 Linux 系统有一组用户和权限,MySQL 有其自己的一组用户和权限,MediaWiki 软件也有其自己的一组用户和权限。虽然这看起来可能有点过分,但它提供了很大的灵活性,允许您在安全可靠的环境中运行 MediaWiki。

填写完上述所有信息后,我单击了“安装!”按钮。与许多 Web 应用程序不同,这些应用程序仅在完成工作后才产生输出,MediaWiki 安装程序在安装程序运行时会友好地提供更新,让您了解它在做什么以及您可能还需要等待多久。最后,您应该(希望)看到一条注释,指示安装成功,并且您应该将 config/LocalSettings.php 移动到父目录(www 目录)中

mv -v config/LocalSettings.php .

完成此操作后,我可以重新在我的 Web 浏览器中输入 URL (http://wiki.lerner.co.il)。而且,果然,我看到了 MediaWiki 的初始页面,该页面告诉我该软件已成功安装,并指向两个页面,一个用于自定义界面,另一个用于描述用法和配置。

基本导航和编辑

如果您曾经使用过维基百科,那么浏览 MediaWiki 站点对您来说将非常熟悉。如果不是,则基本规则如下:单击页面内的链接会将您带到 MediaWiki 站点内的另一个页面。例外情况是链接后跟一个箭头图标,这表示该链接将打开另一个服务器上的站点。站点上的所有页面不仅可以供公众查看,而且还可以编辑。如果您想更改页面的内容,请单击“编辑”链接(在每个 MediaWiki 屏幕的顶部),根据您的需要修改内容,然后在完成后单击“保存”按钮。

MediaWiki 试图尽可能方便用户参与,而无需了解技术方面的内容。因此,最终用户无需了解 HTML;他们可以单击各种按钮(并使用简化的格式系统)来格式化他们发布到系统的内容。例如,输入 [[Foo]] 会创建一个指向页面 Foo 的链接,无论该页面是否已存在。而且,输入 [[Foo | This leads to Foo]] 形式的链接会插入一个指向 Foo 页面的链接,但文本为“This leads to Foo”。

比 MediaWiki 的简单标记语言更重要的是,对系统所做的每个更改都保存在易于使用的版本控制系统中。通过单击给定页面上的“历史记录”链接,即使是非技术用户也可以查看页面的先前版本,查看谁进行了给定的更改,或比较特定文档的两个版本。此外,用户可以设置监视列表,以便用户在每次页面被修改时收到电子邮件消息。这允许对特定兴趣和专业知识的用户及时了解给定页面的最新更新,并监控内容是否存在潜在的损坏。

默认情况下,每个页面的左侧都包含一个常用链接的简短菜单,包括维基的主页(主页)、最近更改的列表、随机现有页面和文档。左侧还有一个搜索框。输入文本字符串并单击“搜索”按钮会弹出一个文档列表,这些文档的标题和/或内容与目标字符串匹配。由于 MediaWiki 内容都在 MySQL 数据库中,并且由于现代版本的 MySQL 具有内置的文本索引例程,因此此类搜索速度相对较快。

MediaWiki 站点中的每个页面都有一个 URL,该 URL 以整个站点 URL(在我的情况下,这将是 http://wiki.lerner.co.il)开头,后跟 index.php/,然后是页面的标题。页面标题可能包含空格,在这种情况下,URL 会将每个空格替换为下划线字符。我的服务器上名为 Reuven Lerner 的页面因此将具有完整的 URL http://wiki.lerner.co.il/index.php/Reuven_Lerner。有点令人沮丧的是,MediaWiki URL 区分大小写,这意味着输入不正确的大写单词可能会导致创建新页面。请记住,维基百科永远不会产生真正的“未找到”错误,因为您(访问者)很可能对开始该页面非常感兴趣。

MediaWiki 站点中的页面没有层次结构。只有一个命名空间,这可能会导致混淆。为了减少歧义,页面可能包含括号中的附加信息(然后成为 URL 的一部分)。或者,用户可以创建一个消歧义页面,其中包含指向多个名称相似或相同的页面的链接。

如果您想允许用户上传图像,您需要修改 LocalSettings.php 文件,该文件现在应该存在于您的服务器的 DocumentRoot 目录中。在我安装的版本中,LocalSettings.php 的第 73 行(就在 PHP 代码中的相关注释下方)包含 $wgEnableUploads 的注释掉的定义,将其设置为 true。通过取消注释此行,您可以允许用户将图像上传到服务器。默认情况下,这些上传将位于 images 子目录 (www/images) 中,Apache 进程必须具有该目录的写入权限。

一旦您启用了图像上传,登录用户将能够通过两步过程上传图像。首先,他们在编辑维基页面时单击插入图像按钮,或手动插入 [[Image:Example.gif]] 形式的标签。(图像在 MediaWiki 中都带有 Image: 前缀,但图像只有一个扁平的命名空间,文本内容页面也是如此。)用户完成编辑页面后,他们可以单击丢失的图像链接。这将把他们带到一个 HTML 表单,允许通过用户的浏览器上传丢失的图像。其他类型的文件也可以通过类似的方式上传。

特殊页面

维基百科是内容管理系统 (CMS) 的一种特殊形式。因此,它们是程序的目的是显示通常是静态文档的最新版本。这与许多其他服务器端程序形成对比,这些程序的内容对于每个用户和调用都会发生变化。当然,MediaWiki 必须扫描每个发布的文档,以便生成文本正文中提到的现有和新链接所需的各种 URL。但在很大程度上,MediaWiki 专注于轻松创建和分发静态内容,而不是程序化页面。

但是,MediaWiki 的作者认识到,他们和其他人可能希望创建动态生成的页面,因此诞生了 Special: 指定。任何名称以 Special: 开头的页面都将被视为 - 好吧,它的处理方式不同,使用 PHP 函数的输出填充文档正文。为了创建我们自己的特殊页面,我们需要编写一个 PHP 函数,然后向 MediaWiki 注册该函数。

第一步是创建一个新的 MediaWiki 扩展,将其放在 MediaWiki DocumentRoot 下的 extensions 目录中。(基本 MediaWiki 发行版包含此目录,但在全新安装后通常是空的。)我们将创建文件 extensions/SpecialHello.php,如下所示

<?php
$wgExtensionFunctions[] = "wfExtensionSpecialHello";

function wfExtensionSpecialHello()
{
    global $wgMessageCache;
    $wgMessageCache->addMessages(array('hello' => 'Hello page'));

    require_once('includes/SpecialPage.php');
    SpecialPage::addPage(new SpecialPage('Hello'));
}

?>

第一行将我们的函数名称 (“wfExtensionSpecialHello”) 附加到全局数组 $wgExtensionFunctions,将此函数放在扩展目录中。许多 MediaWiki 扩展会更改某些标签的输出;在这种情况下,我们希望创建一个完整的页面,而不是修改标签的行为。尽管如此,我们正在创建一个扩展。

接下来,我们定义我们的函数。我们做的第一件事是修改 $wgMessageCache,以便我们的扩展看起来像一个特殊页面,而不是一个标签修改扩展。如果我们未能包含这两个初始行,特殊页面将继续工作,但它在 Special:Specialpages 上的列表看起来会很奇怪,标题在 < 和 > 括号之间,就好像它是一个标签一样。请注意,即使在调用 SpecialPage::addPage 时页面名称大写,在调用 addMessages 时,页面名称也必须以小写字母开头。未能注意到这种大小写怪癖将导致奇怪的页面标题。

最后两行导入特定于特殊页面的代码,然后创建此类特殊页面的实例,并将其添加到目录中。

我们的特殊页面具体做什么取决于另一个同名文件(即 SpecialHello.php),该文件位于与 extensions 并行的 includes 目录中,就在 MediaWiki DocumentRoot 下。此目录包含 MediaWiki 附带的大量标准特殊页面,包括 SpecialNewpages.php、SpecialUserrights.php 和 SpecialImagelist.php。这些函数可以访问后端 MySQL 数据库、执行计算和访问外部站点 - 然后将结果管道传输回标准 MediaWiki 输出页面。

以下是我们可能放入我们的 includes/SpecialHello.php 文件中的一个简单版本

<?php
function wfSpecialHello() {
global $wgOut;
$wgOut->addHTML('Hello, world');
}
?>

上面的函数在每次我们转到 Special:Hello 页面时调用,它将 HTML “Hello, world” 添加到输出中。请注意,我们不必开始、结束或以其他方式修改发送给用户的 HTML 文件。我们也不必担心选择外观、设置菜单或其他详细信息。但是,我们确实需要注意空格,PHP 程序通常是这种情况 - 未能在初始 <?php 标签之前修剪空格很可能会产生来自 PHP 的关于修改后的标头的奇怪错误消息。

最后,我们在 LocalSettings.php 文件中注册我们的扩展和特殊页面,添加以下行

require_once("extensions/SpecialHello.php");

将上述内容放入到位后,您的站点现在应该有一个 Special:Hello 页面,当您访问 Special::Specialpages 时,该页面列为 Hello。

结论

维基百科在过去几个月中产生了很多头条新闻,它作为可靠、中立、志愿者努力的未来仍有待确定。但是,维基百科已经证明了维基百科可以为希望从各种参与者那里收集信息的组织带来的力量。如果您的组织可以从以分散方式创建的集中式存储库中受益,那么维基百科可能正是您需要的。

而且,虽然 MediaWiki 远非唯一可用的软件包,但它高度完善、可靠且对管理员和用户都易于使用。生成新的动态页面(在 MediaWiki 世界中称为特殊页面)需要相当多的底层系统知识。但是,入门并不那么困难,并且可以(而且最好)利用 MediaWiki 为您带来的巨大基础设施。

Reuven M. Lerner,一位长期从事 Web/数据库咨询的顾问,目前是伊利诺伊州埃文斯顿西北大学学习科学专业的博士生。他和他的妻子最近庆祝了他们的儿子 Amotz David 的出生。

加载 Disqus 评论