Ubuntu 16.04 Server / PHP / 메모리 늘리는 방법

Ubuntu 16.04에서 Apache 모듈로 실행되는 PHP의 메모리 한도를 늘리려면 해당 PHP의 php.ini에서 memory_limit 값을 변경하고 Apache를 다시 시작한 뒤 웹 요청에서 적용값을 확인합니다. PHP-FPM이나 명령줄 PHP는 다른 설정 파일을 사용할 수 있으므로 실행 방식을 먼저 확인해야 합니다.

적용 범위와 변경 전 확인

이 글은 Ubuntu 16.04의 PHP 7.0과 Apache 모듈을 기준으로 기존 서버를 점검하는 예제입니다. Ubuntu 16.04의 일반 보안 지원은 종료되었고, 확장 보안 유지보수 이후에는 별도의 Legacy 지원이 적용될 수 있습니다. 운영 환경의 적용 범위를 Ubuntu 보안 유지보수 일정에서 확인하고 지원되는 환경으로 이전을 계획하세요.

memory_limit은 PHP 스크립트가 할당할 수 있는 메모리를 제한하는 설정입니다. 서버에 설치된 물리 메모리나 여러 요청이 함께 사용하는 전체 메모리의 상한은 아닙니다. 한도를 높이면 동시에 처리되는 요청 수에 따라 서버의 메모리 부담이 커질 수 있으므로 여유 메모리와 실제 오류를 함께 확인하세요. PHP 설정과 애플리케이션에 따라 기본값은 달라질 수 있습니다.

웹에서 사용하는 PHP 설정 찾기

기본적인 Ubuntu 16.04의 PHP 7.0 Apache 모듈 설치에서는 /etc/php/7.0/apache2/php.ini를 사용합니다. 그러나 PHP 버전이나 설치 방식, 별도 설정에 따라 경로가 다를 수 있습니다. PHP-FPM은 보통 별도의 fpm/php.ini를 사용하며, 명령줄의 php --ini 결과가 웹 요청의 설정과 같다고 가정해서는 안 됩니다.

접근이 제한된 테스트 환경에서만 웹 문서 디렉터리에 임시 PHP 파일을 만들고 아래 코드를 넣으세요. 브라우저에서 그 파일을 열어 출력된 실행 방식, 설정 파일 경로와 현재 한도를 확인합니다. 파일 경로 등 서버 정보가 노출되므로 공개 환경에 두지 말고 확인 후 즉시 삭제하세요.

<?php
header('Content-Type: text/plain; charset=UTF-8');
echo 'SAPI: ' . PHP_SAPI . "\n";
echo 'Loaded ini: ' . php_ini_loaded_file() . "\n";
echo 'memory_limit: ' . ini_get('memory_limit') . "\n";

apache2handler라면 Apache 모듈 방식이며, fpm-fcgi라면 PHP-FPM 방식입니다. 설정 파일이 표시되지 않거나 예상과 다르면 설치와 웹 서버 연결을 확인하세요. PHP는 기본 파일 외에 추가 .ini 파일을 읽거나 애플리케이션·서버 설정에서 값을 덮어쓸 수도 있습니다. 자세한 내용은 PHP 설정 파일 문서를 참고하세요.

memory_limit 수정하기

다음은 웹에서 확인한 경로가 /etc/php/7.0/apache2/php.ini인 경우의 예입니다. 다른 경로라면 실제 확인한 파일에 적용하세요. 편집 전에 백업 파일이 아직 없는지 확인하고, 이미 있다면 아래 명령의 백업 이름을 다른 새 이름으로 바꿉니다.

sudo cp -a -n /etc/php/7.0/apache2/php.ini /etc/php/7.0/apache2/php.ini.before-memory-limit
sudo nano /etc/php/7.0/apache2/php.ini

편집기에서 기존 memory_limit 설정을 찾아 필요한 값으로 바꾸고 저장합니다. 예를 들어 기존 값이 128M이고 작업에 더 필요한 것으로 확인했다면 256M을 시험할 수 있습니다. 다음 값은 예시이며 모든 서버에 적합한 권장값은 아닙니다.

memory_limit = 256M

-1은 제한을 없애므로 문제를 해결하려고 무조건 사용하지 마세요. 메모리 부족의 원인이 큰 입력, 비효율적인 코드 또는 동시 요청일 수도 있습니다. 값의 의미는 PHP memory_limit 설명에서 확인할 수 있습니다.

Apache에 반영하고 확인하기

Apache 모듈 방식에서는 먼저 설정 검사를 실행합니다. Syntax OK가 나와야 다음 단계로 진행합니다. 검사가 실패하면 오류를 해결한 뒤 다시 검사하세요. 이 검사는 Apache 설정을 확인하는 것이며 웹 요청에서 PHP 한도가 제대로 적용되었는지까지 보장하지는 않습니다.

sudo apache2ctl configtest

검사가 성공하면 적절한 작업 시간에 Apache를 다시 시작합니다. 재시작은 연결과 실행 중인 요청에 영향을 줄 수 있으므로 운영 환경에서 영향을 확인하세요.

sudo systemctl restart apache2
sudo systemctl status apache2

서비스가 정상 동작하는지 확인하고, 앞에서 만든 접근 제한된 PHP 확인 파일을 다시 요청해 memory_limit이 의도한 값인지 살펴봅니다. 확인이 끝나면 임시 파일을 삭제하세요. 실제 애플리케이션에서 오류가 재발하지 않는지도 확인합니다.

PHP-FPM 방식이라면 위의 Apache 모듈 파일과 재시작만으로는 FPM 설정이 적용되지 않을 수 있습니다. 실제 로드된 FPM 설정 파일과 사용하는 서비스 이름을 확인하고, 해당 서비스의 설정 검사와 재시작 절차를 따르세요.

적용되지 않거나 문제가 생겼을 때

웹에서 확인한 값이 다르면 편집한 경로와 PHP 버전, 실행 방식이 맞는지 확인하세요. 추가 .ini 파일, Apache 설정, FPM 풀 설정, 애플리케이션의 ini_set() 등에서 값이 달라질 수 있습니다. 변경 후에도 메모리 오류가 나면 오류 로그와 작업 내용, 서버 메모리 사용량을 함께 살펴봐야 합니다.

변경을 되돌려야 한다면 백업한 설정 파일의 내용을 확인한 뒤 기존 파일로 복원하고 Apache 설정 검사와 서비스 재시작을 다시 수행하세요. 백업 경로가 예제와 다르면 실제 백업 경로를 사용합니다. 복원 전에도 현재 설정을 별도로 보관하면 변경 사항을 비교할 수 있습니다.