워드프레스 속도 향상: 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
연락처를 지도에서 한눈에, 위치기반의 연락처관리, 내 근처의 연락처보기









Add a Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다