Mediawiki
MediaWikiはWikipediaやこのページを作るのに使っているソフトウェア.
ここではUbuntu Server上でMediaWikiを使ったウェブサイトを構築するための方法を説明する.
MediaWikiを使って記事を執筆する方法は記事の書き方を参照.
Install
$ sudo apt-get install mediawiki mediawiki-math
でOK.Ubuntu 10.04.4 の場合,バージョンは 1.15.1.
もしメール機能を使うのであれば,
$ sudo apt-get install mailutils
もインストールしておく.
Configure
コピーの作成
MediaWiki本体は /var/lib/mediawiki の下にインストールされる.
ここではひとつのホストで複数のMediaWiki (例えば,日本語版と英語版)を動かすために,/home/www/wiki/ja と /home/www/wiki/en にコピーして動かすことにする.そのために,tar を使ってコピー.
$ sudo -s # for lang in ja en; do > (cd var/lib/mediawiki; tar cf - .) | (mkdir -p /home/www/wiki/$lang; cd /home/www/wiki/$lang; tar xf -) > done
Apache2
次に,/etc/mediawiki/apache.conf を編集して,以下の行を追加する.
Alias /w /home/www/wiki # これを経由してアクセス Alias /wiki/ja /home/www/wiki/ja/index.php # あとで設定する短いパスのため Alias /wiki/en /home/www/wiki/en/index.php # あとで設定する短いパスのため
このファイルは /etc/apache2/conf.d から symbolic link で参照されている.
とりあえず apache2 を再起動.
$ sudo apache2ctl restart
これで http://hostname/w/ja と http://hostname/w/en で 2つの MediaWiki にアクセス可能になったはず.
以後これらのインストールパス (ここでは /home/www/wiki/ja または /home/www/wiki/en) を $IP と表記する.
初期化
ブラウザで http://hostname/w/ja/config/ と http://hostname/w/en/config/ それぞれにアクセスする. すると MediaWiki X.XX.X Installation というタイトルのページが現れる.以下の値をインプットする.
Site config
- Wiki name: 適当な短い名前.このサイトの場合は Fukudat.com
- Contact e-mail: 管理者のメールアドレス.このサイトの場合は root@fukudat.com
- Language: 言語.ja - 日本語 とか en - English など.
- Copyright/license: 著作権.どれか一つ選ぶ.
- Admin username: 管理ユーザ.Unixユーザとは関係ない.デフォルトは WikiSysop
- Password: 管理ユーザのパスワード.確認のため2回入力.
- Object caching: memcached を使うとパフォーマンスが上がるが,別途 memcached のインストールが必要.
- Memcached servers: memcached を使う場合,そのサーバーのアドレスを入力.
E-mail, e-mail notification and authentication setup
- E-mail features (global): MediaWikiのメール機能を使うかどうか.enableを選択.
- User-to-user e-mail: ユーザ間のメールの仲介をするか.enableを選択.
- E-mail notification about changes: Enabled for changes to user discussion pages, and to pages on watchlistsを選択.
- E-mail address authentication: enableを選択.
Database config
- Database type: mysql
- Database host: localhost
- Database name: wikidb
- DB username: wikiuser
- DB password: wikiuserのパスワード.2回入力.
- Superuser account: チェックする (手動で上記のDBとユーザを作って権限を付与するなら不要かも)
- Superuser name: root (mysql の管理者ユーザ.Unix の root とは無関係)
- Superuser password: mysql の root パスワード (Unix の root パスワードとは無関係)
- MySQL specific options
- Database table prefix: このMediaWikiが使うテーブル名の prefix.同じDBに複数のWikiを混在させるので,ブランクではなく ja_ または en_ とする.
- Storage Engine: InnoDB
- Database character set: MySQL 4.1/5.0 binary
"Install"ボタンを押すとmysqlに必要なDB,テーブルが作成される.
成功のメッセージが表示されたら,$IP/config/LocalSettings.php を $IP にコピーし (もし /etc/mediawiki へのシンボリックリンクがあったら削除する),$IP/config をディレクトリごと削除する.
短いURL
インストールした直後は、wiki の記事の URL が https://fukudat.net/wiki/index.php/ページタイトル と indexl.php が見えてかっこ悪い。 短く https://fukudat.net/wiki/ページタイトル と表示するための方法。
詳細は https://www.mediawiki.org/wiki/Manual:Short_URL に書かれているのだが、正直めんどくさいが、実は簡単なツールが用意されている。
[1] にアクセスして、自分の wiki のアドレス (例: https://fukudat.net/wiki/index.php) を入力。 root アクセスの有無を答えると、web server の設定ファイルや、wiki の LocalSettings.php を変更すべき点を教えてkくれる。
私のケースでは、root アクセスがあるので、/etc/apache2/sites-enabled/ のしたの VirtualHost 定義中に
<Directory /var/www/html> RewriteEngine On RewriteRule ^/?wiki(/.*)?$ %{DOCUMENT_ROOT}/w/index.php [L] RewriteRule ^/?$ %{DOCUMENT_ROOT}/w/index.php [L] </Directory>
LocalSettings.php に
$wgScriptPath = "/w"; $wgScriptExtension = ".php"; $wgArticlePath = "/wiki/$1";
を追加すれば良いことがわかった。
Customize
色々なカスタマイズ方法をメモ. 以下は,特に記述がなければ $IP/LocalSettings.php を書き換える.
セキュリティ
ログインしないと編集できないようにする
$wgGroupPermissions['*']['edit'] = false;
新しいユーザを登録できないようにする
$wgGroupPermissions['*']['createaccount'] = false;
上記2つを両方を設定すると,すでに登録されている人以外は編集できない.つまり,他人は勝手に編集できない.
このように設定しても,管理者アカウント(WikiSysopなど)でログインすれば, Special:Userlogin から新規ユーザを登録することができる.
匿名ユーザのアクセスできるページを制限する
$wgGroupPermissions['*']['read'] = false; $wgWhitelistRead = array ("Main Page", "Special:Userlogin");
こうすると、匿名ユーザはこの array に書かれたページしかアクセスできなくなる.この例では、Main Page,Special:Userlogin の二つのページ以外は読むことすらできなくなる.
日本語でインストールした場合には,以下のように日本語でのページ名前に合わせること.
$wgWhitelistRead = array ("メインページ", "特別:ユーザログイン");
選択的に編集を許可する
とはいっても,部分的には匿名ユーザにも編集を許可したい場合がある.そんなときは,includes/User.php のfunction isAllowed()の定義を以下のように編集する.
*** User.php.orig 2008-03-03 16:09:26.000000000 +0900 --- User.php 2009-05-24 15:26:54.000000000 +0900 *************** *** 1757,1763 **** // In the spirit of DWIM return true; ! return in_array( $action, $this->getRights() ); } /** --- 1757,1766 ---- // In the spirit of DWIM return true; ! if ( in_array( $action, $this->getRights() ) ) ! return true; ! global $wgTitle; ! return $action == 'edit' && $wgTitle->getNamespace() == NS_TALK; } /**
この例では,$wgTitle->getNamespace() == NS_TALK とすることでノートのページの編集を匿名ユーザに許可している.
また,以下のようにすることでカスタムで追加した名前空間のページ (100以上の id番号を持つことで区別している)には匿名ではアクセスできないようにすることが可能である.
*** Title.php.orig 2006-07-18 19:13:06.000000000 +0900 --- Title.php 2006-07-18 19:16:18.000000000 +0900 *************** *** 999,1005 **** global $wgUser; if( $wgUser->isAllowed('read') ) { ! return true; } else { global $wgWhitelistRead; --- 999,1009 ---- global $wgUser; if( $wgUser->isAllowed('read') ) { ! if ( $this->getNamespace() >= 100 ) { ! return $wgUser->isAllowed('viewprivate'); ! } else { ! return true; ! } } else { global $wgWhitelistRead;
アップロード
$wgEnableUploads = true;
さらに $IP/images/ ディレクトリを apache2 のユーザ (普通 www-data) が書き込みできるようになっているか確認する.
ファイルタイプの制限を緩める
デフォルトでは png, gif, jpg, jpeg 以外のファイルはアップロードが禁止されている.これを緩めるには,
$wgVerifyMimeType = false; $wgStrictFileExtensions = false;
を追加する.
それでもなお,html, htm, js, jsb, mhtml, mht, php, phtml, php3, php4, php5, phps, shtml, jhtml, pl, py, cgi, exe, scr, dll, msi, vbs, bat, com, pif, cmd, vxd, cpl のアップロードは禁止されている.
ファイルサイズの制限の変更
mediawiki としてのファイルサイズは DefaultSettings.php に
$wgMaxUploadSize = 1024*1024*100; # 100MB
とあるので100MBまで許容している.これを変えたければ LocalSettings.php でこの変数の値を変える.
しかし,PHPがデフォルトで2MBに制限を加えている./etc/php5/apache2/php.ini (Ubuntuの場合) を編集して,以下の行を変更する.
; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 2M ; ココ
見た目
画面左上のLogoの変更
$wgLogo = "$wgStylePath/common/images/wiki.png";
デフォルトスキンの変更
次の行の値を,'standard', 'nostalgia', 'cologneblue', 'monobook' のいずれかに変更する
$wgDefaultSkin = 'monobook';
数式モードを使用可能にする
$wgUseTeX = true;
ただし $IP/images ディレクトリを httpd が書き込み可能にしておく必要あり.(upload 可能になっていれば問題ない.)
mediawiki-math パッケージをインストールしておくことを忘れずに.後からインストールした場合は,再度 /var/lib/mediawiki/math を $IP の下にコピーしておく必要あり.
$ sudo -s # cd /var/lib/mediawiki # tar cf - math | (cd $IP; tar xvf -)
ヘッダーにIPアドレスを表示しない
セキュリティで説明した方法で anonymous ユーザが編集できなくした場合,ページの先頭に表示されるIPアドレスは不要でしょう.
$wgShowIPinHeader = false;
とすると表示されなくなる.
Main Page
MediaWiki:Mainpage を編集すると変更可能になっている.このサイトでは Top をメインページにしている.
この手の MediaWiki: 名前空間のタグはシステムメッセージでとてもたくさんあり,Special:Allmessagesにリストされている.
最初の文字に小文字を許す
デフォルトでは,記事の最初の文字がアルファベットがくると大文字に変換してくれる.これが迷惑だという場合は,次のように設定する.
$wgCapitalLinks = false;
このようにすると,小文字の記事を作ることができるようになる.それと同時に,大文字・小文字を区別する様になるので, [[mediaWiki]]や[[Mediawiki]]は[[MediaWiki]]と異なるものを記事を指すこととなる.だから,運用の途中で変更するのはやめたほうがよいだろう.
見出しに番号をつける
ユーザオプションで見出しに番号をつけることができる.これを全員のデフォルトにするには,LocalSettings.php に次の行を追加する.
$wgDefaultUserOptions['numberheadings'] = 1;
Sidebar
MediaWiki:Sidebar を開くと,そこに Sidebar に表示されるアイテムがリストされてる.デフォルトでは,
* navigation ** mainpage|mainpage-description ** portal-url|portal ** currentevents-url|currentevents ** recentchanges-url|recentchanges ** randompage-url|randompage ** helppage|help * SEARCH * TOOLBOX * LANGUAGES
こんな感じになっているはず.
1段目の項目ごとにボックスが分る.
2段目のレベルに
** mainpage|mainpage-description
書かれていると,それは
{{MediaWiki:mainpage}}|{{MediaWiki:mainpage-description}}
と同じ意味になる.
外部画像の埋め込み
wiki内の画像は[[Image:イメージファイル名.png]]の様にして埋め込むことが可能だが,デフォルトでは外部の画像を埋め込めない.
$wgAllowExternalImages = true;
とすると,http://www.fukudat.com/w/logo.png と画像URLを書くだけでその画像がインラインで 表示されるようになる.
名前空間
新規作成
新しい名前空間 (namespace) を作成するには,includes/DefaultSettings.php から $wgExtraNamespaces と $wgNamespacesWithSubpages を LocalSettings.php にコピーしてきて,以下のように書き換える.(ここでは,Private という名前空間を追加すると仮定)
$wgExtraNamespaces = array( 100 => "Private", 101 => "Private_Talk" ); $wgNamespacesWithSubpages = array( NS_TALK => true, ... 100 => true, 101 => true );
ここで,100 とか 101 というのは名前空間のid番号で,ユーザが自由に使ってよいのは 100 以降.偶数は実際のページ用,奇数は Talk ページに使うのが習慣となっている.
新しく作った名前空間で Sub Page を使わないのであれば,2番目の変数 ($wgNamespacesWithSubspaces) のカスタマイズは不要.
サーチ
新しく作られた名前空間は,サーチの対象にならない.サーチの対象にしたい場合は,やはり includes/DefaultSettings.php から $wgNamespacesToBeSearchedDefault をコピーしてきて,
$wgNamespacesToBeSearchedDefault = array( ... 100 => true, 101 => true );
と書き換える.
InterWiki
Wiki間で相互にリンクを張る仕組みをInterwiki linkingと言う.←このリンクも Interwiki リンクである.この例では,[[meta:Help:Interwiki linking]]と記述することで,meta のサイト( http://meta.wikimedia.org/wiki/Main_Page )の[[Help:Interwiki linking]]を開くという意味になる.
また本家 Wikipedia では[[en:MediaWiki]]と記述すると,英語 (en) のサイトで MediaWiki のページを開くことを意味する.これも同じInterwiki linkingの仕組みを使ってできている.
では,wikibooksのサイトや英語のサイトがどこにあるのかは,どこに記述されているのだろうか. 実は MySQL のデータベースの interwiki テーブルに格納されていた.
$ mysql -u root mysql> connect wikidb; mysql> select * from ja_interwiki; +---------------------+-----------------------------------------------------------------------------------+----------+----------+ | iw_prefix | iw_url | iw_local | iw_trans | +---------------------+-----------------------------------------------------------------------------------+----------+----------+ | abbenormal | http://www.ourpla.net/cgi-bin/pikie.cgi?$1 | 0 | 0 | | acadwiki | http://xarch.tu-graz.ac.at/autocad/wiki/$1 | 0 | 0 | | acronym | http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1 | 0 | 0 | | advogato | http://www.advogato.org/$1 | 0 | 0 | | aiwiki | http://www.ifi.unizh.ch/ailab/aiwiki/aiw.cgi?$1 | 0 | 0 | | alife | http://news.alife.org/wiki/index.php?$1 | 0 | 0 | | annotation | http://bayle.stanford.edu/crit/nph-med.cgi/$1 | 0 | 0 | | annotationwiki | http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1 | 0 | 0 | | arxiv | http://www.arxiv.org/abs/$1 | 0 | 0 | | aspienetwiki | http://aspie.mela.de/Wiki/index.php?title=$1 | 0 | 0 | | bemi | http://bemi.free.fr/vikio/index.php?$1 | 0 | 0 | | benefitswiki | http://www.benefitslink.com/cgi-bin/wiki.cgi?$1 | 0 | 0 | | brasilwiki | http://rio.ifi.unizh.ch/brasilienwiki/index.php/$1 | 0 | 0 | | bridgeswiki | http://c2.com/w2/bridges/$1 | 0 | 0 | (以下略)
このテーブルを Web から操作するスクリプトは用意されていないようだ.
このテーブルに新しいエントリを追加すると 1カラム目の iw_prefix を使った[[iw_prefix:title]]というタグが 2カラム目の iw_url へのリクエストに置き換えられる.
google: なんていうタグもあるので,[[google:Takeshi,Fukuda]]と書くと,Takeshi Fukuda を google 検索してくれる.ただし,検索語の間の区切りはスペースが使えないことに注意.スペースはすべてアンダーバー '_' に変換されてしまう.+ と書きたいところだが,これもエスケープされてしまうため,ここでは ',' を使用している.
言語のページで,例えば <httpd-document-root>/wiki/en に英語版 MediaWiki をインストールし,<httpd-document-root>/wiki/ja に日本語版 MediaWiki をインストールしておいたとする(インストール時に別の MySQL database を指定したか,または同じ database でも別の table prefix を指定すれば複数導入可能.ここでは,en_, ja_ をtable prefix として指定したと仮定する.)すると,次のコマンドを実行すると
$ mysql -u root mysql> insert into en_interwiki values('ja', '/wiki/ja/$1', 1, 0); mysql> insert into ja_interwiki values('en', '/wiki/en/$1', 1, 0);
英語版で 'ja:', 日本語版で 'en:' が使用可能となり,そのタグが現れたページでは,サイドバーに「他の言語」ボックスが現れ,リンクが張られる.記述した場所には何も現れないので注意.他言語のページを本文中のリンクとして参照したい場合は,言語タグの前にコロン':' をつける.例えば[[:en:mediawiki]]という感じ.
このサイトでは,
replace into ja_interwiki values ('citeseer', 'http://citeseer.csail.mit.edu/cs?q=$1', 0, 0), ('en', '/wiki/en/index.php/$1', 0, 0), ('google', 'http://www.google.com/search?q=$1', 0, 0), ('ja', '/wiki/ja/$1', 0, 0), ('wiki', 'http://en.wikipedia.org/wiki/$1', 0, 0), ('wiki-ja', 'http://ja.wikipedia.org/wiki/$1', 0, 0), ('meta', 'http://meta.wikimedia.org/wiki/$1', 0, 0); replace into en_interwiki values ('citeseer', 'http://citeseer.csail.mit.edu/cs?q=$1', 0, 0), ('en', '/wiki/en/index.php/$1', 0, 0), ('google', 'http://www.google.com/search?q=$1', 0, 0), ('ja', '/wiki/ja/$1', 0, 0), ('wiki', 'http://en.wikipedia.org/wiki/$1', 0, 0), ('wiki-ja', 'http://ja.wikipedia.org/wiki/$1', 0, 0), ('meta', 'http://meta.wikimedia.org/wiki/$1', 0, 0);
としている.
Extensions
SPAM対策
このwikiは上記のセキュリティで示したように,登録されているユーザでしか編集できず,さらにユーザの登録は管理者しか出来ないようになっている.このため記事にはSPAMの心配はない.しかし,ノートには匿名の書き込みを許しているのでSPAMリンクが書き込まれる危険がある[1].
最近 (2010年後半) から急にSPAMが増え,手作業で削除するのがさすがに面倒になってきたので,以下の対策を実施した.
一般に多くのSPAMはプログラム(robotとか自動agent)が自動的に書き込んでいくので,プログラムによる編集を禁止することができれば大半のSPAMを防ぐことが可能である.これにはCaptchaと呼ばれるTuring Testが有効であることが知られている.自動文字認識しにくいようにゆがめられた文字を読ませたり,常識問題に答えさせたりする方法がよく使われている. アクセシビリティを考慮して,自動音声認識しにくいようにノイズを加えた音声に答えさせるような種類も開発されている.
MediaWiki用にはConfirmEditというExtensionが存在する.これは簡単な足し算・引き算の問題をテキストまたは画像で出題することで,人間が編集していることを確認するモジュールである.以下のように簡単にインストール・設定できる.
(2011年1月13日)これでしばらく様子を見ることにする.
インストール
このページに行って自分が使用しているMediaWikiのバージョンを選択するとそれに合ったExtensionが ConfirmEdit-MW1.XX-XXXXXX.tar.gz という名前で手に入る.
これを $IP/extensions の下で展開すると,$IP/extensions/ConfirmEdit のしたにいくつかの *.php ファイルが出来る.これらのファイルはWeb Serverが読める必要があるので,パーミッションを確認しておこう.
セットアップ
$IP/LocalSettings.php を編集して以下の行を追加する.
# ConfirmEdit require_once("$IP/extensions/ConfirmEdit/ConfirmEdit.php"); # ConfirmEditをロード $wgCaptchaTriggers['edit'] = false; # 編集はノーチェック $wgCaptchaTriggers['create'] = false; # 作成はノーチェック $wgCaptchaTriggers['addurl'] = true; # しかし外部へのURLを追加したときは確認 $wgCaptchaTriggers['createaccount'] = true; # ユーザを登録するときも確認 $wgCaptchaTriggers['badlogin'] = true; # ログインに失敗した時も確認 require_once("$IP/extensions/ConfirmEdit/MathCaptcha.php"); # 文字でのチャレンジだと簡単に破られてしまう $wgCaptchaClass = 'MathCaptcha'; # 画像で出題することにするが,アクセシビリティが悪くなる
テキストで出題する場合は,最後の2行は不要.
以上,これだけ...のはずなのだが,MediaWiki 1.11用のConfirmEditはバグってるので以下のパッチが必要.
*** MathCaptcha.php.orig 2008-06-14 14:23:01.000000000 +0900 --- MathCaptcha.php 2011-01-14 02:20:08.000000000 +0900 *************** *** 45,51 **** $math = new MathRenderer( $sum ); $math->setOutputMode( MW_MATH_PNG ); $html = $math->render(); ! return preg_replace( '/alt=".*"/', '', $html ); } } --- 45,51 ---- $math = new MathRenderer( $sum ); $math->setOutputMode( MW_MATH_PNG ); $html = $math->render(); ! return preg_replace( '/alt="[^"]*"/', '', $html ); } }
要するにalt=... を消去する正規表現が不適切だった.
参考文献
脚注
CiteというExtensionを使うと, <ref>と</ref>の間に書いたコメントが,<references/>と書いた場所に脚注(footnote)[2]のように出力される.
インストール
使っている mediawiki のバージョンに合わせたパッケージをここから入手.
/var/lib/mediawiki/extensions の下で解凍.
$IP/LocalSettings.php に次の行を追加する.
require_once( "$IP/extensions/Cite/Cite.php" );
Backup
Mediawiki のバックアップの取得・リストアに挑戦した結果をまとめる.
次の2つをそれぞれバックアップする必要がある.
- MySQL データベース ($wgDBname データベースの $wbDBprefix で始まるテーブル)
- Upload されたファイル ($IP/images のした)
MySQLのバックアップ
binaryバックアップ
MySQLをいったん止めて,/var/lib/mysql 以下をtarか何かで固めてコピーすればよいが,ほかのアプリケーションのDBも含まれてしまうので具合が悪い.
SQLレベルのバックアップ
次のコマンドひとつで SQL文の入ったファイルができる.
$ mysqldump wikidb > /tmp/wikidb-backup.sql
オプションをつけることでテーブル単位のバックアップも可能.
リストアは単純に mysql にそのファイルを食わせれば良い.テキストファイルなので読める.
$ mysqladmin createdb wikidb # もし db がないところから始めるならば $ mysql wikidb < /tmp/wikidb-backup.sql
Uploaded file の backup
こちらは単純に $IP/images の下を tar で固めればよいでしょう.
$ sudo -s # cd /home/www/wiki/ja # $IP へ移動 # tar cvfz /tmp/wiki-image-backup.tar.gz images
リストアは,
$ sudo -s # cd /home/www/wiki/ja # $IP へ移動 # tar xvfz /tmp/wiki-image-backup.tar.gz
これらのファイルは,wikidb の image テーブルに情報が格納され,記事とのリンクが取られている.
Maintenance
$IP/maintenance/ にメンテナンス用のスクリプトが用意されている.コマンドラインから php コマンドを用いて実行する.
編集履歴の削除
以下のコマンドで古い版(old revision)が消去される.
$ cd $IP/maintenance/ $ php deleteOldRevisions.php --delete
さらに,最近更新したページに残る編集したことの記録を消去したい場合は,同じディレクトリで,
$ php rebuildrecentchanges.php
を実行しよう.
さらにさらに,削除履歴も消し去りたいという場合は...スクリプトは用意されていない模様なので,
$ mysql wikidb mysql> delete from ja_logging where log_type = 'delete';
のように直接DBにアクセスして消去する.ただし,ここで wikidb, ja_ は#初期設定で指定したデータベース名とテーブルのプレフィックス.
関連情報
- MediaWikiユーザーズガイド
- MediaWikiマニュアル バックアップ
- meta:Help:Contents#For_MediaWiki_hackers | meta:Help:System_admin | meta:Help:Interwiki linking
- MySQLリファレンスマニュアル
- MediaWikiでカレンダーを表示する方法
- MediaWikiで画像をボタンにする方法
- mediawiki on www.fukudat.com
- 設定の一覧
- MediaWiki よくある質問と回答
- MediaWiki リリース情報メーリングリスト
- MediaWiki のあなたの言語へのローカライズ
- あなたのウィキでスパムと戦う方法を学ぶ