서버 이전 도중 데이터베이스 (DB) 가 이전 안되는 문제가 발생하였습니다. 기존의 서버에서 모든 데이터베이스를 SQL 파일 형식으로 추출한 다음, 새로운 서버에서 phpMyAdmin 을 이용하여 가져오기를 시도 했는데 Internal Server Error 가 발생해 버렸습니다.
왜 그럴까요.. phpMyAdmin에서 발생한 이 문제, 해결해 보도록 하겠습니다.
이 포스팅은 기존의 글에서부터 이어지는 내용이며 환경은 윈도우 아파치 서버입니다.
참고 : PHP 속도 개선 / 윈도우 웹서버 XAMPP FastCGI 적용방법
문제 살펴보기
phpMyAdmin 에서 “가져오기” 를 통해 기존의 데이터베이스 SQL 파일를 불러들이면
이와 같이 Internal Server Error (또는 500 Server Error. )가 발생합니다. 자세한 정보는 서버 에러 로그를 확인하라고 나오네요. 좋습니다. 로그를 까봅시다.
XAMPP 컨트롤 패널에서 Log -> Apache (error.log) 를 클릭하여 에러 로그를 까봅니다.
위 사진은 XAMPP 윈도우 버전의 예시이고 다른 환경일 경우 본인의 error.log 파일을 찾아 까봅시다. 운영체제에 따라서 또는 패키지 별로 파일 위치와 이름이 다를 수 있습니다. (대개는 비슷합니다.)
mod_fcgid: HTTP request length 8134272 (so far) exceeds MaxRequestLen (8131072) 에러가 떠있네요. 이는 FastCGI 관련 에러입니다.
PHP처리 엔진을 기본 아파치 Mod-PHP 엔진을 사용하였다면 뜨지 않을 에러입니다만 아파치 php처리 엔진을 FastCGI로 바꿔줬을 경우 약간의 셋팅을 더 해줘야 에러가 뜨지 않습니다.
윈도우 아파치 서버 환경에서 아파치 핸들러 엔진(Mod-PHP)을 FastCGI 로 바꾸는 방법이 궁금하신 분들은 아래의 글을 참고해 주세요. 윈도우 아파치 환경에서 아파치 핸들러(Mod-PHP) 성능이 별롭니다.
DB 가져오기 해결 방법
PHP처리 모듈 Mod-PHP 에서 FastCGI 로 바꿔줬었던 http-xampp.conf 파일을 오픈합니다. XAMPP 를 사용하지 않는 분이라면.. 음.. 잘모르겠네요. 패키지별로 PHP-Module Setup 위치가 달라 직접 찾으셔야 합니다.
어렵지는 않으실 겁니다. httpd.conf 파일에 포함되어있거나 그 근처에 include 된 파일을 찾으시면 됩니다. http-xampp.conf 파일도 httpd.conf 로 include 되는 파일 중 하나입니다.
#
# PHP-Module setup
#
LoadFile "c:/xampp/php/php8ts.dll"
LoadFile "c:/xampp/php/libpq.dll"
LoadFile "c:/xampp/php/libsqlite3.dll"
LoadModule fcgid_module modules/mod_fcgid.so
<IfModule fcgid_module>
FcgidInitialEnv PATH "C:/xampp/php"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/xampp/tmp"
FcgidInitialEnv TMP "C:/xampp/tmp"
FcgidInitialEnv windir "C:/windows"
FcgidIOTimeout 64
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 1000
FcgidMaxProcesses 3
FcgidMaxRequestLen 8131072
# Location php.ini:
FcgidInitialEnv PHPRC "C:/xampp/php"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
<Files ~ "\.php$">
Options Indexes FollowSymLinks ExecCGI
AddHandler fcgid-script .php
FcgidWrapper "C:/xampp/php/php-cgi.exe" .php
</Files>
</IfModule>
여기서 수정해 줘야 하는 부분은 FcgidMaxRequestLen 값입니다.
FcgidMaxRequestLen는 최대 HTTP 요청 길이를 의미합니다. 요청 본문의 크기가 이 크기를 초과하면 요청이 실패하고 500 Server Error. 나 Internal Server Error 를 뱉어냅니다.
즉phpMyAdmin에서 DB가져오기를 했을 때 Internal Server Error 에러가 발생하는 이유는 DB양이 많아 HTTP 요청 길이가 부족하여 생기는 문제 입니다.
위의 FastCGI 설정에서
FcgidMaxRequestLen 8131072 값을
FcgidMaxRequestLen 1073741824 으로 늘려줍니다. (꼭 이 수치가 아니어도 됩니다.)
자 이제 다시 phpMyAdmin 에서 DB 가져오기를 실행해 봅시다. 이제는 될껍니다.