그누보드5 게시판의 첨부파일 용량 제한과 관련된 PHP 설정

Posted by taeho Tae-Ho
2014.05.22 09:13 Web/DB/Dev

요즘은 게시판 위주의 홈페이지를 만들기가 무척 편해졌다. 제로보드XE나 그누보드(GNUBOARD)를 아파치와 PHP 그리고 Mysql 환경에 설치하면 여러 게시판을 가진 포탈스런(?) 홈페이지를 뚝딱~만들 수 있다.


아래 화면은 그누보드(GNUBOARD5)를 이용해 한나절만에 만든 게시판 위주의 자료실 홈페이지다.



ATOM CPU(D510??으로 기억)달린 2G 메모리의 4년쯤된 컴에 레드햇 6.3을 깔고 (웹서버로) 보니 mysql이 없어서 yum의 리포지토리로 레드햇CD를 등록한 뒤 yum을 이용해 mysql을 설치했다.


yum을 이용해 mysql을 설치하면 의존성을 자동으로 체크하여 의존적인 패키지를 함께 설치해주기 때문에 무척 편리하다. 일일히 의존성 체크해가며 설치하자면 하루도 더 걸릴 듯... -.-


하지만 yum을 사용하여 리눅스 설치 CD의 패키지를 설치하려면 그냥은 안되고 yum에서 설치 cd를 리포지토리로 사용하도록 설정해 주어야 한다. 리눅스 (redhat, centos)의 설치 cd를 yum 리포지토리에 추가하는 방법은 유명하신 스누피님 블로그에서 찾아볼 수 있다. (여기)


아파치, PHP, MYSQL의 설치가 완료되면 게시판을 선택하여 설치한다. (여기서는 설명하지 않는다.)


게시판 소스을 설치하고 나면 게시판을 생성하여야 하는데 일반 글과 작은 이미지 파일 정도를 업로드 하는데는 별 문제가 없지만 제안서나 브로셔 등 사이즈가 10M 이상되고 그런 파일들을 10개 까지 업로드 하려 하면 많은 문제가 발생한다.


아파치는 DOS공격이나 DDOS 공격을 방어하기 위해 하나의 서버사이드스크립트(php, jsp 등)가 한번에 실행될 수 있는 시간을 제한하거나 웹페이지에 접속하고 아무런 후속 요청이 없으면 세션 타임아웃이 발생해 접속이 끊어지도록 되어 있다. 그 외에도 대용량 파일을 게시판에 업로드 할 때 사용되는 세션의 메모리나 시간, 파일 크기 등을 여러 파라미터를 통해 조정을 해줘야 원활하게 자료실 형태의 게시판으로 운영할 수 있다.


먼저 조정해줘야 할 것은 게시판 자체의 파일 업로드 크기 제한이다.

아래 이미지는 그누보드5의 업로드 파일 크기 제한 설정 화면이다.



기본적으로 1M Byte로 되어 있었는데 10M 바이트로 늘린 화면이다. 하나의 게시물에 여러개의 파일이 올라가도 각각 개별적인 파일의 크기만 제한한다. 즉 위처럼 설정되어 있다면 10M 파일을 여러개 업로드 할 수 있다. 이 설정은 게시판~마다 설정해줘야 한다.


하지만 이 설정만 변경해서는 용량이 큰 파일을 업로드할 수는 없다.

다음은 php.ini 파일에서 업로드 파일 관련 설정을 변경해주어야 한다. php.ini는 /etc 디렉토리에 있다.



먼저 file_uploads가 On으로 되어 있어야 하며

upload_max_filesize를 원하는 용량으로 변경해주면 된다. 위의 설정은 한번의 파일 업로드 즉 하나의 php 스크립트가 실행되면서 해당 세션에서 업로드할 수 있는 용량을 의미한다.


만약 아파치서버의 임시디렉토리가 포함된 파일시스템의 용량이 작다면(일반적으로 /tmp) upload_tmp_dir을 설정할 필요도 있다.


다음은 php.ini에서 post 메소드 실행 시 사용할 수 있는 메모리 제한값을 설정해 주어야 한다.



그누보드의 경우(대부분 그럴 것으로 보임) 파일을 업로드 하면 POST 메소드로 전송이 되는데 이때 업로드하는 파일의 크기만큼 POST로 전송되는 메시지가 커진다. 이 설정도 보안과 관련이 있지만 게시판의 기능인 자료실 용도이니 만큼 제한을 작게 할 수는 없다. 아펭서 파일의 업로드크기 제한을 100M로 했으므로 POST 시 사용할 수 있는 메시지의 크기도 100M보다 커야한다. 


위에서는 128M로 설정했다. 왜 100이 아니고 128이냐고 묻는다면 8의 배수 그리고 16의 배수, 32의 배수, 64의 배수로 설정해주는게 습관이 돼서라고 이야기 해주겠다.


그리고 메모리 관련 설정이 또 하나가 있다. (제약이 참 많기도 하다.) 앞에서 POST 메소드에서 사용할 수 있는 메모리를 설정해 주어도 PHP 스크립트 하나에서 사용할 수 있는 메모리 제약이 걸려있기 때문에 post_max_size 보다 아래의 memory_limit 가 작다면 의미가 없다.


아래 처럼 post_max_size인 128M 보다 크거나 같게 설정한다.



이제 업로드 파일의 용량과 업로드 시 사용되는 웹서버 측의 메모리 제약에 대한 설정은 모두 변경하였다.


하지만 이것만 설정해선 또 오류가 발생할 수 있다. 파일을 업로드 하는 것은 하나의 PHP 스크립트 파일이 아파치 대몬에 의해 실행되는 것이다. PHP에선 하나의 스크립트가 실행될 수 있는 최대 시간도 제한이 걸려 있다. 만약 100M의 업로드에 제약이 걸린 시간보다 오랜 시간이 소요된다면 timeout 오류가 발생할 수 있다. 이 문제를 예방하기 위해 하나의 php 스크립트가 실행될 수 있는 최대 실행시간 즉, max_execution_time 을 변경해준다.



60초 이내에 100M 바이트의 파일 업로드가 완료되어야 한다. 만약 시간이 부족하다면 더 늘려주면 된다. 단위는 초다.


이제 아파치 대몬을 재구동하고 파일 업로드를 해보라..

잘 되는가?? ^^



신고
이 댓글을 비밀 댓글로