WP-Cron(wp-cron.php): 비활성화 및 시스템 크론 설정 | 워드프레스 성능 최적화
ℹ️이 콘텐츠에는 광고가 포함되어,판매 발생 시 수익이 발생합니다.(네이버 쇼핑 커넥트, 아마존 어필리에이트, 애드센스 등)워드프레스에서 Cron 작업은 특정 시간이나 날짜에 예약된 작업을 자동으로 수행하는 기능입니다. 이 작업은 wp-cron.php 파일을 통해 실행되며, 워드프레스는 페이지가 로드 될 때마다 이 파일을 호출하여 예약된 작업을 처리합니다. 이러한 방식은 간편하지만, 트래픽이 많은 사이트에서는 성능 저하를 유발할 수 있습니다.
Ⅰ. WP-Cron의 실행 과정과 성능 문제
워드프레스는 리눅스 서버의 전통적인 Cron 시스템을 사용하지 않고 자체적인 Cron 기능인 WP-Cron을 제공합니다. WP-Cron은 wp-cron.php 파일을 통해 작동하며, ⓐ사용자가 사이트를 방문할 때마다 예약된 작업이 있는지 확인하고 이를 실행하며, ⓑRankMath와 WP Rocke와 같은 플러그인 등은 자체적으로 예약된 주기적인 작업을 실행합니다.
반대로, 트래픽이 많은 사이트에서는 wp-cron.php가 지나치게 자주 호출되어 서버에 과부하를 줄 수 있습니다. 특히, 동시에 여러 사용자가 접속할 경우 중복된 크론 작업이 실행되며, 이는 CPU 사용률 증가, 응답 지연, 페이지 로딩 속도 저하 등의 문제로 이어질 수 있습니다.
이러한 WP-Cron의 구조적 한계는 워드프레스의 성능을 저하 시킬 수 있으며, 특히 고성능이 요구되는 사이트나 쇼핑몰, 뉴스 포털 등에서는 치명적인 병목 현상을 유발할 수 있습니다.
🔄 WP-Cron의 실행 방식 및 구조
Ⅱ. 워드프레스 성능 최적화
워드프레스 성능 최적화 방식에는 여러가지가 있습니다. 캐싱 및 프론트엔드와 데이터베이스 등의 최적화 후 WP-Cron의 설정을 통한 개선 방법이 있습니다.
WordPress
 └─ 성능 최적화
     ├─ 캐싱 설정
     │   ├─ 브라우저 캐싱
     │   ├─ 객체 캐싱
     │   ├─ 페이지 캐싱
     │   └─ 캐싱 플러그인 (WP Rocket, W3 Total Cache 등)
     ├─ 프론트엔드 최적화
     │   ├─ 이미지 압축 및 포맷(WebP 등)
     │   ├─ Lazy Load 적용
     │   ├─ CSS/JS 압축 및 병합
     │   └─ 관련 플러그인 (Autoptimize, ShortPixel 등)
     ├─ 데이터베이스 정리
     │   ├─ 리비전/스팸/임시 테이블 제거
     │   └─ DB 최적화 플러그인 (WP-Optimize 등)
     └─📑WP-Cron 설정
        └─ WP-Cron (wp-cron.php)
            ├─ ⓐ 사용자 방문 시 예약 작업 확인
            ├─ ⓑ 플러그인의 주기적 작업 (Rank Math, WP Rocket 등)
            ├─ WP-Cron의 성능 문제
            │   ├─ 트래픽 의존성
            │   ├─ 과도한 호출로 인한 서버 과부하
            │   └─ 중복 실행 및 병목 현상
            └─ WP-Cron 실행 방식
                ├─ 트래픽 기반 가상 스케줄러
                ├─ 예약 작업의 실행 흐름
                └─ 시간 기반이 아닌 방문 기반 실행워드프레스 페이지가 로드 될 때마다 예약된 이벤트가 확인되며, 플러그인의 주기적인 작업으로 비효율적인 WP-Cron을 효율적으로 활용할 필요가 있습니다.
1️⃣ WP-Cron 테스트
WP-CLI로 크론 작업을 확인했을 때 작동 중인 Cron이 실행되는 것을 확인할 수 있습니다. Rank Math및 WP Rocket 등의 플러그인이 예약된 작업을 하루 또는 분 단위로 실행되는 것이 확인됩니다.
2️⃣ WP-Cron 설정 방법
WP-Cron은 워드프레스의 예약 작업을 처리하는 가상 스케줄러로, 사용자의 방문 시 wp-cron.php가 실행됩니다. 하지만 트래픽 기반 실행은 불안정하고 과도한 호출로 서버 부하를 유발할 수 있어, 시스템 크론으로 보완하는 것이 일반적입니다. 
필요 시 wp-config.php에서 DISABLE_WP_CRON을 설정해 WP-Cron을 끄고, 리눅스 크론으로 정기 실행하는 방식이 추천됩니다.
| 
 항목 39763_f8969e-cf> | 
 WP-Cron 비활성화 + 시스템 크론 단독 실행 39763_c57744-d7> | 
|---|---|
| 
 설정 39763_a73c82-2b> | 
 WP-Cron을 끄고 시스템 크론에서 wp-cron.php를 실행 39763_8e4603-bf> | 
| 
 장점 39763_d12b8a-96> | 
 중복 실행이 없고 정확한 시간 기반 실행이 가능하며, 서버 부하가 적음 39763_a59e08-56> | 
| 
 단점 39763_15c73a-12> | 
 일부 플러그인 기능이 중단될 수 있고 설정 실수 시 작업 누락 위험 39763_558f76-59> | 
| 
 추천 상황 39763_16b762-d9> | 
 트래픽이 많고 예약 작업이 많은 사이트에 적합 39763_5a37e3-69> | 
하지만 ①번 방식은 WP Rocket과 같은 캐시 플러그인이 1분 마다 PreLoad로 기능으로 방문자가 웹페이지에 방문하기 전에 캐시를 미리 생성하는 기능이 비활성화 되는 단점이 있습니다.
⚙️ wp-config.php 파일 수정
WP_CRON을 비활성화 하는 방법으로 설정할 수 있습니다.
# WP_CROM 비활성화 
define( 'DISABLE_WP_CRON', true );WP_CRON_LOCK_TIMEOUT은 WP-Cron이 실행 중일 때 다른 실행 시도를 막아주는 “시간 기반 잠금 장치”입니다.
# 5분은 300으로 , 60분 마다 실행 3600
define('WP_CRON_LOCK_TIMEOUT', 300);이와 같은 이유로 wp-config.php 파일에 WP-Cron을 비활성화 한 후에 System Cron 작업을 추가하는 방법보다는 System Cron을 추가하는 방법을 권장하며, 현재 관리 중인 서버에도 이 방법으로 설정했습니다.
⚙️ 리눅스 서버에 시스템 크론 활성화[기본]
개별 도메인으로 활성화 할 수 있습니다.
# 5분마다 실행
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# 30분마다 실행
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# 1시간마다 실행
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# 하루 1번 실행
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1# 서버가 로컬 서버일 경우 
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# 30분마다 실행
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# 1시간마다 실행
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# 하루 1번 실행
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1WP_CLI를 설치 했을 경우 원하는 시간대로 하나만 설정할 수 있습니다. ▼
# 5분마다 실행
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# 30분마다 실행
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# 1시간마다 실행
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# 하루 1번 실행
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet⚙️ WP-CLi 및 시스템 크론 1분 및 크론 작업 중복 방지
기존의 WP_CRON은 작업량이 많으면 그냥 무시(건너뜀)되고 이후에 재 실행 되는 구조입니다. 기존의 WP-Corn을 끄고 예약 작업을 5분 잠금 유지로 설정하여 시스템 크론에 설정한 중복 방지를 막습니다.
define('DISABLE_WP_CRON', true);         // WP-Cron 자동 실행 끔
define('WP_CRON_LOCK_TIMEOUT', 300);     // 대기 안 함 → 무시(건너뜀) 예약 작업 실행 시 5분 잠금 유지
/* That's all, stop editing! Happy publishing. */시스템 크론 flock -n 옵션을 추가로 설정하여, 시스템 크론에선 즉시 종료로 적용합니다.
# wp cron 설정 :  flock -n → 대기 안 함 → 즉시 종료
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet 위와 같이 설정한 조합의 결과는
- WP 내부 자동 실행은 꺼짐 → 방문자 수와 무관하게 예약 작업 실행
 - 시스템 크론이 1분마다 실행 시도 → 예약된 작업이 있으면 실행됨
 - 잠금이 걸리면 5분 동안 재실행 안 됨 → 중복 실행 방지(사실 상 WP_CRON_LOCK_TIMEOUT은 flock -n 설정으로 굳이 필요하지 않습니다.)
 중복 실행 방지로 실제 동작 흐름은
- 08:00 → 시스템 크론이 wp-cron.php 호출
 
- 예약 작업 A 실행됨 → 잠금 5분 설정
 - 08:01 → 시스템 크론 다시 호출
 
- 작업 A는 잠금 중 → 실행 안 됨
 - 08:02~08:04 → 동일
 
- 08:05 → 잠금 풀림 → 다음 예약 작업이 있으면 실행됨
 
WP가 자동으로 실행하지 않는 대신, 시스템이 책임지고 실행한다는 점. 그리고 WP_CRON_LOCK_TIMEOUT은 중복 실행을 막는 보조 안전장치로 작동한다는 것입니다.
| 
 항목 39763_0c3b1a-ea> | 
 WP_CRON_LOCK_TIMEOUT 39763_8f0501-04> | 
 flock -n 39763_0a9ad5-e9> | 
|---|---|---|
| 
 잠금 방식 39763_719dcb-e5> | 
 워드프레스 내부 39763_e1aa1e-b5> | 
 시스템 레벨 39763_678f3d-64> | 
| 
 잠금 위치 39763_ee3767-5d> | 
 DB 기반 wp_options의 doing_cron 39763_4188c0-99> | 
 시스템 파일 기반 ~/.wp_cron.lock 39763_da83b0-9e> | 
| 
 대기 여부 39763_0b7063-c6> | 
 ❌ 대기 안 함 → 건너뜀 39763_af693d-46> | 
 ❌ 대기 안 함 → 즉시 종료 39763_d0f254-5d> | 
| 
 중복 실행 방지 39763_09f1f3-53> | 
 ✅ 중복 실행 방지 39763_3d01eb-f9> | 
 ✅ 중복 실행 방지 39763_fc0112-52> | 
작업 완료 후 WP-CLI 명령어로 확인해 볼 수 있습니다. 기존처럼 크론이 잘 작동하는지 확인합니다.
wp cron event list