본문 바로가기
미디어위키

MediaWiki Install 1.36.0 on Debian

by 다움위키 2023. 11. 28.

미디어위키-1.36 설치와 설정(모든 처음 사용자를 위해)

 

이 기사는 너무 많은 내용을 담고 있기 때문에, 최신 상태를 유지하기가 쉽지 않습니다. 반면에 이 기사에 필요한 각각의 프로그램 등은 해당 기사에서 가능한 최신 정보를 기록해 두려고 합니다. 따라서, 이 기사에서 동작하지 않는 부분은 해당 기사로 가셔서 확인하시기 바랍니다!!

새로운 버전의 출시와 함께, 처음 사용자들이 이 사이트의 정보에 따라 미디어위키를 설치하는 순서를 소개하고자 합니다. 이 기사에서 소개한 것 외에 개별 프로그램의 기사에서 구성과 최적화 과정은 별도로 진행하는 것이 좋습니다.

게다가, 가상 기계 아래에서 설정할 것이기 때문에, http://localhost를 대상으로 진행합니다. 추후에 추가적인 여러 설정에서 이 부분을 수정해야 합니다.

여기서 소개된 설정은 대체로 몇 년에 걸쳐 조금씩 추가된 것들로써, 대체로 영문 위키피디아의 설정을 많이 참고했습니다. 각 설정의 의미는 이 위키의 Category:Manual에서 찾아볼 수 있고, 번역되지 않은 것들은 mw:Category:Manual에서 찾아보시기 바랍니다.

Prerequisites

PHP

PHP는 ondrej 저장소의 것을 사용합니다:

  • sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2
  • echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
  • wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
  • sudo apt update
  • sudo apt install php8.1-fpm
  • sudo apt install php8.1-curl php8.1-gd php8.1-intl php8.1-mbstring php8.1-mysql php8.1-xml

다음 패키지가 추가적으로 필요할 수 있습니다:

MariaDB

개발자의 저장소를 이용합니다:

처음 설치후 작업.

  • sudo mysql_secure_installation

데이터베이스 만들기.

  • sudo mysql -u root -p
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS `wikidb` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
MariaDB [(none)]> use mysql;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wikidb.* TO wikiuser@localhost  IDENTIFIED BY 'password';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

여기서 'wikidb', 'wikiuser'의 이름과 'password'를 적절히 바꾸십시오.

Redis

메인 캐시 서버는 Redis를 이용하는데, 데비안 저장소에서 설치합니다:

  • sudo apt update
  • sudo apt install redis-server php-redis

또는 최신의 패키지를 사용할 수 있습니다:

Nginx

데비안 저장소의 패키지를 이용하지 않고, 직접 빌드한 패키지를 이용합니다. 물론 이 패키지는 데비안에서 제공하는 패키지에 ngx_speed, ngx_brotli 모듈만 추가한 것입니다:

다음 패키지를 설치하십시오.

  • libnginx-mod-http-geoip
  • libnginx-mod-http-image-filter
  • libnginx-mod-http-lua
  • libnginx-mod-http-ndk
  • libnginx-mod-http-xslt-filter
  • libnginx-mod-mail
  • libnginx-mod-stream
  • libnginx-mod-stream-geoip
  • nginx
  • nginx-common
  • nginx-core
  • sudo apt install -f

Nginx_configurations

기본적인 설정 파일을 받아서 사용하십시오.

Installations

웹에서 설치하는 과정은 MediaWiki#Setup의 과정을 따라 하시면 됩니다. 그리고, Nginx 설정 파일은 이 파일을 받으셔서 사용하시고, 일부 나중에 필요한 부분을 수정하셔야 합니다.

설치를 진행하기 전에 위에서 받은 nginx 설정 파일을 일부 수정해야 합니다. 먼저, nginx 설정 파일을 /etc/nginx/sites-available/로 옮기고, 다음 줄을 찾아서 아래와 같이 주석처리합니다:

#location /w/mw-config { deny all; } 설치가 완료되면, 주석 해제하고 서비스를 다시 시작해야 합니다.

다음으로, pagespeed를 설정하시기 귀찮으시면, 맨 아래에 있는 다음 줄을 아래와 같이 주석처리합니다.

#include pagespeed/optimize.conf;

다음으로, /etc/nginx/snippets/fastcgi-php.conf 파일에서 다음 줄을 주석처리합니다.

#try_files $fastcgi_script_name =404;

이제 서비스를 재시작합니다:

  • sudo systemctl restart nginx

이때, 서비스에서 문제가 발생할 수 있습니다. 그럴 때에는 status를 확인해서, 필요한 사항을 바로잡고 서비스를 시작해야 합니다.

그런-다음 미디어위키 다운로드 지면에서 최신 안정 버전을 받으십시오.

  • /var/www/html/w 아래에 소스를 풉니다.
  • sudo chown -R root:root /var/www/html/w
  • 웹브라우저로 http://localhost/w/mw-config/로 접근해서 설치를 진행하십시오.

다음으로 업로드 디렉토리 사용자와 허가권을 변경해야 합니다.

  • cd /var/www/html/w
  • sudo chmod 775 images cache
  • sudo chown root:www-data images cache
  • sudo cp /home/user/Downloads/LocalSettings.php .

웹에서 localhost로 접근합니다.

시각 편집기가 동작하기 위해서 nginx 설정을 추가해야 합니다: 이 부분은 설정 파일에 반영되어 있습니다!

	location /w/rest.php/ {
    	try_files $uri $uri/ /w/rest.php?$query_string;
	}

Configurations

미디어위키 디버깅

미디어위키에서 문제가 생겨 흰 화면만 출력될 때, 오류 메시지를 확인하고 디버깅을 하기 위해 출력 메시지 저장해야 합니다. 평소에는 아래와 같이 주석처리해 두었다가 문제 생겼을 때, 주석을 해제하고 사용하시기 바랍니다.

#error_reporting( E_ALL );
#ini_set( 'display_errors', 1 );
#$wgResourceLoaderDebug = true;
#$wgShowDBErrorBacktrace = true;
#$wgDebugLogFile= "/tmp/MediaWikiDebug.log";
#$wgShowExceptionDetails = true;

Pretty URI

다음 내용을 LocalSettings.php에 추가하십시오.

$wgScriptPath      = "/w";              # 원래 있던 줄.
$wgScriptExtension = ".php";

// Pretty URIs MW
$wgArticlePath = "/wiki/$1";            
$wgUsePathInfo = true;

Redis

다음 내용을 LocalSettings.php에 추가하십시오.

$wgObjectCaches['redis'] = array(
    'class'                => 'RedisBagOStuff',
    'servers'              => array( '127.0.0.1:6379' ),
    'persistent'        => true,
);
$wgMainCacheType = 'redis';
$wgSessionCacheType = 'redis'; 
$wgSessionsInObjectCache = true;
$wgMessageCacheType = 'redis';
$wgParserCacheType = 'redis';
$wgLanguageConverterCacheType = 'redis';

$wgJobTypeConf['default'] = [
    'class'          => 'JobQueueRedis',
    'redisServer'    => '127.0.0.1:6379',
	'redisConfig' => [],
	'claimTTL'       => 3600,
    'daemonized'     => true
];

# Job queue
$wgJobRunRate = 0;

Job queue

미디어 위키 설정은 위의 파일에 넣었습니다.

Manual:Job queue#Simple service to run jobs의 순서에 따라 진행하시고, 파일의 내용은 그대로 사용하셔도 됩니다:

  • sudo nano /usr/local/bin/mwjobrunner
  • sudo chmod 755 /usr/local/bin/mwjobrunner
  • sudo nano /etc/systemd/system/mw-jobqueue.service
  • sudo systemctl daemon-reload
  • sudo systemctl enable mw-jobqueue
  • sudo systemctl start mw-jobqueue
  • sudo systemctl status mw-jobqueue
  • sudo systemctl restart nginx

Email enable

사용자 사이의 전자우편을 활성화합니다.

$wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO

$wgEmergencyContact = "관리자_email";
$wgPasswordSender = "관리자_email";

$wgEnotifUserTalk = true; # UPO
$wgEnotifWatchlist = true; # UPO
$wgEmailAuthentication = true;

Timezone & ExteranlLink

$wgLocaltimezone = "Asia/Seoul";
date_default_timezone_set( $wgLocaltimezone );

#외부링크 새 탭에서 열기
$wgExternalLinkTarget = '_blank';

File upload & related

$wgEnableUploads = true;
$wgUploadPath = "{$wgScriptPath}/images";
$wgGenerateThumbnailOnParse = false;
$wgThumbnailScriptPath = "{$wgScriptPath}/thumb.php";
$wgFileExtensions = array('png','gif','jpg','jpeg','doc','ogg','xls','ppt','tiff','tif','bmp','docx','xlsx','pptx','mp3','sxc','pdf','ebuild','gz','bz2','xz','tar','patch','svg','zip','ogv');
# Files with these extensions will never be allowed as uploads.
$wgFileBlacklist = array(
        # HTML may contain cookie-stealing JavaScript and web bugs
        'html', 'htm',
        # PHP scripts may execute arbitrary code on the server
        'php', 'phtml', 'php3', 'php4', 'php5', 'phps',
        # Other types that may be interpreted by some servers
        'shtml', 'jhtml', 'pl', 'py',
        # May contain harmful executables for Windows victims
        'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' );

$wgAllowTitlesInSVG = true;
$wgSVGConverter = 'rsvg-secure';
$wgSVGConverterPath = '/usr/bin';
$wgSVGMaxSize = 4096;
$wgSVGConverters['rsvg-secure'] = '$path/rsvg-convert -w $width -h $height -o $output < $input';

$wgCheckFileExtensions = true;

$wgStrictFileExtensions = true;

$wgUploadSizeWarning = 30000000;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";
$wgMaxShellFileSize = 512 * 1024; // Kilobytes
$wgMaxShellMemory = 1024 * 1024;  // Kilobytes
$wgMaxShellTime = 50;  // seconds

$wgUseInstantCommons = true;
$wgShellLocale = "C.UTF-8";

$wgHashedUploadDirectory = true;

Recent changes

새로운 인터페이스가 약간은 늦은 응답을 보여주기도 합니다. 이전 형식으로 바꿀 수 있습니다.

$wgDefaultUserOptions['rcenhancedfilters-disable'] = true;
$wgDefaultUserOptions['wlenhancedfilters-disable'] = true;
$wgHiddenPrefs = ['rcenhancedfilters-disable', 'wlenhancedfilters-disable'];

소스 가져오기

간혹 다른 곳의 템플릿(Template), 모듈(Module), 또는 기사를 가져올 필요가 있습니다.

$wgImportSources = array(
      'wikipedia' => array( 'en' )
);

Vector skin

$wgDefaultSkin = "Vector";
$wgVectorResponsive = false;
$wgVectorShowSkinPreferences = true;
$wgVectorDefaultSkinVersion = 2;
$wgVectorDefaultSkinVersionForExistingAccounts = 2;
$wgVectorDefaultSkinVersionForNewAccounts = 2;
$wgVectorLayoutMaxWidth = true;
$wgVectorDefaultSidebarVisibleForAnonymousUser = true;
$wgVectorUseWvuiSearch = true;
$wgVectorWvuiSearchOptions['showThumbnail'] = true;
$wgVectorWvuiSearchOptions['showDescription'] = true;

Extensions

아래의 것이 미디어위키 1.36과 함께 번들로 제공되는 확장입니다.

wfLoadExtension( 'CategoryTree' );
wfLoadExtension( 'Cite' );
wfLoadExtension( 'CiteThisPage' );
wfLoadExtension( 'CodeEditor' );
wfLoadExtension( 'ConfirmEdit' );
wfLoadExtension( 'Gadgets' );
wfLoadExtension( 'ImageMap' );
wfLoadExtension( 'InputBox' );
wfLoadExtension( 'Interwiki' );
#wfLoadExtension( 'LocalisationUpdate' );
wfLoadExtension( 'MultimediaViewer' );
wfLoadExtension( 'Nuke' );
#wfLoadExtension( 'OATHAuth' );
wfLoadExtension( 'PageImages' );
wfLoadExtension( 'ParserFunctions' );
wfLoadExtension( 'PdfHandler' );
wfLoadExtension( 'Poem' );
wfLoadExtension( 'Renameuser' );
wfLoadExtension( 'ReplaceText' );
wfLoadExtension( 'Scribunto' );
wfLoadExtension( 'SecureLinkFixer' );
wfLoadExtension( 'SpamBlacklist' );
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
wfLoadExtension( 'TemplateData' );
wfLoadExtension( 'TextExtracts' );
wfLoadExtension( 'TitleBlacklist' );
wfLoadExtension( 'VisualEditor' );
wfLoadExtension( 'WikiEditor' );

추가적인 확장은 미디어위키 확장 배포 지면에서 검색을 통해 받으실 수 있습니다.

그런 다음, 예를 들어, Extension:Math 확장을 아래와 같이 풀어줍니다.

  • sudo tar xvf Math-REL1_36-8c7c35b.tar.gz -C /var/www/html/w/extensions

수식 입력

설정 파일 LocalSettings.php에 다음을 추가하십시오.

wfLoadExtension( 'Math' );

물론 네트워크 속도 품질을 일정하게 개선하기 위해, 로컬에 RESTBaseMathoid를 설치할 필요가 있지만, 크게 속도에 영향을 받지 않을 때에는 그냥 사용하셔도 무방합니다.

검색 개선

먼저, Elasticsearch를 설치하십시오.

jre 다운로드 페이지에서 최근 버전을 받습니다:

  • sudo mkdir -p /usr/lib/jvm/
  • sudo tar -zxvf jre-8u333-linux-x64.tar.gz -C /usr/lib/jvm/
  • sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jre1.8.*/bin/java 1
  • sudo update-alternatives --config java

1번을 선택하십시오.

  • echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
  • sudo apt update
  • sudo apt install elasticsearch
  • sudo systemctl start elasticsearch
  • sudo systemctl enable elasticsearch

제대로 동작하지 않을 경우 해당 지면의 설정을 확인하십시오.

AdvancedSearch, Elastica, CirrusSearch를 설치하십시오.

wfLoadExtension( 'AdvancedSearch' );
wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
$wgDisableSearchUpdate = true;

인덱스 생성.

  • cd /var/www/html/w
  • php extensions/CirrusSearch/maintenance/UpdateSearchIndexConfig.php

위의 설정에서 $wgDisableSearchUpdate = true; 주석처리하십시오.

다음으로 다음을 실행하여 검색 인덱스를 부트스트랩합니다:

  • php extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipLinks --indexOnSkip
  • php extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipParse

설정 파일에 $wgSearchType = 'CirrusSearch';를 추가하십시오.

필요하다면, Extension:CirrusSearch#Completion_Suggester를 설정하십시오. 어렵지 않으니, 가능한 설정하십시오.

에디터 개선

CodeMirror, CharInsert를 설치하고, 설정 파일에 추가하십시오.

wfLoadExtension( 'CodeMirror' );
$wgDefaultUserOptions['usecodemirror'] = 1;
wfLoadExtension( 'CharInsert' );

다음 파일을 만드십시오. 영문 위키피디아의 것을 그대로 이용하셔도 좋겠습니다.

토론 개선

Extension:Echo, Extension:Flow, Extension:CheckUser, Extension:CLDR, 및 Extension:Thanks를 설치하십시오.

wfLoadExtension( 'Echo' );
wfLoadExtension( 'Flow' );
$wgNamespaceContentModels[NS_TALK] = 'flow-board';
$wgNamespaceContentModels[NS_USER_TALK] = 'flow-board';
$wgGroupPermissions['sysop']['flow-create-board'] = true;
$wgContentHandlerUseDB = true;
$wgFlowContentFormat = 'html';
wfLoadExtension( 'CheckUser' );
$wgGroupPermissions['sysop']['checkuser'] = true;
$wgGroupPermissions['sysop']['checkuser-log'] = true;
$wgGrantPermissionGroups['checkuser'] = 'administration';
wfLoadExtension( 'cldr' );
wfLoadExtension( 'Thanks' );
$wgThanksSendToBots = false;
$wgThanksLogging = true;
$wgThanksConfirmationRequired = true;
$wgThanksLogTypeWhitelist = [
	"contentmodel",
	"delete",
	"import",
	"merge",
	"move",
	"patrol",
	"protect",
	"tag",
	"managetags",
	"rights"
];

RESTBase & Mathoid

BESTBase master 버전을 사용하면, 일부 수식 표현에서 오류가 발생할 수 있으므로, 최근 안정 버전 1.1.4를 설치하는 것을 고려해 볼 수 있습니다.

이전 수식 확장 아래에 다음 내용을 추가하십시오.

wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgVisualEditorFullRestbaseURL = "http://localhost/api/rest_";
$wgMathFullRestbaseURL= 'http://localhost/api/rest_';

새로운 Nginx 설정 파일과 RESTBase 설정 파일을 받고, 풀어서 정해진 위치에 옮겨야 합니다. 타르 파일을 풀어서 나오는 파일을 아래의 디렉토리로 옮기십시오:

게다가 2개의 파일을 수정해야 합니다. 아래 파일을 열어서 wikimedia.orglocalhost로 바꿉니다:

  • /usr/local/lib/restbase/sys/mathoid.js
  • /usr/local/lib/restbase/v1/mathoid.yaml

시작 스크립트 파일 만들기

RESTBase 서비스에 대한 새 사용자를 만들고 해당 사용자의 홈 폴더를 만듭니다.

  • sudo useradd --home=/var/lib/restbase -M --user-group --system --shell=/usr/sbin/nologin -c "RESTBase for MediaWiki" restbase
  • sudo mkdir -p /var/lib/restbase
  • sudo chown restbase:restbase /var/lib/restbase

Systemd 서비스 스크립트 /etc/systemd/system/restbase.service를 다음과 같이 만듭니다:

[Unit]
Description=Mediawiki RESTBase Service
Documentation=https://www.mediawiki.org/wiki/RESTBase
Wants=local-fs.target network.target
After=local-fs.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=restbase
Group=restbase
WorkingDirectory=/usr/local/lib/restbase
ExecStart=/usr/bin/node /usr/local/lib/restbase/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog

서비스를 다시 가져와서 서비스를 시작합니다.

  • sudo systemctl daemon-reload
  • sudo systemctl enable restbase
  • sudo systemctl start restbase
  • sudo systemctl status restbase

Mathoid를 독립형 데몬으로 실행하고 시작 스크립트를 만들기 위해서, 폴더를 시스템 폴더로 이동하고 다음과 같이 데몬을 실행하는 "mathoid" 사용자를 만듭니다:

  • sudo useradd --home=/var/lib/mathoid -M --user-group --system --shell=/usr/sbin/nologin -c "Mathoid for MediaWiki" mathoid
  • sudo mkdir -p /var/lib/mathoid
  • sudo chown mathoid:mathoid /var/lib/mathoid

Systemd 시작 스크립트 /etc/systemd/system/mathoid.service로 다음과 같이 만듭니다.

[Unit]
Description=Mediawiki Mathoid Service
Documentation=https://www.mediawiki.org/wiki/Mathoid
Wants=local-fs.target network.target
After=local-fs.target network.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=mathoid
Group=mathoid
WorkingDirectory=/usr/local/lib/mathoid
ExecStart=/usr/bin/node /usr/local/lib/mathoid/server.js
KillMode=process
Restart=on-success
Nice=10
OOMScoreAdjust=900
PrivateTmp=true
StandardOutput=syslog

그런 다음 서비스를 활성화하고, 시스템 시작시 자동으로 시작하도록 등록해 줍니다.

  • sudo systemctl daemon-reload
  • sudo systemctl enable mathoid
  • sudo systemctl start mathoid
  • sudo systemctl status mathoid

문제점 및 활용

만약 이 설정을 참조하고 외부에서 수식을 랜더링하기 위해서는 다른 부분은 수정할 필요가 없고, 아래의 내용에서 localhostFQDN으로 바꾸시면 됩니다:

wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgVisualEditorFullRestbaseURL = "http://localhost/api/rest_";
$wgMathFullRestbaseURL= 'http://localhost/api/rest_';

Math 확장 vs. SimpleMathJax 확장

과거에 테스트를 했을 때, 로컬에서 SimpleMathJax 확장을 이용하는 것이 월등히 속도가 좋았습니다. 현 싯점에서, 로컬에서 Mathoid를 통한 것과 SimpleMathJax 확장을 사용했을 때, 속도 차이를 거의 느낄 수 없습니다.

한편, SimpleMathJax 확장은 여전히 허용되지 않는 키워도가 있고, 어떤 경우에는 어떤 식으로 해도 레이텍 코드를 출력하고 랜더링된 결과를 출력하지 못합니다 (가상 기계에서 테스트했을 때, 단 한번도 제대로된 출력을 하지 못했습니다).

이런 상황 아래에서, 먼저, 수식을 많이 사용하지 않은 사이트는 RESTBase, Mathoid없이 Math 확장을 고려해 볼 수 있습니다.

다음으로, 수식을 많이 사용하는 사이트는, 설정이 동작하면, 로컬에서 RESTBase, Mathoid를 운영하는 것이 바람직합니다.

그렇지 않으면, 예를 들어, 수식을 많이 사용하는데 로컬에서 RESTBase, Mathoid를 운영하는 것이 불가능한 환경에서, 대안적으로 SimpleMathJax 확장을 고려해 볼 수 있습니다.

SimpleMathJax 확장의 가장 큰 문제점은 보통의 레이텍에서 사용하던 키워드를 지원하지 않는 것에 있는데, 그런 경우가 발생하면 대안을 찾는 것이 매우 귀찮습니다.