작은숲:위키노트/미디어위키로 여러 위키 쓰기

큰숲백과, 나무를 보지 말고 큰 숲을 보라.

개요

미디어위키모니위키와는 달리 DB에 데이터를 저장한다. 이로 인해 조금만 신경 쓰면 모니위키처럼 하나의 소스를 여러 위키에서 사용하는 것이 가능하다. 다양한 방법이 있고 그 방법의 예는 미디어위키의 메뉴얼에 잘 나와있으니 참고하도록 하자. 서버에 설치된 여러 위키에서 하나의 소스를 사용할 수 있다는 것은 여러 모로 장점이 많다. 서버 관리자나 개발자의 입장에서는 유지·보수하는데 상당한 도움이 될 것이다.

준비

우선 설치하고자 하는 여러 위키들을 일반적인 방법으로 설치한다. 즉, 각 위키의 루트 디렉토리 아래에 미디어위키 소스를 복사해놓고 그 URL을 통해 미디어위키를 설치하고 기본 설정을 마친다. 그러면 해당 위키에 대한 LocalSettings.php 파일을 다운로드 할 수 있다. 미디어위키는 이렇게 웹상에서 설치 마법사를 통해 설치하는 것이 여러 모로 편하다. 알아서 DB에 필요한 테이블을 만들어주고 기본 설정까지 해주니 설치하는 사람이 그에 대해 특별히 신경 쓸 일이 없다. 물론 작은숲:위키노트/미디어위키 설정이 필요한 경우에는 다운로드 한 LocalSettings.php 파일만 수정하면 된다. 만약 많은 위키를 설치해야 한다면, 처음에 하나의 위키를 설치한 후 그 DB를 덤프해서 덤프한 DB 데이터로 여러 위키를 설치하는 방법도 있다. 물론 이건 수동으로 하는 것은 귀찮은 일이다. 자동화 스크립트를 만들어서 진행하는 편이 좋을 것이다. 스크립트에 기본적인 값을 입력하고 그 값을 기반으로 덤프한 DB 데이터를 새로운 값으로 치환해 새로운 DB 덤프를 만들어내고, 그 새로운 DB 덤프로 새로운 위키의 DB 테이블을 생성하면 된다. 그리고, 스크립트로 혹은 수동으로 새로운 위키의 LocalSettings.php 파일을 만들어 준다.[1] 이렇게 각 위키의 DB와 LocalSettings.php 파일만 있으면 여러 위키를 하나의 소스로 운영할 수 있다. 다만 간단한(?) 아래와 같은 작업이 필요하다.

미디어위키의 설치와 설정

하나의 서버에 여러 개의 위키를 설치하고자 한다. 먼저 각 루트 디렉토리에 미디어위키 소스를 복사한 후 디렉토리 이름을 w로 변경한다. 아니면 적당히 원하는 이름으로 변경하면 된다. 이제 작은숲:위키노트/브라우저로 각 위키의 미디어위키에 접속해 설치 마법사를 통해 설치한다. 설치가 끝나면 각 위키 별로 LocalSettings.php 파일을 받을 수 있을 것이다. 각 위키의 DB도 준비되고 LocalSettings.php 파일도 만들어졌으니 준비는 끝났다. 미디어위키의 소스 디렉토리는 적당한 곳, 예를 들어 /usr/local/share/mediawiki-1.26.2로 옮기도록 한다. 그리고 각 위키의 루트 디렉토리에서 아까와 같은 이름으로 미디어위키 소스 디렉토리에 대한 심볼릭 링크를 만든다.

$ ln -s /usr/local/share/mediawiki-1.26.2 w

이제 미디어위키 소스 디렉토리에 각 위키의 LocalSettings.php 파일을 올려놓는다. 단 이름이 같으면 구분할 수 없으니 LocalSettings-wiki.yourdomain.com.php와 같이 구분할 수 있는 이름으로 바꾼다. 그리고 새로운 LocalSettings.php 파일을 하나 만들어서 접속한 서버 주소에 따라 각 위키의 LocalSettings 파일이 읽혀지도록 만들어준다. 아래는 LocalSettings.php의 예이다.

<?php
/**
 * LocalSetting.php for a wiki farm
 * the format of a LocalSetting file of a wiki: LocalSetting-wiki.yourdomain.org.php
 *
 * @author mooo
 * @date 2016-01-29
 **/
// Protect against web entry
if ( !defined( 'MEDIAWIKI' ) ) {
    exit;
}// default site name
define('DEFAULT_SITE', 'wiki.mooo.org');
// please see https://www.mediawiki.org/wiki/Manual:Wiki_family#Wiki_Configurations
$wgJobRunRate = 0;
// requested server name (domain name)
$server_name = $_SERVER['SERVER_NAME'];
// check $server_name
// check $_ENV for updating wiki from the commandline
// SERVER_NAME=foo.yourdomain.org php maintenance/update.php
// for more infomation, see https://www.mediawiki.org/wiki/Manual:Wiki_family#Updating_wikifarm_from_the_commandline
if (empty($server_name)) {
    $server_name = empty($_ENV['SERVER_NAME']) ? DEFAULT_SITE : $_ENV['SERVER_NAME'];
    $_SERVER['SERVER_NAME'] = $server_name;
}// check LocalSetting of a site
if (!file_exists(__DIR__ ."/LocalSettings-{$server_name}.php")) {
    // NOTICE: terminate the program?
    header('HTTP/1.1 404 Not Found');
    echo "Not available for {$server_name}! Check configuration!". PHP_EOL;
    exit(0);
}// import common configuration
if (file_exists(__DIR__ .'/LocalSettings-common.php'))
    require_once(__DIR__ .'/LocalSettings-common.php');
// import LocalSetting of a site
// overwrite previous configuration
require_once(__DIR__ ."/LocalSettings-{$server_name}.php");
// import extension configuration
if (file_exists(__DIR__ .'/LocalSettings-extension.php'))
    require_once(__DIR__ .'/LocalSettings-extension.php');

위의 예에서는 사용자가 접속한 서버 이름을 확인해서 그것을 기반으로 어떤 위키의 LocalSettings를 읽어올 것인지 결정한다. 만약 해당하는 설정 파일을 불러올 수 없다면 사용자의 작은숲:위키노트/브라우저에 404 에러 메시지를 뿜어내면서 종료한다. 이 부분은 기본 위키로 되돌려주는 방법도 있을 것이다. 위에 나온 LocalSettings.php에서는 각 위키에 들어가는 공통적인 설정은 LocalSettings-common.php로 따로 빼내고, 확장 기능 설정도 따로 빼서 LocalSettings-extension.php에 넣어두었다. 그래서 각 위키의 설정 파일에는 해당 위키만의 설정이 들어있다. 관리의 편의성을 위해 이렇게 했지만 얼마나 자주 설정을 확인하고 바꾸게 될 지는 알 수 없다.

캐시 디렉토리와 업로드 디렉토리의 설정

미디어위키에서 파일 캐시를 쓴다면 캐시 디렉토리가 필요하다. 업로드를 허용한 경우에도 업로드 디렉토리도 필요하다. 하지만 서버에 설치된 모든 위키가 공통된 소스 디렉토리를 사용하기 때문에 이 소스 디렉토리에 같이 이름의 캐시 디렉토리와 업로드 디렉토리를 쓰는 것은 문제가 있을 수 있다. 따라서 각 위키 별로 캐시 디렉토리와 업로드 디렉토리를 따로 만들어 설정한다.

$wgScriptPath = "/w";
$wgScript = "$wgScriptPath/index.php";
$wgArticlePath = "/w/$1";
$wgScriptExtension = ".php";
$wgResourceBasePath = $wgScriptPath;
$wgUploadDirectory = "/var/www/wiki/mediawiki-data/images";
$wgUploadPath = "$wgResourceBasePath/images";
$wgCacheDirectory = "/var/www/wiki/mediawiki-data/cache";
$wgUseFileCache = true;
$wgFileCacheDirectory = $wgCacheDirectory;

여기에는 몇 가지 방법이 있겠으나 간단하게 각 위키의 루트 디렉토리에 캐시 디렉토리와 업로드 디렉토리를 만들어준다. 그리고 그 디렉토리의 경로를 각 위키의 설정 파일에 넣어둔다. 또한 잊지 말아야 할 것은 이 디렉토리들은 반드시 웹 서버가 돌아가는 계정으로 읽고 쓸 수 있어야 한다는 것이다. 아주 간단한 해결 방법으로는 이 디렉토리의 퍼미션을 777로 주는 것이다. 하지만 이것은 그리 권장할 만한 방법은 아니다. 만약 서버의 root 권한이 있다면 이 디렉토리들의 소유자를 웹 서버가 돌아가는 nobodyapache, 혹은 www-data로 바꿔주는 것이 좋다.

# chown nobody:nobody /var/www/wiki/mediawiki-data/images /var/www/wiki/mediawiki-data/cache

그리고 캐시 디렉토리는 웹에서 접근하지 못하도록 .htaccess 파일을 하나 만들어주는 것이 좋다. 캐시 디렉토리는 웹에서 접근할 일이 없다.

Deny from all

업로드 디렉토리는 위키 사용자들이 그림 파일 등을 올리기 때문에 웹에서 접근할 수 있어야 한다. 따라서 웹 서버 설정 파일을 적절히 수정한다. 위의 예에서는 업로드 디렉토리를 $wgResourceBasePath/images, 즉 w/images로 접근하도록 하고 있다. 이에 맞도록 가상 호스트 설정에 Alias를 설정한다.

<VirtualHost *:80>
    ServerAdmin admin@yourdomain.com
    DocumentRoot /var/www/wiki
    ServerName wiki.yourdomain.com
    Alias /w/images /var/www/wiki/mediawiki-data/images
    ErrorLog /var/log/apache2/wiki-error.log
    CustomLog /var/log/apache2/wiki-access.log combined
</VirtualHost>

이렇게 하면 하나의 미디어위키 소스로 여러 위키를 운영할 수 있다. 이제 수정해야 할 곳이 있거나 업그레이드를 할 때, 단 한 번의 작업으로 모든 위키에 적용되는 기쁨을 맛볼 수 있을 것이다.

커맨드라인에서의 위키 업데이트

위의 예에서 중간 쯤에 있는 SERVER_NAME=foo.yourdomain.com php maintenance/update.php는 커맨드라인, 즉 터미널상에서 미디어위키의 업데이트 기능을 사용할 때를 말한다. 이렇게 설정한 상황에서는 LocalSettings.php가 단순히 해당 위키의 설정 파일을 열어주는 역할만 하기 때문에 커맨드라인에서 maintenance/update.php를 실행하면 어떤 위키를 찾아가야 하는지 알 수 없다. 그래서 쉘 환경 변수에 SERVER_NAME를 직접 넣어서 전달해주는 것이다. 또한 maintenance 디렉토리 내에서 update.php를 실행하면 각 위키의 설정파일을 읽을 수 없기 때문에 미디어위키가 설치된 디렉토리에서 실행해야 한다. 더 자세한 내용은 미디어위키위키 패밀리 메뉴얼Update.php 메뉴얼을 참고하자.

참고

주석

각주

  1. Wikipedia에서는 이러한 방법으로 새로운 서버를 설치한다고 한다.
이 작은숲 문서의 출처는 위키노트의 위키노트/미디어위키로 여러 위키 쓰기 문서입니다.