개발노트
고즐의 개발 및 서버 개발 노트![]()
Rocky Linux 서버에서 PHP + MariaDB 성능 튜닝 실전 가이드
Rocky Linux 서버에서 PHP와 MariaDB를 함께 운용할 때는 기본 설치만으로도 동작은 하지만, 적절한 튜닝을 해주지 않으면 트래픽이 조금만 늘어나도 느려지거나 장애가 발생하기 쉽습니다. 이 문서는 PHP 설정, PHP-FPM 프로세스 관리, MariaDB InnoDB 버퍼 풀 및 연결 수 등 실제로 체감 성능에 영향을 주는 핵심 튜닝값만 정리한 가이드입니다.
1. PHP 기본 튜닝: php.ini 설정
1-1. php.ini에서 조정해야 할 핵심 항목
php.ini는 PHP의 전반적인 동작 방식을 제어하는 설정 파일입니다. 메모리 제한, 실행 시간, 업로드 용량, 타임존, OPcache 등은 웹서비스 성능과 직결되는 부분이므로 반드시 점검해야 합니다.
memory_limit = 512M max_execution_time = 120 max_input_time = 120 post_max_size = 64M upload_max_filesize = 64M ; 한국 시간대 설정 date.timezone = Asia/Seoul ; OPcache 가속기 설정 opcache.enable = 1 opcache.enable_cli = 1 opcache.memory_consumption = 256 opcache.interned_strings_buffer = 16 opcache.max_accelerated_files = 20000 opcache.revalidate_freq = 60 opcache.validate_timestamps = 1 ; 보안 관련 expose_php = Off session.cookie_httponly = 1 session.use_strict_mode = 1
위 설정은 일반적인 PHP 기반 웹사이트·ERP·대시보드 환경에서 안정적으로 사용할 수 있는 값입니다. OPcache를 활성화하면 PHP 코드를 매 요청마다 다시 파싱하지 않고 캐시를 활용하므로 응답 속도가 눈에 띄게 빨라집니다.
2. PHP-FPM 프로세스 관리 튜닝
2-1. PHP-FPM 풀 설정 파일 위치와 기본 개념
PHP-FPM은 PHP 요청을 처리하는 별도의 프로세스 풀(pool)을 운영하는 방식입니다. 요청량에 비해 프로세스가 너무 적으면 대기가 길어지고, 너무 많으면 메모리가 부족해져 서버가 불안정해집니다. 주요 설정은 www.conf에서 조정합니다.
vi /etc/php-fpm.d/www.conf
2-2. 소규모·일반 사이트용: ondemand 모드
트래픽이 크지 않고, 여러 사이트를 가볍게 운영하는 환경이라면 ondemand 모드가 메모리 절약에 유리합니다.
pm = ondemand pm.max_children = 50 pm.process_idle_timeout = 60s pm.max_requests = 500
요청이 없을 때는 프로세스를 자동으로 줄이고, 트래픽이 생기면 필요한 만큼만 생성합니다. 메모리 여유가 크지 않은 VPS·가상서버에서도 효율적으로 사용할 수 있는 방식입니다.
2-3. 트래픽 많은 서비스용: dynamic 모드
API 서버나 방문자가 많은 서비스라면 dynamic 모드로 고정된 수의 프로세스를 유지하며 빠르게 요청을 처리하도록 구성하는 것이 좋습니다.
pm = dynamic pm.max_children = 80 pm.start_servers = 8 pm.min_spare_servers = 8 pm.max_spare_servers = 20 pm.max_requests = 500
max_children은 동시에 처리 가능한 최대 요청 수에 가까운 값으로 설정해야 합니다. 너무 작으면 대기열이 길어지고, 너무 크면 메모리 부족 문제가 발생할 수 있으니 서버 RAM과 실제 트래픽을 고려해 조정합니다.
3. MariaDB 기본 성능 튜닝: InnoDB 중심
3-1. 설정 파일 위치와 InnoDB 기본 옵션
MariaDB는 대부분 InnoDB 스토리지 엔진을 사용합니다. InnoDB 버퍼 풀, 로그 파일 크기, 플러시 방식 등은 성능에 직접적인 영향을 미치므로 반드시 조정해야 합니다.
vi /etc/my.cnf.d/server.cnf ; 또는 vi /etc/my.cnf
아래는 8GB RAM 서버를 기준으로 한 실전 예시 설정입니다.
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # 기본 버퍼 설정 innodb_buffer_pool_size = 2G innodb_log_file_size = 512M innodb_log_buffer_size = 32M # InnoDB 성능 관련 innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit = 1 innodb_file_per_table = 1 # 스레드 및 테이블 캐시 thread_cache_size = 100 table_open_cache = 4096 max_connections = 200 # Query Cache 비활성화 (MariaDB 10.x에서는 비권장) query_cache_type = 0 query_cache_size = 0 # Slow Query 로그 slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 1
innodb_buffer_pool_size는 InnoDB 데이터와 인덱스를 캐싱하는 영역으로, 전체 RAM의 약 1/3 정도를 배정하는 것이 일반적인 기준입니다. query_cache는 최신 버전에서는 오히려 병목이 되기 쉬워 비활성화하는 것을 권장합니다.
4. RAM 용량별 권장 버퍼 값
4-1. 서버 메모리 크기에 따른 추천값
MariaDB 설정은 서버 메모리 용량에 맞추어 조정해야 합니다. 아래는 단일 DB 서버 또는 웹·DB 겸용 서버에서 사용할 수 있는 대략적인 가이드입니다.
# 4GB RAM 서버 innodb_buffer_pool_size = 1G max_connections = 150 # 8GB RAM 서버 innodb_buffer_pool_size = 2G max_connections = 200 # 16GB RAM 서버 innodb_buffer_pool_size = 4G max_connections = 300
버퍼 풀을 너무 크게 잡으면 OS와 다른 프로세스가 사용할 메모리가 부족해져 스왑이 발생할 수 있으므로 여유를 두는 것이 중요합니다.
5. 성능 분석을 위한 Slow Query 로그와 인덱스 점검
5-1. Slow Query 로그로 병목 쿼리 찾기
DB가 느려졌을 때 단순히 버퍼만 키우는 것으로는 한계가 있습니다. 실제로 오래 걸리는 쿼리를 찾아서 인덱스를 추가하거나 쿼리 구조를 개선하는 것이 근본적인 해결책입니다.
slow_query_log = 1 slow_query_log_file = /var/log/mysql-slow.log long_query_time = 1
long_query_time을 1초 정도로 맞추면 실제 서비스에서 체감될 수 있는 느린 쿼리들을 쉽게 찾을 수 있습니다.
5-2. 인덱스 및 실행계획 확인
해당 쿼리가 적절한 인덱스를 사용하고 있는지 확인하려면 EXPLAIN을 활용합니다.
SHOW INDEX FROM 테이블명; EXPLAIN SELECT * FROM 테이블명 WHERE 컬럼 = '값';
type, key, rows 등의 항목을 확인하여 풀 스캔 여부와 인덱스 사용 상황을 점검하고, 필요 시 추가 인덱스를 생성해야 합니다.
6. PHP + MariaDB 튜닝 요약 체크리스트
6-1. 실제 운영 환경에 바로 적용 가능한 설정 모음
아래 항목들은 Rocky Linux 기반 PHP + MariaDB 웹서버에서 체감 성능을 크게 개선해 주는 핵심 튜닝 포인트입니다.
# PHP 설정 memory_limit, max_execution_time, post_max_size, upload_max_filesize 조정 date.timezone = Asia/Seoul OPcache 활성화 및 opcache.memory_consumption, max_accelerated_files 최적화 # PHP-FPM pm = ondemand 또는 dynamic 선택 pm.max_children, start_servers, max_spare_servers 값을 트래픽에 맞게 조정 # MariaDB innodb_buffer_pool_size = RAM의 약 1/3 innodb_file_per_table = 1 innodb_flush_method = O_DIRECT max_connections = 서버 규모에 맞게 설정 query_cache_type = 0 (비활성화) slow_query_log로 느린 쿼리 확인 및 인덱스 튜닝
위 설정을 기반으로 서비스 특성과 트래픽 패턴에 맞게 수치를 조금씩 조정해 나가면, Rocky Linux 서버에서 PHP와 MariaDB를 사용하는 대부분의 웹서비스에서 안정적인 성능과 충분한 처리량을 확보할 수 있습니다.