MariaDB 설정으로 급한 불은 껐지만, 아직 안심하기엔 이릅니다. 512MB라는 좁은 방에 MariaDB와 PHP-FPM이 같이 살다 보면, 어느 한쪽이 욕심을 부리는 순간 서버는 바로 ‘OOM Killer(Out of Memory)’의 칼춤을 보게 됩니다.
오늘은 웹 서버의 살림꾼인 Nginx와 메모리 먹는 하마가 되기 쉬운 PHP-FPM을 아주 타이트하게 조여보겠습니다.
Nginx: “너는 딱 하나만 해”
사실 Nginx 자체는 매우 가볍습니다. 하지만 기본 설정에서는 CPU 코어 수에 맞춰 프로세스를 생성하려 하죠. 512MB급 서버는 대개 1 vCPU입니다. 굳이 여러 프로세스를 띄워 컨텍스트 스위칭(Context Switching)으로 힘 뺄 필요가 없습니다.
/etc/nginx/nginx.conf 설정 수정
worker_processes 1; # 1 vCPU 환경에선 1이 국룰
worker_connections 512; # 동시 접속자가 수천 명이 아니라면 이 정도로 충분

PHP-FPM: “기본값이니까 괜찮다?” 그게 함정입니다.
설정을 열어보셨을 때 pm.max_children = 5 같은 값들이 이미 적혀 있어 “어? 이미 되어있네?”라고 생각하셨을 수도 있습니다. 하지만 여기서 중요한 건 ‘내 서버의 가용 메모리’와 ‘PHP 프로세스 하나가 먹는 양’을 계산해 보는 것입니다.
보통 PHP-FPM 프로세스 하나당 최소 30MB에서 많게는 50MB 이상을 사용합니다.
만약 max_children이 5라면 PHP 혼자서 250MB를 넘게 쓸 수 있다는 뜻인데, 512MB 서버에서 OS와 MariaDB가 차지하는 비중을 생각하면 결코 작은 수치가 아닙니다.
전략 1. Dynamic (기본형: 응답 속도 중시)
기본 설정이 이 방식이라면, 값을 더 보수적으로 잡아야 합니다.
pm = dynamic
pm.max_children = 5 ; 서버가 터지기 직전의 마지노선입니다.
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
전략 2. Ondemand (극단적 다이어트: 추천)
손님이 없을 땐 프로세스를 아예 죽여서 메모리를 반환하는 방식입니다. 저사양 서버에선 이만한 게 없죠.
Ini, TOML
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 10s; # 10초간 일 없으면 메모리 반납!

적용 및 실제 점유율 확인
이제 설정을 적용하고 ‘진짜’ 메모리가 얼마나 줄었는지 눈으로 확인할 시간입니다.
sudo systemctl restart nginx
sudo systemctl restart php-fpm
터미널에서 top 또는 htop을 실행한 뒤 Shift + M을 눌러 메모리 사용 순으로 정렬해 보세요.
