미디어위키/미디어위키 설치 및 관리

미디어위키(Mediawiki) 1.31 공식 지원 익스텐션 통합 설치(상세 설명)

씨실과 날실 2019. 8. 4. 18:00

얼마전 미디어위키가 유지 보수를 지원 중인 버전들의 각 버전별 스킨 통합 설치 방법에 대해 안내해드렸습니다. 이번에는 익스텐션들의 버전별 통합 설치에 대한 안내입니다.

주의

개인적으로 미디어위키 공식 사이트의 익스텐션 검색 기능을 활용하여 자신에게 필요한 익스텐션들만 개별적으로 설치하시기를 강력히 권장합니다. 미디어위키의 익스텐션이 근 800개에 가까우므로 이들을 모두 다운 받는 것은 자원 낭비일 뿐만 아니라 각 익스텐션별로 추가적인 작업이 필요한 경우가 많아 그 수많은 예외 사항을 일일이 확인하여 설치하기에는 들여야 하는 시간과 노력이 너무 큽니다.

그럼에도 불구하고 이렇게 통합 설치 방법을 적는 이유는 제가 익힌 내용을 정리하고 리눅스 서버와 미디어위키 등에 대해 보다 깊게 학습하고자 하는 분들에게 공유하여 조금이나마 도움이 되길 바라는 마음에서 입니다.

다시금 말씀드리지만 아래 내용은 이런 내용도 있다 정도만 알고 넘어가시기 바랍니다.

미디어위키 1.31 지원 익스텐션 목록


Git으로 설치

Git을 사용할 줄 안다면 Git을 이용해 내려받으실 것을 강력히 권장합니다. 이유는 다음과 같습니다.

익스텐션의 업데이트 등으로 익스텐션의 파일명이 바뀌는 경우가 있습니다. 따라서 이번 글에 익스텐션의 URL 주소를 공개한다 하더라도 언제든지 파일명이 바뀌어 내려받지 못할 수 있습니다. 실제로 이번 연재를 준비하면서 해당 경우를 여러번 겪었습니다. 그러나 Git을 이용하면 언제나 최신 정보로 유지되기 때문에 파일명이 바뀔 것을 걱정하지 않아도 됩니다.

미디어위키의 익스텐션 검색 페이지나 배포 페이지에 실시간으로 정보가 갱신되는 것은 아닙니다. 실제로 미디어위키 익스텐션 배포 페이지에서 1.31용 익스텐션은 총 753개만이 등록되어 있습니다.  그러나 Git을 이용해 내려받으면 총 780개의 익스텐션을 내려 받을 수 있습니다.

참고로 미디어위키 익스텐션 Git 저장소에는 1.32 익스텐션은 785개, 1.33 익스텐션은 808개의 익스텐션이 관리되고 있습니다.

기존 extensions 폴더 이름 변경

study@study-VirtualBox:/var/www/html/w$ sudo mv extensions extensions_old

이렇게 기존 익스텐션 디렉토리 이름을 변경하는 이유는 Git으로 미디어위키의 익스텐션을 Clone할 때 extensions 디렉토리가 이미 존재하면 아래와 같은 문구를 출력하며 실행되지 않기 때문입니다.

study@study-VirtualBox:/var/www/html/w$ sudo git clone https://gerrit.wikimedia.org/r/mediawiki/extensions --branch REL1_31
[sudo] study의 암호:
fatal: 대상 경로가('extensions') 이미 있고 빈 디렉터리가 아닙니다.

익스텐션 통합 Git Clone(복제)

study@study-VirtualBox:/var/www/html/w$ sudo git clone https://gerrit.wikimedia.org/r/mediawiki/extensions --branch REL1_31
'extensions'에 복제합니다...
remote: Counting objects: 94, done
remote: Finding sources: 100% (84/84)
remote: Getting sizes: 100% (42/42)
remote: Compressing objects: 100% (1452318/1452318)
remote: Total 505059 (delta 41), reused 504975 (delta 0)
오브젝트를 받는 중: 100% (505059/505059), 105.27 MiB | 9.44 MiB/s, 완료.
델타를 알아내는 중: 100% (252505/252505), 완료.
study@study-VirtualBox:/var/www/html/w$

익스텐션 통합 git submodule update

study@study-VirtualBox:/var/www/html/w$ cd ./extensions
study@study-VirtualBox:/var/www/html/w/extensions$ sudo git submodule update --init --recursive
'3D' 경로에 대해 '3D' (https://gerrit.wikimedia.org/r/mediawiki/extensions/3D) 하위 모듈 등록
'AJAXPoll' 경로에 대해 'AJAXPoll' (https://gerrit.wikimedia.org/r/mediawiki/extensions/AJAXPoll) 하위 모듈 등록
... 중략 ...
'/var/www/html/w/extensions/3D'에 복제합니다...
'/var/www/html/w/extensions/AJAXPoll'에 복제합니다...
... 중략 ....
하위 모듈 경로 '3D': '84bb1759148186157cd0a90e43ac7573d2bed555' 체크아웃
하위 모듈 경로 'AJAXPoll': '97573a4e7d06f4b7819adf079834df647b6b8bff' 체크아웃
... 중략 ...
study@study-VirtualBox:/var/www/html/w/extensions$

익스텐션이 출시 된 이후에도 업데이트되는 경우가 있으므로  위 git submodule update를 익스텐션 설치 후에도 가끔씩 실행해주시면 좋습니다.

미디어위키 버전 변경 후 익스텐션 대응 브랜치로 변환

study@study-VirtualBox:/var/www/html/w/extensions$ sudo git submodule foreach 'git checkout -b REL1_32 origin/REL1_32 || :'

사용하는 미디어위키의 버전을 바꾼 경우 해당 브랜치에 맞게 익스텐션의 버전도 바꿔주어야 합니다. 위와 같은 코드를 이용하시면 됩니다.

LocalSettings.php 파일에 익스텐션 등록

익스텐션 디렉토리명 목록 파일로 저장

study@study-VirtualBox:/var/www/html/w/extensions$ find . -maxdepth 1 -type d > ~/다운로드/mediawiki/extensions/REL1_31/ext_list.txt

위 명령은 익스텐션 디렉토리에 존재하는 1단계 하위 디렉토리의 목록을 텍스트 파일로 뽑는 명령입니다.

이렇게 생성된 파일 내용은 아래와 같습니다.

.
./ShoutWikiAPI
./MsLinks
./WikiLovesMonuments
./SemanticDrilldown
./UnicodeConverter
./HashTables
./Screenplay
./OpenID
... 생략 ....

익스텐션 등록 코드 생성

study@study-VirtualBox:~/다운로드/mediawiki/extensions/REL1_31$ sed -i "s/^../wfLoadExtension( '/g" ~/다운로드/mediawiki/extensions/REL1_31/ext_list.txt

study@study-VirtualBox:~/다운로드/mediawiki/extensions/REL1_31$ sed -i "s/$/' );/g" ~/다운로드/mediawiki/extensions/REL1_31/ext_list.txt

위 명령어는 리눅스의 sed와 표현정규식을 이용한 문자열 치환 명령어입니다.

파일 내용은 아래와 같이 치환될 것입니다.

위 코드들 중 첫 줄의 .' )와 wfLoadExtension( '.git' ); 줄을 삭제하고 나머지 코드들을 LocalSettings.php 파일의 익스텐션 등록 부분에 추가해주시면 됩니다.

참고로 위 코드들 중

wfLoadExtension( '익스텐션명' );

코드가 아닌

require_once "$IP/extensions/익스텐션명/익스텐션명.php";

과 같은 구식 코드를 사용하는 경우가 있습니다. 따라서 위와 같이 일괄적으로 wfLoadExtension( '익스텐션명' ); 코드를 쓸 수 있는 것은 아닙니다. 따라서 어떤 코드를 써야할 지는 각 익스텐션의 공식 페이지에서 일일이 확인해야 합니다. 이런 면을 봐서도 통합 설치는 결코 쉽지 않습니다.

위 작업만으로 설치가 완료되는 익스텐션이 있는가 하면 DB 업데이트가 필요한 익스텐션도 있습니다. 그런 경우 아래와 같이 미디어위키의 DB를 업데이트해주어야 합니다.

미디어위키 DB update 실행

study@study-VirtualBox:/var/www/html/w/maintenance$ sudo php update.php[

그러나 통합 설치할 때는 DB 업데이트를 실행하면 아래와 같은 문구가 출력됩니다.

study@study-VirtualBox:/var/www/html/w/maintenance$ sudo php update.php
[sudo] study의 암호:
PHP Fatal error:  Uncaught Exception: /var/www/html/w/extensions/SemanticDrilldown/extension.json does not exist! in /var/www/html/w/includes/registration/ExtensionRegistry.php:107
Stack trace:
#0 /var/www/html/w/includes/GlobalFunctions.php(50): ExtensionRegistry->queue('/var/www/html/w...')
#1 /var/www/html/w/LocalSettings.php(287): wfLoadExtension('SemanticDrilldo...')
#2 /var/www/html/w/includes/Setup.php(94): require_once('/var/www/html/w...')
#3 /var/www/html/w/maintenance/doMaintenance.php(81): require_once('/var/www/html/w...')
#4 /var/www/html/w/maintenance/update.php(248): require_once('/var/www/html/w...')
#5 {main}
  thrown in /var/www/html/w/includes/registration/ExtensionRegistry.php on line 107

문제가 발생한 익스텐션의 문제를 해결하거나 설치에서 제거하더라도(미디어위키 새로 설치 시에는 익스텐션 설치 체크 해제, 기존 미디어위키에 익스텐션만 추가하는 경우에는 해당 익스텐션 디렉토리와 등록 코드를 제거) 문제가 발생하는 또다른 익스텐션에 대한 오류 메시지가 출력됩니다.

study@study-VirtualBox:/var/www/html/w/maintenance$ sudo php update.php
[sudo] study의 암호:
PHP Fatal error:  Uncaught Exception: /var/www/html/w/extensions/HashTables/extension.json does not exist! in /var/www/html/w/includes/registration/ExtensionRegistry.php:107
Stack trace:
#0 /var/www/html/w/includes/GlobalFunctions.php(50): ExtensionRegistry->queue('/var/www/html/w...')
#1 /var/www/html/w/LocalSettings.php(290): wfLoadExtension('HashTables')
#2 /var/www/html/w/includes/Setup.php(94): require_once('/var/www/html/w...')
#3 /var/www/html/w/maintenance/doMaintenance.php(81): require_once('/var/www/html/w...')
#4 /var/www/html/w/maintenance/update.php(248): require_once('/var/www/html/w...')
#5 {main}
  thrown in /var/www/html/w/includes/registration/ExtensionRegistry.php on line 107
study@study-VirtualBox:/var/www/html/w/maintenance$

즉 문제가 있는 익스텐션이 한꺼번에 출력되는 것이 아니라 한번에 하나씩만 출력되기 때문에 이것을 해결하려면 출력되는 익스텐션을 일일이 확인하고 해결해야 하기 때문에 굉장히 오랜 시간이 걸립니다.

또한 문제가 익스텐션의 오류 발생 원인은 다양합니다. 의존성 등 해당 익스텐션이 요구하는 모든 조건을 충족해야만 올바르게 설치할 수 있습니다. 그 조건은 각 익스텐션의 공식 페이지에서 확인해야 합니다.

그마저도 구식 정보여서 올바른 정보를 얻지 못하는 경우도 왕왕 있습니다. 그럴 땐 끝없는 구글링만이 유일한 해결책입니다. 아니면 해당 익스텐션 공식 페이지의 토론 페이지나 스택오버플로 등 전문 QnA 사이트에 직접 영어로 질문을 올려 답변이 올라오기를 기다리든지 말이지요.

이런저런 이유로 근 800개에 이르는 익스텐션을 한번에 설치한다는 것은 거의 불가능합니다. 물론 굳이 꼭 해야겠다고 마음먹고 매달리면 못할 것은 없겠지만 그러기에는 포기해야할 기회비용이 너무나 큽니다.

따라서 다시금 말씀드립니다만 익스텐션의 통합 설치는 하지 마시고 그냥 필요 익스텐션을 검색하여 개별적으로 설치하시기를 바랍니다.

익스텐션 다운로드 URL 활용

위 내용은 미디어위키 공식 사이트 안의 익스텐션 배포 페이지에 등록된 익스텐션 각각의 공개 URL 주소입니다. 1.31 기준으로 Git에는 780개가 등록되어 있지만 익스텐션 배포 페이지에는 753개만 공개되어 있습니다.

위 내용 그대로 문서를 생성하여 한번에 다운받습니다. 저는 ~/다운로드/mediawiki/extensions/REL1_31 디렉토리 안에 mw_extensions_01.txt 라는 파일로 저장했습니다.

study@study-VirtualBox:~/다운로드/mediawiki/extensions/REL1_31$ wget -i mw_extensions_01.txt

위 코드를 사용하면 해당 파일이 존재하는 디렉토리에 익스텐션 압축 파일들이 다운됩니다.

참고로 '# 익스텐션명'은 미디어위키 해당 버전 또는 브랜치를 지원하지 않은 익스텐션들입니다. 제가 일일이 확인하여 미지원 익스텐션을 적어 놓은 것입니다.

http://나 https://, ftp:// 등으로 시작하지 않기 때문에 해당 줄은 wget이 아래와 같이 오류를 출력하며 건너뛰게 됩니다.

study@study-VirtualBox:~/다운로드/mediawiki/extensions/REL1_31$ wget -i mw_extensions_01.txt
mw_extensions_01.txt: Invalid URL http://## 기본 제공 익스텐션 ##: Invalid host name
mw_extensions_01.txt: Invalid URL http://## 추가 설치 익스텐션 ##: Invalid host name
mw_extensions_01.txt: Invalid URL http://# AnonPrivacy: Invalid host name
mw_extensions_01.txt: Invalid URL http://# ArticleMetaDescription: Invalid host name
mw_extensions_01.txt: Invalid URL http://# AuthenticatedKeyValueStore: Invalid host name
mw_extensions_01.txt: Invalid URL http://## BlueSpice 익스텐션 모음 시작 ##: Invalid host name
mw_extensions_01.txt: Invalid URL http://# BlueSpiceCategoryCheck: Invalid host name
mw_extensions_01.txt: Invalid URL http://# BlueSpiceExpiry: Invalid host name
mw_extensions_01.txt: Invalid URL http://# BlueSpiceExtensions: Invalid host name
mw_extensions_01.txt: Invalid URL http://# BlueSpiceFilterableTables: Invalid host name

... 하략 ....

다운이 완료 후 터미널에서 위와 같이 다운받아진 파일 개수와 걸린 시간 등의 정보를 확인할 수 있습니다.

FINISHED --2019-07-24 15:28:38--
Total wall clock time: 9m 40s
Downloaded: 705 files, 341M in 6m 53s (846 KB/s)
study@study-VirtualBox:~/다운로드/mediawiki/extensions$

완료 후 터미널에 출력된 정보들을 편집 - 모두 선택 - 복사를 한 후 문서 편집 프로그램을 열어 복사한 내용을 붙인 다음 아래의 구문을 검색해줍니다.

response... 404 Not Found

그러면 내려받지 못한 익스텐션 목록을 확인할 수 있습니다.

--2019-07-24 15:25:26--  https://extdist.wmflabs.org/dist/extensions/LDAPAuthentication2-REL1_31-f493308.tar.gz
Reusing existing connection to extdist.wmflabs.org:443.
HTTP request sent, awaiting response... 404 Not Found
2019-07-24 15:25:26 ERROR 404: Not Found.

response... 404 Not Found 문구 두 줄 위를 보면 받지 못한 익스텐션의 파일 경로를 확인할 수 있습니다.

이 익스텐션은 업데이트 등의 이유로 해당 익슽첸션의 파일 이름이 변경된 경우입니다. 그런 경우 미디어위키 익스텐션 배포 페이지에서 검색하여 올바른 주소를 확인해서 내려받으시면 됩니다.

LocalSettings.php 파일에 익스텐션 등록

위에 상술한 동일 이름의 항목을 참고하시기 바랍니다.

미디어위키 DB update 실행

위에 상술한 동일 이름의 항목을 참고하시기 바랍니다.




앞서 안내해드렸습니다만 이 내용은 이런 것들이 있더라 하는 정도로만 짚고 넘어 가시고 실제로 통합 설치는 하지 않으시기를 바랍니다. 물론 공부삼아 해보시는 것까지는 말리지 않습니다.

위 내용은 제가 현재 연재 기준이 되는 미디어위키 1.31 기반 안내입니다. 미디어위키 1.32와 1.33 용 익스텐션 통합 설치 안내는 내용을 최소한으로 줄일 예정입니다.