워드프레스는 포스팅의 예약 발행과 같은 스케줄링을 지원하는데, 이는 WP-cron이라는 스케줄러를 통해 처리된다. wp-cron은 매 페이지가 호출될 때마다 로드되어 예약된 작업이 있으면 이를 처리해주는 방식으로 작동한다. 다만 이렇게하면 포스트 발행을 예약한 시점에 접속이 없다면 스케줄러가 실행되지 않거나, 그외 플러그인과의 충돌이나 워드프레스 자체의 버그로 인해서 작업이 누락되는 경우도 발생한다고 한다.
리눅스 서버를 사용한다면 시스템의 cron을 사용해서 이 wp-cron의 실행을 대체할 수 있다. 이 글은 아마존 라이트세일 인스턴스 (Bitnami – wordpress 서버)에서 wp-cron을 끄고 시스템 자체의 cron을 실행하게 하는 방법이다.
wp-cron 비활성화하기
wp-cron을 비활성화하는 방법은 간단하다. wp-config.php 파일을 수정하여 WP-cron을 사용하지 않도록 설정해주면 된다. 다음 한 줄을 wp-config.php 파일에 추가해준다.
// wp-config.php
<?php
define("DISABLE_WP_CRON", true);
...
cron을 통해서 wp-cron 실행하기
그런 후 crontab -e
를 실행해서 다음 라인을 추가한다. 이 설정은 5분마다 실행되어 wget을 사용해서 wp-cron.php 파일에 직접 액세스하여 스케줄된 작업을 처리하게 한다. crontab -e
를 처음 실행하면 어떤 편집기를 사용할 것인지 물어보는데, 각자 취향에 맞춰서 하면 되겠다.
참고로 crontab 설정 방법은 여기를 참고하면 된다.
*/5 * * * * wget -q -O https://mywebsite.com/wp-cron.php > /dev/null 2>&1
이렇게 저장하면 작업 스케줄이 새로 만들어지고 매 시 정각, 5분, 10분, 15분.. 이렇게 5분 주기로 실행될 것이다. 아래 명령으로 시스템 로그를 확인하면 해당 명령이 잘 실행되는지를 체크할 수 있다.
grep "CRON" /var/log/syslog
wp-super cache를 사용한다면
워드프레스의 캐싱 플러그인인 wp super cache를 사용할 때 만약 preload mode를 사용한다면 커스텀 cron의 주기를 너무 길게 가져가지 않도록 주의해야 한다. preload mode는 전체 혹은 일부 포스트와 페이지를 정적 HTML 파일로 미리 만들어두고 서비스하는데, 이 때 지속적으로 대량의 페이지를 처리하면 시스템에 무리가 가기 때문에 한 번에 100개 페이지를 처리하고 약간의 시간을 둔 후 다시 100개를 처리하는 방식으로 작동한다. 이 스케줄은 wp-cron에 의존하기 때문에 wp-cron이 중지되었다면 이 작업에 문제가 생길 수 있다.
만약 cron 작업의 주기가 너무 길다면, 그 동안 작업이 쌓여있다가 한 번에 실행되기 때문이다. 따라서 스케줄러의 호출 주기는 5분 정도로 잡는 것이 적당한 것 같다.
wp super cache의 가비지 컬렉션 처리 역시 wp-cron에 의존하고 있다. 이 역시 처리 주기가 너무 길면 만료여부를 체크하기 위해서 많은 파일을 뒤져봐야 하는데, 네트워크 파일 시스템을 사용하는 경우 많은 양의 파일을 훑어 나가는 작업에 CPU 사용량이 많아진다고 한다. 이는 비단 wp-cron을 비활성화 하지 않더라도 캐시의 만료 주기를 너무 길게 잡아 캐시 파일이 많이 쌓이는 경우에도 발생할 수 있다.