워드프레스 속도 향상: wp-cron.php 비활성화
|블로그의 엑세스 로그를 보다가 주기적으로 wp-cron.php를 호출하고 있는 ip를 봤다. 외부에서 호출할일이 없는 거라 뭔가 해킹이나 서버 부하를 주려는 시도로 보고 ip를 차단했다. 그러고 나서 wp-cron.php가 뭔지 알아보았는데 이걸 비 활성화하면 속도가 향상되는 것을 알았다. 아예 막는 대신 시간을 정해두도 동작하게 하는 것도 설정할 수 있었다.
wp-cron.php 너 누구냐?
크론(cron)이란?
컴퓨터에서 크론(cron) 이란 정해진 시간마다 정해진 명령을 실행하게 하는 것을 말한다. 작업스케쥴러 같은 것으로 매 시간 알림을 울리게 할 수도 있고, 하루에 한번 로그 파일을 정리하게 할 수도 있다.
유닉스에서 나온 것인데 윈도우즈나 맥이나 작업 스케쥴러가 있어서 정해진 시간마다 어떤 프로그램이나 스크립트를 실행하게 할 수 있다. 맥북의 라디오 알람으로 아침을 시작하게 하는 것도 운영체제안에서 이걸 처리해주는 것이다.
wp-cron.php 는 주기적으로 실행해야할 것들을 실행해준다
워드프레스에서 글을 예약 발행할 때에도 이 모듈이 이용된다.
또는 워드프레스나 플러그인, 테마의 업데이트가 있는지 체크할때에도 사용된다.
워드프레스 플러그인중에서도 주기적으로 동작을 해야할때에는 작업스케쥴에 등록하게 되는데 그럼 이 모듈이 사용된다.
예를 들어 플러그인 업데이트 또는 댓글이 왔을 때 슬랙으로 알려주는 플러그인이나 깨진 링크가 있는지 주기적으로 체크하는 프로그인, 주기적으로 rss 을 긁어오는 플러그인들이 있다.
wp-cron.php가 보안과 접속 속도에 영향을 준다
동시 접속자가 많거나 서버 사양이 낮을 수록 상대적으로 접속 속도를 느리게 한다.
사용자가 접속할 때 마다 내부에서 wp-cron.php 이 호출된다.
크론은 유닉스에서 등록해두면 데몬이 알아서 처리를 해주는데 반해 워드프레스는 누가 사이트를 접속하기 전까지는 혼자 스스로 동작할 수 없다.
인터넷의 커넥슨 리스 방식에서는 이게 원래 지향하는방식이다.
전화 처럼 계속 연결되어 있는게 아니라 연결하고 바로 끊고 다시 연결한다. OSI 7 레이어에서 3레벨인가 data gram 방식이다. 그래서 전화가 통화중일때 “line is busy” 라고 하는지 이해할 수 있다.
암튼 워드프레스는 혼자 동작할 수 없다. 그런데 주기적으로 동작해야하는 기능을 넣기 위해 워드프레스 개발팀이 생각한게 아마도 접속할 때마다 이 작업스케쥴러를 실행해서 주기적으로 해야할 것들을 하게 만든 모양이다.
운영체제의 크론도 아마 메모리에 떠 있으면서 cpu 클럭이 칠때 실행하고 있을 테니 트리커가 cpu 클럭이라면 워드프레스같은 웹 사이트에서는 사용자 접속이 그 트리커인 모양이다.
깨진 링크 체크 같은 플러그인도 있기는 했는데 워드프레스를 자동 업데이트하고, 플러그인도 자동 업데이트 기능이 생겼는데 아마 그걸 위해서 만든 것 같기도 하다.
작업할 일이 없어도 사용자가 접속할 때 마다 무조건 wp-cron.php 를 실행해 디비를 접속한다
예약 발행이 있는지 디비에서 글을 체크해야 한다.
예약 발행을 하지 않았어도 모든 페이지 접속마다 디비를 쿼리를 하게 된다.
워드프레스 캐시 플러그인을 해 놓아도 디비를 접속하게 되는 것 같다.
내 서버에서 메모리와 cpu 감시를 해보니 mysql 데몬이 자주 뜨고 cpu와 메모리 사용 용량이 상대적으로 많았다.
새 워드프레스 버전이 있는지, 새 플러그인 업데이트가 있는지 매 접속마다 확인하고 있는지도 모른다. 워드프레스는 몇 달에 한번 나오는데 말이다.
동시 접속자가 많으면 서버 CPU 부하가 생기고 접속 속도가 느려진다
동시 접속자가 많으면 mysql 데몬이 부하가 생기니 CPU 사용율이 높아져서 접속 속도가 느리게 된다.
wp-cron.php를 호출해서 공격한다
3.36.158.79 - - [03/Jul/2022:00:02:17 +0000] "POST /wp-cron.php?doing_wp_cron=1656806537.7954308986663818359375 HTTP/1.1" 200 - "https://dobiho.com/wp-cron.php?doing_wp_cron=1656806537.7954308986663818359375" "WordPress/6.0; https://dobiho.com
wp-cron을 비활성해서 성능 높이기
wp-cron.php 비활성화하기
예약 발행을 안하거나 댓글 알림, 워드프레스 자동 업데이트, 플러그인 자동 업데이트를 하지 않는다면 꺼도 될 것 같다.
끄면 디비 접속 부하도 줄어 들고 접속 속도도 빨라질 수 있다. 얼마나 빨라지는지 벤치마킹은 안해봐서 잘 모르겠다.
wp-config.php 에 다음 명령문을 추가하면 뒨다.
define('DISABLE_WP_CRON', true);
wp-cron 실행 주기 설정하기
나는 예약 발행을 할 때가 있어 wp-cron 을 주기적으로 쓸 수 있는 방법을 찾았다.
아예 시스템 크론에 wp-cron.php 를 실행시키거나 wp-cron에 잠그는 시간을 주는 방법이 있었다
나는 크론을 일정 시간 동작하지 못하게 잠그는 방법을 택했다.
아래와 같이 wp-config.php 잠그는 시간을 주면 된다.
// 주기설정(초단위) 60초 * 60분 * 1시간 define('WP_CRON_LOCK_TIMEOUT', 3600);
이렇게 하면 워드프레스는 크론이 실행 중인지(lock 상태인지) 확인한다.
크론이 실행되지 않으면 lock을 만들고 lock timeout 에 도달하지 않앗으면 크론 실행을 못하게 한다. 실행중인 크론작업이 없고 타임아웃이 경과했으면 크론이 실행된다.
마치며
이론적으로는 서버의 CPU나 메모리 자원을 줄이고 , mysql 접속도 줄이니깐 접속이 더 빨라졌을 것이다.
그런데 서버에서 mysqld.bin 이 눈에 띄게 줄었는지는 잘 모르겠다.
벤치마킹할 방법이 있다면 좋겠는데 잘 몰라서 그냥 눈으로 봤는데 자주 위에 보여서 이 조치만으로 크게 줄어는게 아닌 것 같다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1008 mysql 20 0 1212876 81028 0 S 0.3 16.4 145:33.42 mysqld.bin 1 root 20 0 170488 3164 2044 S 0.0 0.6 0:07.21 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
다만 이전 보다 접속 속도의 체감은 빨라진 느낌이다. 물론 접속 상태마다 다르고 몇가지 조치를 더 하긴해서 이게 얼마나 큰 영향을 줬는지는 모르겠다.
wp-cron.php를 호출해서 성능을 저하시키려고 하거나 뭔가 나쁜짓을 하지 않아 싶어서 알아보다가 성능에 영향을 준 것 까지 알게된것 같다. 재미있다.
제휴 링크로 구매 시 제휴마케팅 활동의 일환으로 일정액의 수수료를 지급받아 콘텐츠를 제작하는데 큰 도움이 됩니다.
도움이 되셨다면, 댓글이나 소중한 커피 한 잔 부탁드려도 될까요?
당신이 좋아할 만한 글
4.6
연락처를 지도에서 한눈에, 위치기반의 연락처관리, 내 근처의 연락처보기