MoinMoin Wiki 1.7优化与维护经验

 

CWoW Developer Group(CWDG)从2006年开始在一直使用 MoinMoinWiki 来构建一个魔兽世界游戏插件开发技术知识库, 这2年中wiki的版本也从1.5变更到了1.7.

moin1.6是一个变化最大的版本, 连不少wiki语法都改变了, 最显著的莫过于内连接的语法原先是["xxx"]现在与mediawiki一致了[[xxx]], 还有不少细节语法的改变, 这不知是一件好事还是坏事, 好事是和mediawiki大多语法兼容了方便内容移植, 坏事是googlecode的wiki还是在使用moin的老语法, 而且看起来来google并不打算向mediawiki类语法兼容而是继续保持下去这个风格. 但总之就是引起的1.5~1.6的升级困难, 除了常规步骤外需要做数据转换工作, 虽然moin提供了转换脚本. 时隔大半年我也忘记了当初是如何升级上来了, 惭愧, 只好在此介绍一些通用的优化与维护的经验. 适用环境: DreamHost, Linux.

 

站点结构的安排

一个好的站点目录结构设置能够使升级, 备份, 移植都非常方便. 这里仅以单wiki站点为例(moin支持多wiki站点). 目标是把我们的数据与wiki程序分离开.

一个安装好wiki(如何安装参考我以前的文章)通常包含4个部分

  1. wiki主程序部分
  2. 共享资源文件部分(共享的theme, img, css, js等文件)
  3. wiki实例部分(我们的数据)
  4. web访问部分(web目录, web访问的入口通常只包含一个入口moin.cgi文件)

出于安全考虑, 把wiki实例部分放到了非web目录下, 这样除了1部分其余部分都会包含我们自己的数据, 需要做进一步整合.

#程序主目录
/lib/lib/python2.5/site-packages/MoinMoin

#共享资源目录
/lib/share/MoinMoin
  /config
  /data
  /htdocs (主题目录)
  /server
  /underlay (在线帮助文件目录)

#wiki实例
/MoinMoin
  /cwdgwiki (wiki实例目录)
    /data
      /pages (wiki数据)
      /plugin (自定义扩展插件目录)
      /user (此wiki下的用户目录)
      ...
    /underlay
    wikiconfig.py (此wiki实例的配置文件)
    logconfig (此wiki实例的log配置文件)

#web目录
/wiki.cwowaddon.com
  /theme (主题目录)
  /img (其他图片文件目录)
  moin.fcgi (web入口程序)
  .htaccess

需要调整的地方集中在共享资源目录中.

  1. /htdocs提供了默认及自定义主题文件, 将/htdocs中的内容完全移动到web目录下的/theme中
  2. /underlay 目录提供了固定的帮助文件, 将/underlay目录全移动到wiki实例的/data中
  3. 最后在wiki实例目录下的wikiconfig.py 中设置上面的2个路径信息
     

其余部分都是些模板文件, 不会被实际引用到, 因此可以把这个共享资源目录删掉了. 这下只留下了2部分我们自己的文件一部分是数据文件一部分是web需要的静态文件. 还有一点需要注意, 如果你对wiki写了一些自定义扩展如macro等, 一定要放在wiki实例目录下的plugin中. 日后升级只需要把wiki主程序删掉重新装一次就ok了.

 

性能优化

性能永远是我们关注的主题, 在dreamhost的cgi模式下wiki的速度可以用龟速来形容, 尤其在升级到1.7后使用cgi每个页面需要50s的时间, 让人无法接受. 从3个方面来进行性能优化.

  1. 使用fastcgi
    moin提供了好几种可提高性能的访问方式, 需要根据你的服务器情况来选择, fastcgi是最为常见的一种, 需要你在服务器上打开对fastcgi的支持. 在安装包的wiki/server目录下你可以找到moin.fcg这个文件(具体设置见我以前的文章), 需要注意的一点在dreamhost中, 以前.fcg是可用的, 但1.6以后就不能用了, 我一直没找到这个原因, 导致CWDG的wiki一直运行在龟速下, 直到1.7 反复调式才发现只需改名成moin.fcgi就没问题了.
  2. 使用xapian全文检索组件
    xapian是从1.6就引入的全文检索组件代替了以前的lupy, 使得检索性能能够大幅提升. 下面简单介绍下安装步骤:

    wget http://oligarchy.co.uk/xapian/1.0.6/xapian-core-1.0.6.tar.gz
    tar zxf xapian-core-1.0.6.tar.gz
    cd xapian-core-1.0.6
    ./configure --prefix=$HOME
    make
    make install

    wget http://oligarchy.co.uk/xapian/1.0.6/xapian-bindings-1.0.6.tar.gz
    tar zxf xapian-bindings-1.0.6.tar.gz
    cd xapian-bindings-1.0.6
    ./configure --without-php --without-ruby --without-java --without-java-swig --without-csharp --without-tcl8 --with-python --prefix=$HOME XAPIAN_CONFIG=$HOME/bin/xapian-config
    make
    make install

    cd /lib/lib/python2.5/site-packages/MoinMoin/script/
    python moin.py --config-dir=/MoinMoin/cwdgwiki --wiki-url=http://wiki.cwowaddon.com/ index build --mode=add


    一个是安装xapian-core, 一个是安装xapain的python绑定程序, 最后是生成索引. 接下来在wikiconfig.py 中设置

    xapian_search = True
    xapian_index_history = False
    xapian_stemming = False

    xapian_index_history 代表是否从历史版本中搜索, 一般情况下不需要.
    xapian_stemming 是词根时态分词作用, 中文没有, 而且在中文下会有问题, 建议不要打开.

    上面2项做完后wiki性能提高近10倍.
     

  3. 定期清理垃圾文件
    由于moin是基于文件系统存储的wiki, 所以经常在编辑的时候会产生些垃圾文件, 比如访问了一个未建的链接就会产生一个空目录, 放弃编辑一个词条则会产生一个edit-lock文件, 偶尔会因未知原因造成词条死锁导致任何人都无法再编辑. 这些文件的增多对性能有少许影响, 对备份管理也很不利. 因此我重写了一个清理脚本代替了以前功能不足的脚本.
    请将http://files.cnblogs.com/simonw/cleanpage.zip拷贝覆盖moin主程序/script/cleanpage.py 执行下面的脚本即可

    cd /lib/lib/python2.5/site-packages/MoinMoin/script/
    python moin.py --config-dir=/MoinMoin/cwdgwiki  --wiki-url=http://wiki.cwowaddon.com/ maint cleanpage

转载于:https://www.cnblogs.com/simonw/archive/2008/07/13/1241958.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react和vue配置本地代理

React 在react中配置开发环境下的本地代理相对比较简单,直接在package.json文件中修改即可。 但是这样做有其局限性,如果开发中代理多个接口的时候将无法满足需求,我们需要的是下面这种的能够代理多个接口的请求方式 proxy(/back, {target: h…

php异步处理,执行系统命令

为什么80%的码农都做不了架构师?>>> 难点1:php执行系统命令,要等到命令执行完成之后才会结束,不然会造成整个php进程挂起,其他php服务僵死? 难点2:php执行的命令完成后,…

javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver错误解决办法...

错误如下,不知道是不是遇到鬼了,之前好好的,装了myeclipse以后出错了(说实话,myeclipse用的很不爽,感觉netbeans更好用些) HTTP Status 500 -type Exception reportmessagedescription The serv…

axios取消功能的设计与实现

取消功能的设计与实现 #需求分析 有些场景下,我们希望能主动取消请求,比如常见的搜索框案例,在用户输入过程中,搜索框的内容也在不断变化,正常情况每次变化我们都应该向服务端发送一次请求。但是当用户输入过快的时候&…

为搜索引擎做准备

1、 允许搜索机器人搜索站内所有链接。如果你想某些页面不被搜索&#xff0c;推荐采用robots.txt方法<meta content"all" name"robots" />2、 设置站点作者信息<meta name"author" content"ajienetease.com,阿捷" />3…

hibernate中的Annotation补充

下面使用Annotation来定义一个实体类&#xff1a; Entity Table(name"person_table") //不是引入org.hibernate.persistence&#xff0c;因为这个只可以在hibernate环境下使用 public class Person …

axios拦截器的实现

拦截器设计与实现 #需求分析 我们希望能对请求的发送和响应做拦截&#xff0c;也就是在发送请求之前和接收到响应之后做一些额外逻辑。 我们希望设计的拦截器的使用方式如下&#xff1a; // 添加一个请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请…

What can Lines3D Class do?

好几天没来Bolg了&#xff0c;这几天在尝试用3D线条做一个比较优雅的线条效果。文字由3DMAX导出到AS类&#xff0c;其他曲线路径由TweenMax的bezier数组定义。 Preview:niuniuzhu.cn 转载于:https://www.cnblogs.com/niuniuzhu/archive/2008/07/25/1251556.html

10 个最佳的网站分析方法

一个网页设计师在设计网站的各个关键方面时&#xff0c;他们需要了解网站的各种必要细节&#xff0c;可通过市场调研或者是网站本身的统计来获取这些细节信息。 本文介绍的这些工具确实可以帮助网站进行适当和有效的分析。这里面有些是免费的工具&#xff0c;还有的提供非常强大…

C#表达式树浅析

一、前言 在我们日常开发中Lamba 表达式经常会使用&#xff0c;如List.Where(n>Name"abc") 使用起来非常的方便&#xff0c;代码也很简洁&#xff0c;总之一个字就是“爽”。在之前我们总是用硬编码的方式去实现一些底层方法&#xff0c;比如我要查询用户“abc”是…

程序员每天该做的事情

1、总结自己一天任务的完成情况 最好的方式是写工作日志&#xff0c;把自己今天完成了什么事情&#xff0c;遇见了什么问题都记录下来&#xff0c;日后翻看好处多多 >> 好记性不如烂笔头。呵呵 2、考虑自己明天应该做的主要工作 把明天要做的事情列出来&#xff0c;并…

20150901-Linux磁盘管理及文件系统管理

占位&#xff0c;待完善。。。Linux系统管理磁盘和文件系统管理&#xff1b;RAID, LVM; btrfs; 程序包管理&#xff1a;rpm, yum(dnf)Linux的网络管理; 进程和作业管理&#xff1a;htop, glances, tsar&#xff1b;sed和awk&#xff1b;Linux系统的开机启动流程&#xff1b;内核…

oAuth2.0 登录新浪微博 发送新浪微博 代码

1 public class SinaoAuth2 {3 string APIHost "";4 public SinaoAuth() 5 {6 APIHost SinaConfig.Sina_Host;7 }8 9 #region 绑定微博帐号10 /// <summary>11 /// 绑定微博帐号12…

下载 sdk struts java

<action name"sdkDownload" class"com.curiousby.sdkDownload"><!-- result的Type必须为stream --><result name"success" type"stream"><param name"contentType">application/octet-stream;char…

微信小程序省市区联动,自定义地区字典

最近在做一个项目的时候遇到了这么一个问题&#xff0c;就是省市区的联动呢&#xff0c;我们需要自定义字典来设置&#xff0c;那么微信小程序自带的省市区选择就不能用了&#xff0c;经过三根烟的催化&#xff0c;终于写出来了。下面献上代码示例。 首先是在utils文件夹存入ar…

论文翻译《Object-Level Ranking: Bringing Order to Web Objects》

Object-Level Ranking: Bringing Order to Web Objects Zaiqing Nie Yuanzhi Zhang Jirong Wen Weiying Ma 摘要&#xff1a; 现在的网络搜索方法实际上是做文档级排名和检索&#xff0c;与之相对比&#xff0c;我们在探索一种新的聚合体以实现在对象级的网络检索。我们搜集与某…

C# 定时器定时更新

class Program{static void Main(string[] args){//for (int i 0; i < 100; i)//{// SendMessage("131", "131");//}System.Timers.Timer aTimer new System.Timers.Timer();aTimer.Elapsed new ElapsedEventHandler(aTimer_Elapsed);// 设置引发…

前端vscode常用插件

Auto Rename Tag 这是一个html标签的插件&#xff0c;可以让你修改一边标签&#xff0c;另外一边自动改变。 Beautify 格式化代码插件 Braket Pair Colorizer 给js文件中的每一个小括号()花括号{}都配上不同的颜色&#xff0c;方便找到哪一个位置多了少了括号。 Debugger for C…

在线条形码生成器

条形码又称条码、一维码&#xff0c;是将字符按照特定的规则转化成二进制后&#xff0c;描绘成一个宽度不等的多个黑条和空白&#xff0c;按照一定的编码规则排列的图形标识符&#xff0c;条形码现在应用相当广泛&#xff0c;一出门&#xff0c;随便翻一样东西&#xff0c;可能…

装箱拆箱

1、 装箱和拆箱是一个抽象的概念 2、 装箱是将值类型转换为引用类型 &#xff1b;拆箱是将引用类型转换为值类型 利用装箱和拆箱功能&#xff0c;可通过允许值类型的任何值与Object 类型的值相互转换&#xff0c;将值类型与引用类型链接起来 例如&#xf…