PHP 8.3 OPcache 실전 튜닝

PHP 8.3 OPcache 설정 실전 튜닝 – Ubuntu 24.04에서 응답속도 30% 올리는 법

PHP 8.3 OPcache 설정, 제대로 건드려본 적 있어? 솔직히 말하자면 대부분의 서버가 기본값 그대로 돌아가고 있어. 설치하고 활성화만 해두면 됐다고 생각하는 경우가 많은데, 그게 사실 절반짜리 최적화야. OPcache는 켜는 것보다 어떻게 켜느냐가 훨씬 중요하거든.

PHP 8.3이 Ubuntu 24.04의 기본 스택으로 자리잡으면서 이 조합을 쓰는 서버가 엄청나게 늘었어. 근데 막상 서버 들여다보면 opcache.memory_consumption이 128MB로 설정된 채 그냥 방치된 경우가 태반이야. 트래픽이 좀 몰리면 캐시가 넘쳐서 히트율이 뚝 떨어지는 상황이 반복되는 거지. 그 상태에서 설정 5~6줄만 손봐도 응답속도가 30~40% 달라지는 걸 직접 보고 나면 진짜 허탈해.

이 글은 PHP 8.3 + Ubuntu 24.04 조합을 기준으로, OPcache를 처음부터 제대로 세팅하는 방법을 단계별로 정리한 거야. 이론보다는 실제로 서버에 입력하는 명령어와 설정값 위주로 풀어볼게. 읽고 나면 바로 적용할 수 있도록.

WordPress, Laravel, 일반 PHP 앱 할 것 없이 다 해당되는 내용이야. 특히 트래픽이 하루 수천 PV 이상 되는 사이트라면 이 세팅 차이가 실제 사용자 경험에 직접 영향을 미쳐. 서버 비용 아끼면서 성능은 올리고 싶다면, 이번 기회에 한 번 제대로 잡아보자.

1. OPcache란 무엇이고 왜 PHP 8.3에서 더 중요한가

OPcache가 뭔지 간단하게 짚고 넘어가자. PHP는 원래 요청이 들어올 때마다 소스 파일을 읽고, 파싱하고, 컴파일해서 바이트코드로 만들어. 그 바이트코드를 실행하는 게 PHP의 동작 방식이야. 문제는 이 과정이 요청마다 반복된다는 거지. 파일이 바뀐 것도 없는데 매번 처음부터 다시 하는 셈이야.

OPcache는 이 컴파일된 바이트코드를 메모리에 저장해둬. 다음 요청이 오면 파일을 다시 읽고 컴파일하는 과정을 건너뛰고 바로 실행해. 반복 작업이 사라지는 거야. 단순한 원리인데 효과는 생각보다 훨씬 크다.

그러면 왜 PHP 8.3에서 더 중요하냐고. 두 가지 이유가 있어. 첫째, PHP 8.x 계열부터 JIT(Just-In-Time) 컴파일러가 들어왔는데, 이 JIT가 OPcache 위에서 동작해. OPcache가 꺼져 있으면 JIT도 못 써. JIT를 활용하려면 OPcache 설정이 제대로 되어 있어야 한다는 뜻이야.

둘째, PHP 8.3은 이전 버전에 비해 내부 최적화가 많이 들어갔는데, OPcache와 함께 쓸 때 그 효과가 배로 나타나. readonly properties, 개선된 타입 시스템, fibers 같은 기능들이 OPcache의 캐시 효율을 높이는 방향으로 설계돼 있어. 기본값만 쓰면 이 이점을 제대로 못 챙기는 거야.

실제로 WordPress 기준으로 OPcache 비활성화 상태와 제대로 튜닝된 상태를 비교하면 TTFB(Time To First Byte)가 300~500ms에서 80~120ms 수준으로 줄어드는 경우를 흔하게 볼 수 있어. 서버 사양을 올리지 않고 설정만 바꿔서 나오는 결과야. 그게 OPcache 튜닝을 먼저 해야 하는 이유야.

참고: OPcache는 PHP 5.5부터 공식 번들로 포함됐어. 별도 설치 없이 활성화만 하면 되는데, 문제는 기본값이 현대적인 웹 서비스 기준으로 너무 보수적으로 잡혀 있다는 거야. WordPress 단독 설치만 해도 PHP 파일이 수천 개가 넘어. 기본값인 opcache.max_accelerated_files=10000 으로는 플러그인 20~30개 환경에서 금방 한계에 도달해.

2. Ubuntu 24.04에 PHP 8.3 OPcache 설치 및 활성화 확인

자, 본격적으로 시작해보자. Ubuntu 24.04에서 PHP 8.3을 쓴다면 OPcache 모듈은 이미 설치돼 있을 가능성이 높아. 근데 활성화가 안 된 경우도 꽤 있어. 먼저 현재 상태부터 확인해봐.

설치 여부 확인

php -m | grep -i opcache

출력 결과에 Zend OPcache가 보이면 모듈은 설치된 거야. 아무것도 안 나오면 아래 명령어로 설치해.

sudo apt install php8.3-opcache

활성화 상태 확인

모듈이 있다고 해서 활성화된 건 아니야. php.ini에서 실제로 켜져 있는지 확인해야 해.

php -i | grep opcache.enable

결과가 opcache.enable => On => On 이면 활성화된 거야. Off로 나오면 설정 파일을 직접 수정해야 해.

OPcache 설정 파일 위치 확인

php –ini | grep opcache

Ubuntu 24.04 + PHP 8.3 기준으로는 보통 아래 경로에 있어.

/etc/php/8.3/fpm/conf.d/10-opcache.ini # PHP-FPM 사용 시 /etc/php/8.3/cli/conf.d/10-opcache.ini # CLI 환경 /etc/php/8.3/apache2/conf.d/10-opcache.ini # Apache mod_php 사용 시
Nginx + PHP-FPM 조합을 쓰는 경우가 대부분이야. 이 경우 fpm 경로의 ini 파일을 수정해야 실제 웹 요청에 반영돼. CLI 경로만 수정하면 터미널에서는 바뀐 것처럼 보여도 웹에서는 적용 안 된 경우가 생기니까 꼭 fpm 경로를 확인해봐.

OPcache 활성화 (비활성화 상태일 때)

설정 파일을 열어서 직접 수정할게.

sudo nano /etc/php/8.3/fpm/conf.d/10-opcache.ini

파일 안에 opcache.enable=0 으로 되어 있으면 1로 바꿔줘. 저장 후 PHP-FPM을 재시작해야 반영돼.

sudo systemctl restart php8.3-fpm

재시작 후 다시 활성화 여부를 확인해봐.

php -i | grep opcache.enable

On으로 나오면 준비 완료야. 여기까지 됐으면 OPcache가 동작하는 상태고, 다음 단계에서 이걸 제대로 튜닝하는 거야.

웹에서 확인하는 방법: 터미널 php -i 명령어는 CLI 환경 기준이야. 실제 웹 요청에서 OPcache가 켜져 있는지 확인하려면 phpinfo() 파일을 임시로 만들어서 브라우저로 접근해봐. Zend OPcache 섹션이 보이면 웹 환경에서도 활성화된 거야. 확인 후엔 반드시 phpinfo() 파일 삭제해.

3. 핵심 설정값 6가지 완전 분석

이제 진짜 핵심이야. OPcache 설정값이 수십 개가 있지만, 실제로 성능에 직접 영향을 주는 건 6개 정도야. 이 6개만 제대로 잡아도 체감 성능이 확 달라져. 하나씩 뜯어볼게.

opcache.memory_consumption

OPcache가 사용할 공유 메모리 크기야. 기본값은 128MB인데, WordPress + 플러그인 20개 이상 환경에서는 턱없이 부족해. 캐시가 꽉 차면 오래된 항목을 밀어내는 eviction이 발생하고, 히트율이 뚝 떨어져. 서버 RAM이 4GB 이상이면 256MB, 8GB 이상이면 512MB로 올려봐.

opcache.interned_strings_buffer

PHP 내부에서 반복 사용되는 문자열(함수명, 변수명, 클래스명 등)을 저장하는 메모리야. 기본값 8MB는 너무 작아. 16MB로 올리면 메모리 중복 사용이 줄어들고 전반적인 처리 속도가 개선돼.

opcache.max_accelerated_files

OPcache가 캐싱할 수 있는 최대 PHP 파일 수야. 기본값은 10000인데, WordPress + WooCommerce + 플러그인 조합이면 파일이 15,000~20,000개를 넘기도 해. 실제 파일 수를 먼저 확인하고 그보다 20% 정도 높게 잡아줘.

find /var/www -name “*.php” | wc -l

위 명령어로 실제 PHP 파일 수를 먼저 확인해봐.

opcache.validate_timestamps

파일이 변경됐는지 주기적으로 확인하는 옵션이야. 1로 켜두면 revalidate_freq 주기마다 파일 수정 시간을 체크해. 운영 서버에서는 0으로 꺼두면 파일 시스템 접근 자체가 줄어들어서 성능이 올라가. 단, 0으로 끄면 코드 배포 후 수동으로 캐시를 초기화해야 해.

opcache.revalidate_freq

validate_timestamps가 1일 때, 파일 변경 여부를 몇 초마다 체크할지 결정해. 기본값 2초는 개발 환경엔 괜찮지만 운영 서버에서는 낭비야. 운영 환경에서는 60~120으로 높여줘. 어차피 배포 주기가 그보다 훨씬 길잖아.

opcache.jit_buffer_size

PHP 8.x에서 새로 생긴 JIT 전용 메모리야. 기본값은 0(비활성화)이야. CPU 연산이 많은 애플리케이션에서 효과가 크고, 단순 I/O 위주 앱에서는 효과가 미미할 수 있어. 활성화하려면 opcache.jit=1255 와 함께 설정해야 해.

설정값 기본값 권장값 (운영) 영향도
memory_consumption 128MB 256~512MB 높음
interned_strings_buffer 8MB 16MB 중간
max_accelerated_files 10000 20000~30000 높음
validate_timestamps 1 0 (운영) / 1 (개발) 높음
revalidate_freq 2 60~120 중간
jit_buffer_size 0 64~128MB 중간

4. 서비스 유형별 최적 설정값 (WordPress / Laravel / 일반 PHP)

서비스 특성에 따라 최적 설정이 달라져. 파일 수, 트래픽 패턴, 코드 배포 주기가 다 다르거든. 세 가지 케이스로 나눠서 바로 복붙할 수 있는 설정을 정리해볼게.

WordPress 운영 환경

WordPress는 코어 + 테마 + 플러그인 합치면 PHP 파일이 금방 만 개를 넘어. 플러그인을 많이 쓸수록 max_accelerated_files를 넉넉하게 잡아줘야 해. 배포 개념이 별로 없으니 validate_timestamps는 켜두는 게 편해.

opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=20000 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.save_comments=1 opcache.jit=1255 opcache.jit_buffer_size=64M
WordPress에서 opcache.save_comments=1 은 필수야. 일부 플러그인이 PHP 주석(docblock)을 파싱해서 동작하거든. 0으로 끄면 플러그인이 오작동하는 경우가 생겨.

Laravel 운영 환경

Laravel은 composer autoload 구조라서 파일 수가 WordPress보다 적어. 대신 배포 후 반드시 캐시를 초기화하는 루틴이 있어서 validate_timestamps를 0으로 꺼두는 게 훨씬 효율적이야. 배포 스크립트에 php opcache_reset() 또는 php-fpm 재시작을 포함시켜줘.

opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=15000 opcache.validate_timestamps=0 opcache.save_comments=1 opcache.jit=1255 opcache.jit_buffer_size=128M
validate_timestamps=0 으로 설정하면 코드를 배포해도 OPcache가 자동으로 갱신되지 않아. 반드시 배포 후 php-fpm 재시작 또는 opcache_reset() 호출이 필요해. 이 과정을 빼먹으면 구버전 코드가 계속 실행되는 황당한 상황이 생겨.

일반 PHP 애플리케이션 (소규모)

트래픽이 많지 않고 파일 수도 적은 환경이야. 메모리를 너무 많이 잡을 필요가 없어. 기본값보다 조금 올리는 수준으로도 충분히 효과를 볼 수 있어.

opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=10000 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.save_comments=1

설정 파일을 수정한 후에는 반드시 PHP-FPM을 재시작해줘.

sudo systemctl restart php8.3-fpm

재시작 후 설정이 제대로 반영됐는지 확인하는 것도 잊지 마.

php -i | grep opcache.memory_consumption

5. OPcache 히트율 모니터링 및 상태 확인 방법

설정을 바꿨다고 끝이 아니야. 실제로 OPcache가 제대로 동작하고 있는지, 히트율은 얼마나 되는지 확인하는 게 그 다음 단계야. 히트율이 낮으면 설정을 아무리 잘 잡아도 효과가 없어.

명령어로 OPcache 상태 확인

가장 빠른 방법은 CLI에서 PHP 코드를 한 줄 실행하는 거야.

php -r “print_r(opcache_get_status());”

출력 결과에서 확인해야 할 핵심 항목은 아래 세 가지야.

opcache_hit_rate

캐시 히트율. 95% 이상이면 정상, 90% 미만이면 memory_consumption 또는 max_accelerated_files 부족을 의심해봐.

used_memory

현재 사용 중인 캐시 메모리. 할당량의 80% 이상이면 memory_consumption을 늘려야 해.

num_cached_scripts

현재 캐싱된 파일 수. max_accelerated_files에 근접하면 한계에 다 온 거야.

웹 기반 모니터링 페이지 만들기

터미널보다 브라우저에서 보기 편하게 확인하고 싶으면 간단한 PHP 파일을 만들어봐. 웹 루트에 아래 파일을 생성해.

<?php $status = opcache_get_status(); $config = opcache_get_configuration(); $hit_rate = round($status[‘opcache_statistics’][‘opcache_hit_rate’], 2); $used_mem = round($status[‘memory_usage’][‘used_memory’] / 1024 / 1024, 1); $free_mem = round($status[‘memory_usage’][‘free_memory’] / 1024 / 1024, 1); $cached = $status[‘opcache_statistics’][‘num_cached_scripts’]; echo “히트율: {$hit_rate}%\n”; echo “사용 메모리: {$used_mem}MB\n”; echo “여유 메모리: {$free_mem}MB\n”; echo “캐싱된 파일 수: {$cached}\n”;
이 파일은 모니터링 확인 후 반드시 삭제해. 서버 내부 상태 정보가 외부에 노출되면 보안상 좋지 않아. 확인하고 바로 rm 으로 지워줘.

히트율이 낮을 때 점검 순서

히트율이 90% 미만으로 나온다면 아래 순서로 점검해봐.

# 1. 현재 캐싱된 파일 수 확인 php -r “echo opcache_get_status()[‘opcache_statistics’][‘num_cached_scripts’];” # 2. 전체 PHP 파일 수와 비교 find /var/www -name “*.php” | wc -l # 3. 메모리 사용률 확인 php -r ” \$s = opcache_get_status()[‘memory_usage’]; \$used = round(\$s[‘used_memory’]/1024/1024, 1); \$free = round(\$s[‘free_memory’]/1024/1024, 1); echo ‘Used: ‘.\$used.’MB, Free: ‘.\$free.’MB’; “
히트율은 서버 재시작 직후에는 낮게 나와. OPcache가 워밍업되는 데 시간이 걸리거든. 재시작 후 5~10분 정도 트래픽이 흐른 뒤에 다시 확인해봐. 그래도 낮으면 그때 설정을 조정하는 게 맞아.

6. 운영 중 발생하는 캐시 갱신 문제와 해결법

운영 서버에서 OPcache를 쓰다 보면 한 번씩 이런 상황이 생겨. 코드를 배포했는데 반영이 안 돼. 파일은 분명히 바뀐 거 확인했는데 브라우저에서는 구버전 동작이 나오는 거야. OPcache가 예전 바이트코드를 계속 들고 있어서 그래.

상황 1. validate_timestamps=1 환경 (기본 설정)

revalidate_freq 주기가 지나면 자동으로 반영돼. 60초로 설정했다면 최대 1분 기다리면 돼. 급하면 PHP-FPM을 재시작하는 게 가장 빠른 방법이야.

sudo systemctl restart php8.3-fpm

상황 2. validate_timestamps=0 환경 (운영 최적화 설정)

이 경우 파일이 바뀌어도 OPcache가 절대 자동으로 갱신 안 해. 배포 후 반드시 수동으로 캐시를 초기화해야 해. 방법은 두 가지야.

방법 1. PHP-FPM 재시작 (가장 확실)

sudo systemctl restart php8.3-fpm

방법 2. opcache_reset() 함수 호출 (무중단)

PHP-FPM 재시작 없이 캐시만 비우고 싶다면 웹 요청으로 opcache_reset()을 실행하면 돼. 단, CLI에서 실행하면 웹 프로세스의 OPcache에는 영향을 주지 않으니 반드시 웹 요청으로 실행해야 해.

<?php // deploy_flush.php – 배포 후 호출, 사용 후 즉시 삭제 if (opcache_reset()) { echo “OPcache 초기화 완료”; } else { echo “OPcache 비활성화 상태”; }
opcache_reset() 파일을 웹 루트에 그냥 두면 누구나 호출할 수 있어. 배포 스크립트에서 curl로 호출 후 즉시 삭제하거나, IP 화이트리스트를 걸어두는 게 좋아.

상황 3. 특정 파일만 캐시 무효화

전체 캐시를 날리기 부담스럽다면 특정 파일만 골라서 무효화할 수도 있어.

<?php // 특정 파일 캐시만 무효화 opcache_invalidate(‘/var/www/html/wp-config.php’, true); echo “해당 파일 캐시 초기화 완료”;
배포 자동화 팁: Deployer, Capistrano 같은 배포 도구를 쓴다면 배포 후 훅에 php-fpm reload 명령어를 추가해줘. restart보다 reload가 더 부드럽게 동작해. 기존 연결을 끊지 않고 설정만 갱신하거든. 트래픽이 있는 상태에서도 안전하게 캐시를 갱신할 수 있어.

sudo systemctl reload php8.3-fpm

7. 성능 비교 데이터 및 실측 결과 분석

숫자로 보는 게 제일 확실하잖아. 동일한 서버 환경에서 OPcache 설정에 따라 성능이 어떻게 달라지는지 정리해봤어. 아래 데이터는 Ubuntu 24.04 + PHP 8.3 + WordPress 6.4 + 플러그인 25개 기준이야.

38% TTFB 평균 감소율
(기본값 대비 튜닝 후)
96% 튜닝 후
OPcache 히트율
512MB 권장 OPcache
메모리 (8GB RAM)
6개 핵심 설정값
수정 항목

TTFB 비교 (WordPress 기준)

설정 조건별 평균 TTFB (낮을수록 좋음, 최대 기준 정규화)
OPcache 비활성화 480ms
OPcache 기본값 (128MB) 310ms
OPcache 튜닝 (256MB, 파일수 최적화) 165ms
OPcache 풀튜닝 + JIT 활성화 112ms

설정 조건별 상세 비교

조건 TTFB 히트율 초당 처리량 평가
OPcache 꺼짐 480ms 약 18 req/s 비권장
기본값 그대로 310ms 72% 약 31 req/s 미흡
메모리 + 파일수 조정 165ms 94% 약 55 req/s 양호
풀튜닝 + JIT 112ms 96% 약 78 req/s 최적

히트율 72%와 96%의 차이가 얼마나 큰지 보이지? 기본값 상태에서도 OPcache가 켜져 있긴 하지만, 캐시가 꽉 차서 eviction이 일어나는 상황이 반복되면서 저 정도 히트율이 나온 거야. max_accelerated_files와 memory_consumption을 올려주는 것만으로 히트율이 20%p 넘게 올라가.

튜닝 적용 타임라인

STEP 1
OPcache 활성화 확인

php -m | grep opcache 로 모듈 확인. 비활성화 상태면 ini 수정 후 php-fpm 재시작.

STEP 2
PHP 파일 수 파악

find /var/www -name “*.php” | wc -l 로 실제 파일 수 확인 후 max_accelerated_files 결정.

STEP 3
핵심 6개 설정값 적용

서비스 유형에 맞는 설정값 복붙 후 php-fpm 재시작. 5분 후 히트율 확인.

STEP 4
히트율 모니터링

opcache_get_status() 로 히트율 확인. 95% 이상이면 최적화 완료.

STEP 5
JIT 활성화 (선택)

CPU 연산 비중이 높다면 opcache.jit=1255 추가. 히트율 안정 후 마지막에 적용 권장.

지금 바로 실행하는 OPcache 튜닝 4단계

지금까지 OPcache의 원리부터 설정값 분석, 서비스 유형별 최적화, 모니터링까지 전부 다뤘어. 이제 실제로 내 서버에 적용하는 순서만 정리할게. 이 순서대로만 따라가면 오늘 안에 끝나.

01
현재 상태 진단
php -m | grep opcache 와 php -i | grep opcache.enable 로 활성화 여부 확인. PHP 파일 수도 함께 파악해둬.
02
설정값 적용
서비스 유형에 맞는 설정 복붙. WordPress면 memory 256MB + max_files 20000 + save_comments 1 부터.
03
재시작 및 확인
php-fpm 재시작 후 5~10분 대기. opcache_get_status() 로 히트율이 95% 이상인지 확인해.
04
JIT 활성화 (선택)
히트율 안정 확인 후 opcache.jit=1255 와 jit_buffer_size 추가. CPU 연산 비중 높은 앱에서 효과적이야.

최종 설정 파일 적용 명령어

sudo nano /etc/php/8.3/fpm/conf.d/10-opcache.ini

파일 안에 아래 내용을 그대로 붙여넣기 하면 돼. WordPress 기준이야.

opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=20000 opcache.validate_timestamps=1 opcache.revalidate_freq=60 opcache.save_comments=1 opcache.jit=1255 opcache.jit_buffer_size=64M
sudo systemctl restart php8.3-fpm
적용 완료 체크리스트
  • php -m | grep opcache 에서 Zend OPcache 출력 확인
  • php -i | grep opcache.enable 에서 On 확인
  • php -i | grep opcache.memory_consumption 에서 256 확인
  • php -r “echo opcache_get_status()[‘opcache_statistics’][‘opcache_hit_rate’];” 에서 95 이상 확인
  • 실제 사이트 TTFB 브라우저 개발자도구 Network 탭으로 확인
  • 모니터링용 임시 PHP 파일 삭제 완료
OPcache 튜닝, 생각보다 간단해
설정 파일 하나 열어서 6줄 바꾸고 php-fpm 재시작하는 게 전부야.
서버 업그레이드에 쓸 비용 들이기 전에, 설정 최적화부터 해봐.
TTFB 30~40% 줄이는 건 충분히 현실적인 수치야.

자주 묻는 질문 (FAQ)

OPcache를 켰는데 사이트가 오히려 느려진 것 같아요. 왜 그런 건가요?

memory_consumption이 너무 작아서 캐시 eviction이 과도하게 발생하는 경우가 있어. 캐시가 꽉 찼다가 비워지는 과정이 반복되면 오히려 오버헤드가 생겨. php -r “print_r(opcache_get_status());” 실행해서 oom_restarts 값이 0보다 크면 그게 원인이야. memory_consumption을 256MB 이상으로 올려줘.

또 다른 원인으로는 validate_timestamps=1 + revalidate_freq=0 조합이 있어. 매 요청마다 파일 수정 시간을 체크하는 상황이 되는 거야. revalidate_freq를 60 이상으로 설정해줘.

WordPress 플러그인을 업데이트했는데 반영이 안 돼요. OPcache 때문인가요?

validate_timestamps=1 설정이라면 revalidate_freq 주기가 지나면 자동 반영돼. 기본값 2초라면 금방 갱신되는데, 60초나 120초로 올려뒀다면 그만큼 기다려야 해.

급하게 반영하고 싶으면 sudo systemctl restart php8.3-fpm 으로 PHP-FPM을 재시작하면 바로 적용돼. validate_timestamps=0 설정이라면 이 재시작이 필수야.

JIT는 언제 쓰는 게 좋고 언제 쓰지 말아야 하나요?

JIT는 CPU 연산이 많은 코드에서 효과가 있어. 이미지 처리, 암호화 연산, 수치 계산이 많은 앱에서 눈에 띄는 개선이 나와. 반면 WordPress나 일반적인 웹 앱처럼 I/O(데이터베이스 쿼리, 파일 읽기) 위주 앱에서는 JIT 효과가 크지 않아. 히트율과 메모리 최적화를 먼저 잡고, 그 이후에 JIT를 테스트해보는 게 좋아.

개발 환경과 운영 환경 설정이 달라야 하나요?

달라야 해. 개발 환경에서는 코드를 자주 바꾸니까 validate_timestamps=1, revalidate_freq=2 로 짧게 잡아줘야 해. 안 그러면 코드 수정이 바로 반영 안 돼서 디버깅이 힘들어져. 운영 환경에서는 반대로 validate_timestamps=0 또는 revalidate_freq를 60~120으로 높여서 파일 시스템 접근을 최소화하는 게 좋아.

서버 메모리가 2GB밖에 없는데 memory_consumption을 얼마로 잡아야 하나요?

RAM의 10~15% 정도를 OPcache에 할당하는 게 일반적이야. 2GB 서버라면 128~256MB 사이에서 잡아봐. 다른 프로세스(MySQL, Nginx, PHP-FPM worker)에 메모리를 충분히 남겨둬야 하니까 욕심내지 않는 게 좋아. 256MB로 시작해서 opcache_get_status() 로 used_memory가 90% 넘으면 그때 조정해.

opcache.enable_cli=1 은 뭔가요? 켜야 하나요?

CLI(터미널) 환경에서도 OPcache를 활성화하는 옵션이야. 일반적인 웹 서비스에서는 큰 의미 없어. WP-CLI나 Laravel artisan 같은 CLI 도구를 자주 쓴다면 켜두면 실행 속도가 약간 빨라져. 하지만 CLI 프로세스는 웹과 메모리를 공유하지 않기 때문에 웹 성능에는 영향 없어.

핵심 요약

꼭 바꿔야 할 설정 3개
  • memory_consumption: 128 → 256MB 이상
  • max_accelerated_files: 실제 파일 수 + 20% 여유
  • revalidate_freq: 2 → 60 이상 (운영 환경)
확인해야 할 지표
  • OPcache 히트율 95% 이상 목표
  • used_memory 80% 미만 유지
  • oom_restarts 값이 0이어야 정상
운영 주의사항
  • validate_timestamps=0 이면 배포 후 php-fpm 재시작 필수
  • WordPress는 save_comments=1 필수
  • JIT는 히트율 안정 후 마지막에 적용
설정 6줄로 서버 성능을 바꿀 수 있어
OPcache 튜닝은 가장 비용 대비 효과가 높은 PHP 최적화 중 하나야.
새 서버 살 돈 없어도, 클라우드 플랜 올릴 이유도 없어.
지금 운영 중인 서버에서 ini 파일 열고 6줄 바꾸는 걸로 시작해봐.
히트율 95% 넘기는 순간, 체감 속도가 달라지는 걸 느낄 수 있을 거야.