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

미디어위키(Mediawiki) 파일 업로드 01(핵심 설정)

씨실과 날실 2019. 4. 5. 21:00


업로드 오류

미디어위키는 파일 업로드 권한이 있는 경우 화면 좌측에 파일 올리기 링크가 나타납니다.

미디어위키의 파일 업로드와 관련하여 아래와 같은 기본값을 가지고 있습니다.

업로드 가능한 파일의 최대 크기: 100 MB

업로드 가능한 파일 형식 : png, gif, jpg, jpeg, webp

위 내용을 보면 기본적으로 미디어위키는 기본적으로 이미지 파일만을 업로드 대상으로 설정하고 있음을 알 수 있습니다. 실제로 파일이 업로드되는 경로도 미디어위키 설치 디렉토리의 하위 디렉토리 images입니다. 디렉토리 이름에서 미루어 보아 미디어위키 설계 시 주 업로드 대상을 이미지 파일로 설정하였음을 알 수 있습니다. 과거 버전은 파일 업로드 디렉토리가 uploads였습니다.

위 설정들은 관련 설정을 수정함으로써 바꿀 수 있습니다. 업로드 자체를 막을 수도 있고, 그룹별로 업로드 권한을 설정할 수도 있으며, 업로드 용량과 업로드 가능 파일 확장자도 바꿀 수 있습니다. 이따가 그에 대해서도 다루도록 하겠습니다.

미디어위키에 올릴 파일을 찾아보기에서 선택하면 올릴 파일이 이미지 파일의 경우 해당 이미지의 섬네일이 보여집니다.

라이선스를 선택할 수 있도록 드롭다운 메뉴가 있는데 지금 현재는 선택할 수 있는 항목이 전혀 없습니다. 라이선스 옵션 편집 링크를 누르면 나가기 버튼과 계속 사용 버튼이 나오는데 거기서 나가기 버튼을 누르면 아래와 같은 화면이 나옵니다.

이 미디어위키:Licenses 문서를 수정해주어야 합니다. 이 내용도 나중에 자세히 다루도록 하겠습니다.

올릴 파일을 선택하고 파일 설명과 올리기 설정 작업을 하고 파일 올리기 버튼을 눌러봅시다.

그러면 아래와 같은 명령 실패 안내문을 보게 됩니다.

명령 실패

"mwstore://local-backend/local-public/?/??/파일명"에 대한 잠금 파일을 열지 못했습니다. 업로드 디렉토리가 제대로 설정되어 있고 웹 서버가 해당 디렉토리를 편집할 권한이 있는지 확인하세요. 더 많은 정보를 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory 에서 확인할 수 있습니다.

대문 문서로 돌아갑니다.

이것은 보통 images 디렉토리의 소유권과 퍼미션 설정 문제입니다. 이 역시 나중에 자세히 다루도록 하겠습니다.

우린 지금 업로드 작업이 안 된다는 것을 확인했습니다. 이제 업로드 불가능 문제를 해결하고 업로드 관련 설정에 대해 자세히 알아보도록 하겠습니다.

업로드 전제조건

php 업로드 활성화 확인

php.ini 파일에서 다음이 설정되어 있는지 확인해봅니다.

file_uploads = On

제 연재를 처음부터 따라오시거나, 우분투 18.04에서 apt install php 명령을 통해 설치한 경우, /etc/php/7.2/apache2 안의 php.ini 파일을 열어보면 816번째 줄에 해당 내용이 기본값으로 설정되어 있을 것입니다. 만약 Off로 설정되어 있으면 On으로 설정해주시면 됩니다.

파일 업로드 관련 서버 설정에 대해서는 그리고 파일 업로드 관련 설정이 이것 하나만 있는 것은 아닙니다.

서버의 파일 업로드 관련 설정은 아래 링크를 참고하여 설정해주시기 바랍니다.

디렉토리 보안 검사

터미널에서 다음과 같이 실행해줍니다.

study@study-VirtualBox:/var/www/html/w$ sudo chown -R www-data:www-data images/
[sudo] study의 암호: 
study@study-VirtualBox:/var/www/html/w$ sudo chmod -R 755 images
study@study-VirtualBox:/var/www/html/w$ 

각 실행 명령의 의미는 다음과 같습니다.

sudo chown -R www-data:www-data images/

safe_mode를 사용하는 경우 디렉토리가 php 스크립트를 실행하는 데 사용되는 사용자의 소유인지 확인하고, 위 명령을 통해 images 디렉토리 소유자를 변경해줍니다.

sudo chmod -R 755 images

    User can read, write and execute;
    Group can read and execute;
    World can read and execute.

.htaccess 파일 확인

미디어위키 파일 업로드 디렉토리(기본값 - /images)에 .htaccess 파일이 있어야 합니다. 미디어위키를 설치할 때 업로드 디렉토리를 기본값으로 설정하면 images 디렉토리 안에 .htaccess 파일(숨김 파일)이 존재합니다.

이 .htaccess 파일의 내용은 기본값이 다음과 같습니다.

# Protect against bug T30235
<IfModule rewrite_module>
    RewriteEngine On
    RewriteOptions inherit
    RewriteCond %{QUERY_STRING} \.[^\\/:*?\x22<>|%]+(#|\?|$) [nocase]
    RewriteRule . - [forbidden]
    # Fix for bug T64289
    Options +FollowSymLinks
</IfModule>

이 파일의 목적은 업로드 폴더의 보안을 강화하는 것입니다. 업로드 디렉토리를 추후에 다른 곳으로 설정하면 .htaccess 파일을 새 위치로 복사하거나 서버에서 해당 구성을 직접 적용해주어야 합니다.

LocalSettings.php 업로드 설정

$wgEnableUploads = true;   # 업로드 활성화

$wgEnableUploads = false;  # 업로드 비활성화(기본값)

$wgEnableUploads는 비활성화가 기본값입니다. 따라서 LocalSettings.php 파일에 해당 변수가 존재하지 않는다면 미디어위키 내 업로드 기능이 비활성화되어 있다는 것입니다.

만약 미디어위키 설치 시 파일 업로드 기능 활성화에 체크했다면 LocalSettings.php 파일에 파일 업로드 활성화 코드가 자동으로 기입되어 있을 겁니다.

미디어위키 1.31 버전을 기준으로 보통 70번 대 줄에 적혀있을 겁니다.

## To enable image uploads, make sure the 'images' directory
## is writable, then set this to true:
$wgEnableUploads = true;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";

업로드 관련 핵심 세부 설정

파일 업로드 시 하위 디렉토리 생성 설정 - $wgHashedUploadDirectory

미디어위키는 파일 업로드시 기본적으로 images 디렉토리 안에 하위 디렉토리를 생성하고 그 안에 파일을 업로드합니다. 이것을 제어하는 변수가 $wgHashedUploadDirectory입니다.

이 $wgHashedUploadDirectory는 기본값이 true로 되어 있어 LocalSettings.php 파일에서 따로 설정하지 않으면 파일 업로드 시 하위 디렉토리를 생성합니다.

$wgHashedUploadDirectory 가 true로 설정되면(혹은 LocalSettings.php 파일에 따로 정의되어있지 않으면)  업로드 된 파일은 파일 이름의 md5 해시의 처음 두 문자를 기반으로 $wgUploadDirectory(기본값 - $IP/images)의 하위 디렉토리에 배포됩니다. (예 : $IP/images/a/ab/foo.jpg)

참고로 $IP는 미디어위키 설치 디렉토리 전체 경로를 의미합니다.

이렇게 파일을 업로드 하는 이유는  하나의 폴더에 너무 많은 파일이 있는 것을 피하기 위해서인데요. 일부 파일 시스템은 한 폴더에 너무 많은 수의 파일을 포함하게 되면 성능이 저하되기 때문입니다.

만약 여러분들이 운영하게 될 위키가 업로드될 파일의 수가 적을 경우 굳이 $wgHashedUploadDirectory 변수를 기본값으로 유지할 필요가 없습니다. 기본값으로 유지한다면 오히려 업로드된 파일을 사후에 관리할 때 번거로울 수 있습니다.

따라서 현재 업로드 된 이미지가 거의 없고 이후에도 파일 업로드 수가 크게 늘어나지 않을 것으로 예상되는 경우 $wgHashedUploadDirectory = false; 로 설정하면 기본 설정값을 해제 할 수 있습니다. 이럴 경우 모든 이미지는 $wgUploadDirectory에서 정의된 디렉토리 자체에 한데 업로드됩니다. (예 : $IP/images/foo.jpg)

LocalSettings.php 파일 편집

##파일 업로드 시 하위 디렉토리 생성 설정 해제##
# https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads#Upload_directory
$wgHashedUploadDirectory = false;

이 설정은 가능하면 파일이 하나도 업로드되지 않은 상태에서 설정하기를 추천합니다.

파일 업로드 디렉토리 변경 - $wgUploadDirectory, $wgUploadPath

미디어위키의 파일 업로드 디렉토리 기본값은 $IP/images입니다. 그러나 이 디렉토리를 다르게 설정할 수 있습니다.

파일 업로드 디렉토리는 $wgUploadDirectory 변수를 이용해 제어합니다. LocalSettings.php 파일에 따로 설정해주지 않으면 기본값이 그대로 적용됩니다.

예를 들어 /images가 아니라 /upload 디렉토리로 설정하려면 /upload 디렉토리를 생성하고 소유권과 퍼미션을 위 설명을 참고하여 설정해준 후 LocalSettings.php 파일에 아래와 같이 설정해주시면 됩니다.

업로드 디렉토리 생성, 소유권 및 퍼미션 설정

study@study-VirtualBox:/var/www/html/w$ sudo mkdir upload
[sudo] study의 암호: 
study@study-VirtualBox:/var/www/html/w$ sudo chown -R www-data:www-data upload/ && sudo chmod -R 755 upload
study@study-VirtualBox:/var/www/html/w$  

LocalSettings.php 파일 편집

##업로드 디렉토리 설정 변경 ##
# https://www.mediawiki.org/wiki/Manual:Configuring_file_uploads#Upload_directory
$wgUploadDirectory = "{$IP}/upload";
$wgUploadPath = "{$IP}/upload";

그런데 $wgUploadDirectory 이 변수만 설정하는 것으로 끝나는 것은 아닙니다. 이 변수와 관현된 또다른 변수가 있습니다. LocalSettings.php 에서 이 변수를 재정의하면 $wgUploadPath(기본값 - {$wgScriptPath}/images)를 포함한 모든 종속 변수 또한 재정의해야합니다. 관련 변수들이 일관성이 없으면 파일을 $wgUploadDirectory)에서 정의한 디렉토리에 업로드합니다.

이 설정 역시 가능하면 파일이 하나도 업로드되지 않은 상태에서 설정하기를 추천합니다. 설정이 추후에 바뀌게 되면 업로드 파일 연결이 깨집니다.

업로드 가능 파일 확장자 설정 - $wgFileExtensions

미디어위키는 업로드 가능 파일 확장자 기본값으로 png, gif, jpg, jpeg, webp 이렇게 4개의 이미지 파일 확장자가 설정되어 있습니다.

그러나 우리는 $wgFileExtensions 변수를 적절히 설정함으로써 파일 확장자를 추가할 수 있습니다. 파일 확장자 추가 코드는 아래와 같은 방식이 있습니다.

업로드 가능 파일 확장자 추가 코드

기본값에 하나의 파일 유형 만 추가 - $wgFileExtensions[] = '확장자';

# Add new types to the existing list from DefaultSettings.php
$wgFileExtensions[] = 'docx';
$wgFileExtensions[] = 'xls';
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'mpp';
$wgFileExtensions[] = 'odt';
$wgFileExtensions[] = 'ods';

위 코드와 같은 방식으로 $wgFileExtensions변수를 각 확장자별로 한 줄씩 추가해주는 겁니다.

기본값에 여러 파일 유형 추가

$wgFileExtensions = array_merge(
    $wgFileExtensions, array(
        'pdf', 'ppt', 'jp2', 'webp', 'doc','docx', 'xls', 'xlsx'
        )
    );

기존의 업로드 가능 파일 유형 기본값에 따로 여러 파일 유형을 추가하는 방법입니다.

따로 지정한 것으로 파일 업로드 가능 파일 유형 기본값을 재정의 - $wgFileExtensions = array( '확장자01', '확장자02', '확장자03');

$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'doc',
    'xls', 'mpp', 'pdf', 'ppt', 'tiff', 'bmp', 'docx', 'xlsx',
    'pptx', 'ps', 'odt', 'ods', 'odp', 'odg'
);

업로드 가능 파일 유형 기본값을 위 코드에 작성된 것들로 재정의하는 방식입니다.

위 코드를 관리자가 확장자별로 보다 관리하기 편하게 수정한 것이 아래의 코드입니다.

### 파일 업로드 확장자 설정 ###
$wgFileExtensions = array(
    // 이미지 파일
    'png','gif','jpg','jpeg','svg','tif','tiff', 'bmp',
    // 문서파일
    'doc', 'docx', 'txt','hwp', 'pdf',
    // 스프레드시트 파일
    'xls', 'xlsx', 'cell',
    // 슬라이드 파일
    'ppt', 'pptx',
    // 음악 미디어 파일
    'mp3', 'ogg',
    // 동영상 미디어 파일
    'mp4', 'wmv', 'avi', 'mkv', 'mpeg',
    // 압축 파일
    'zip', 'gz'
    );

세 코드 방식 중 자신에게 편한 방식을 사용하시면 됩니다.

LocalSettings.php 파일에 위 코드를 구문 오류 없이 작성하여 저장 후 미디어위키 파일 올리기 화면을 보면 아래와 같이 업로드 가능 확장자가 추가된 것을 확인할 수 있습니다.

파일 업로드 제한 해제 - $wgStrictFileExtensions

미디어위키는 기본값으로 따로 지정한 파일 확장자들만 업로드하도록 설정되어 있습니다.

이 제한을 풀어 대부분의 파일을 업로드하도록 설정할 수 있는데 아래의 코드가 바로 그것입니다.

$wgStrictFileExtensions = false;

그러나 위 코드를 사용한다하더라도 아래에 설명할 블랙리스트에 정의되어 있는 파일 확장자들은 업로드할 수 없습니다.

참고로 가능하면 이 코드는 사용하지 마시고 업로드 가능 파일 유형을 추가해주시는 방법을 사용하시기 바랍니다. 만약 이 코드를 사용하면 악성코드 등이 업로드되어 사이트 보안이 취약해지기 때문입니다.

업로드 불가 확장자 목록 설정 - $wgFileBlacklist

미디어위키는 기본적으로 몇몇 확장자의 파일들은 업로드를 막고 있습니다.

아래는 그 기본값입니다. 기본값이므로 아래 코드를 적지 않아도 됩니다.

$wgFileBlacklist = [
  # HTML may contain cookie-stealing JavaScript and web bugs
  'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
  # 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', 'cgi',
  # May contain harmful executables for Windows victims
  'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
];

만약 업로드를 막고 싶은 파일 확장자가 있다면 위 코드에 추가해주시면 됩니다.

$wgFileBlacklist 변수가 $wgFileExtensions 변수보다 우선하기 때문에 $wgFileBlacklist에 정의된 확장자는 $wgFileExtensions 변수에 정의되어 있더라도 업로드되지 않습니다.

블랙리스트에 추가된 확장자를 업로드 가능케 설정

## 블랙리스트에 추가된 확장자를 업로드 가능케 설정 ##
$wgFileExtensions[] = 'exe';
$wgFileBlacklist = array_diff( $wgFileBlacklist, array ('exe') );

블랙리스트에 추가된 확장자를 업로드 가능케 설정하려면 $wgFileExtensions 변수와 $wgFileBlacklist 변수를 위와 같이 작성해주셔야 합니다.

업로드 파일 용량 설정

미디어위키는 파일 하나 당 올릴 수 있는 최대 용량이 100MB로 설정되어 있습니다. 이것을 수정할 수 있습니다.

먼저 업로드 전제조건 - php 업로드 활성화 확인 부분에 업로드 관련 서버 설정에 대하여 제가 연재했던 글을 링크를 걸어 두었습니다. 다시금 걸어두도록 하겠습니다.

요약 내용은 아래 박스를 참고하시기 바랍니다.

php.ini

[업로드 설정]

- 필수 설정
file_uploads = On // 파일 업로드 사용 여부
upload_max_filesize = 2048M // 업로드 용량 제한 설정 (최대 2기가)
post_max_size = 2048M // php내 post 방식 업로드 최대 용량 (최대 2기가)

- 옵션 설정
max_execution_time = 0 // php 최대 실행시간 제한 (0 : 제한 없음)
max_input_time = -1 //  php 엔진이 데이터를 입력받는 최대 시간 (-1 : 제한 없음)
memory_limit = 2048M // php 메모리 사용량 제한

*  크기를 memory_limit > post_max_size > upload_man_filesize 순으로 설정


참고 - 해당 부분 기본값들

- 필수 설정
file_uploads = On
upload_max_filesize = 2M
post_max_size = 8M

- 옵션 설정
max_execution_time = 30
max_input_time = 60
memory_limit = 128M


apache2.conf

[대용량 업로드]

<Directory />
   LimitRequestBody 2147483647
</Directory>

위 설정을 한 후에 LocalSettings.php 파일에 아래 코드를 작성하면 미디어위키의 업로드 가능 용량을 재설정할 수 있습니다.

## 최대 2G 업로드 ##
$wgUploadSizeWarning = 2147483647 ; // 2GB 업로드 경고
$wgMaxUploadSize = 2147483647 ; // 2GB 업로드

wgUploadSizeWarning에서 지정된 값(바이트 기준 정수)보다 큰 파일을 업로드하려고하면 사용자에게 경고합니다. $ wgUploadSizeWarning을 0 바이트로 설정하면 경고가 비활성화됩니다. 사용자는 경고를 무시하고 파일을 업로드하도록 선택할 수 있습니다.

$wgMaxUploadSize에서 사용되는 정수는 바이트 기준입니다. 미디어위키가 업로드할 수 있는 단일 파일 최대 용량은 2147483647바이트입니다.

이 2147483647은 재미있는 수입니다. 2147483647은 메르센 소수로 2의 31승 - 1로 간결하게 표현되니다. 이 수는 컴퓨터 공학적 측면에서 의미있는 수입니다. 이 수에 대해 재미있는 글이 있어 여러분들과 공유하고자 링크를 겁니다. 한번쯤 읽어보시기릴 바랍니다.