워드프레스 속도 개선과 CRON

워드프레스에서는 예약발행과 같이 미래의 지정된 시간에 특정 작업을 예약하거나, 버전 업데이트 확인 등과 같이 일정 주기로 특정 작업을 수행하도록 예약하는 방식을 지원하는데요(WP Cron), 코어에서도 그렇지만 많은 플러그인과 테마, 프레임웍 등에서 이러한 예약작업을 등록합니다. 이 외에도 주기적으로 캐시했던 데이터를 지우고 새로 캐시를 생성하는데도 사용되기도 하는 등 아주 다양하게 활용되고 있습니다.

우선, CRON 이라고 하는 것은 UNIX 기반 시스템에서 시간을 기준으로 작업을 수행하는 프로그램(명령)입니다. 한마디로 작업 스케줄러라고 보시면 되는 것이죠.

이 CRON 이라는 것이 기본적으로는 시스템 백그라운드에서 실행되는 것으로서 사용자에게는 거의 영향을 미치지 않는 것이 기본이지만, 워드프레스라는 웹 어플리케이션에서 시스템에 접근할 수 있는 권한이 한정적이기도 하고 일반적인 호스팅에서는 이를 지원하지 않기 때문에(보안, 리소스 관리) 워드프레스 자체적으로 이를 지원하도록 만든것이 WP Cron 입니다.

이에 따라서 사용자들이 사이트에 접속하여 페이지를 로딩하는 중간에 예약된 작업을 백그라운드에서 실행하는 과정에서 수초에서 길게는 몇 분가량 페이지 로딩이 지연되는 경우가 있게 됩니다.

통상적으로 시간이 오래 걸리는 예약 작업은 사이트 관리자가 페이지를 로드할 때만 적용되긴 하지만, 다양한 플러그인과 테마를 사용하다 보면 그렇지 않은 경우도 종종 발생하게 됩니다.

사이트 페이지 로딩이 매번 느린 경우가 아니라 간헐적으로 한번씩 느려지는 경우라면 CRON 작업을 하고 있구나 라고 예상하셔도 좋을 것입니다.

아래 언급드리는 내용은 국내의 일반 호스팅 사용자라면 적용할 수 없는 사항이라는 것을 미리 말씀드리도록 하겠습니다. 단독(가상, 클라우드)서버를 통해 (U)NIX 환경에서 사이트를 운영중이시거나, cPanel 과 같은 툴을 제공하는 해외 호스팅을 사용중인 분들이라면 WP Cron을 막아두고 시스템의 CRON을 통해 예약 작업을 수행함으로서 이러한 지연 현상을 방지할 수 있습니다.

우선, WP Cron 을 막는 방법은 wp-config.php 파일을 열어 아래 내용 한 줄을 추가해 주시면 됩니다.

이제 시스템 상에서 워드프레스의 예약 작업을 수행하도록 등록해 보겠습니다.

단독 서버를 운영중일 경우(telnet/ssh를 통해 서버에 접속)

  • $ crontab -e # 예약작업 등록/수정 명령어
  • 그리고 뜨는 화면에서 아래 내용을 한 줄 추가해 주시면 됩니다.(사이트 주소는 자신의 것으로 변경해야 함)
  • 위 예제는 15분에 한번씩 예약 작업 수행요청을 하고, 등록된 작업이 있다면 수행하는 명령입니다. 자세한 crontab 사용법은 구글 등에서 검색해 보시거나, 이 페이지를 참고해 보세요. 예약작업이 아주 많다면 시간단위를 짧게 하실 수 있고, 그렇지 않다면 더 길게 잡으시면 됩니다.

cPanel 을 통한 예약작업 등록

  • cPanel 에 로그인
  • Advanced 섹션에서, Cron jobs 클릭.
  • Add New Cron Job 에서, time interval 을 선택합니다. (HostGator 에서는 15분 이상을 선택하길 권장합니다.)
  • cron 명령에 아래와 같은 내용을 추가해 합니다.(사이트 주소는 자신의 것으로 변경해야 함)

 

관리자 화면 글 목록에 내 글만 표시하기

워드프레스 관리자 화면의 글 목록에서는 기본적으로 모든 글이 우선 표시되고 자신의 글이 아니거나 수정할 수 없는 글에는 ‘편집’ 링크 없이 ‘보기’ 링크만 제공됩니다.

프로젝트 진행을 하다보면 글 목록 자체에 ‘로그인한 사람의 글’만 보여지길 원하는 경우가 종종 있는데요, 이는 정상적인 방법으로는 해결이 어려운 내용입니다.

이를 적용하기위해서는 약간의 트릭이 필요한데요, 기본으로 워드프레스에서 제공하는 ‘내 글’ 보기 링크를 응용한 것입니다.

list-posts-views

(Mine 에 대한 번역이 ‘자료’로 되어있군요… 번역 수정 신고도 해야겠습니다.)

이 링크의 주소(URL)을 살펴보면 author=xxxx 라는 형식의 질의문이 포함되어 있습니다. 즉, 이 질의문만 있으면 ‘내 글만’ 보이게 되는 것입니다.

이를 활용해서 ‘load-edit.php’ 후크에 함수(function)을 등록하여 글 목록 페이지 자체에 ‘내 글’ 만 보이도록 트릭을 걸 수 있습니다.

Continue reading “관리자 화면 글 목록에 내 글만 표시하기”

워드프레스의 CONCATENATE_SCRIPTS constants 활용

현재 진행중인 프로젝트에서 로컬서버에서는 없었던 문제가 라이브 서버에 업로드 후 발생하였습니다.

문제는 관리자 > 외모 > 위젯 페이지에서 스크립트 오류가 발생하며 위젯을 드래그 & 드롭이 불가능해 지는등 페이지에서의 액션들이 적용되지 않아 위젯의 설정도 바꿀 수 없는 상황이 되었는데요, 처음에는 플러그인 오류라 생각하고 문제가 되는 플러그인을 찾아 비활성화 해 보았지만 문제는 계속 지속되었습니다.

자바스크립트 콘솔을 통해 출력된 오류 내용을 보니

를 브라우저에서 로딩을 하지 못하고 있더군요. 해당 파일(페이지)에 직접 접속을 해 보니 ‘Forbidden’ 오류가 발생을 하네요. 예전에 로컬 서버에 Apache 보안 모듈을 설치했을 때와 워드프레스 보안용 플러그인을 설치했을때도 유사한 경우가 있었던게 나중에서야 기억이 나 URL에 query string(? 이후의 문자들)이 너무 길 경우 해킹으로 간주하는 경우인 것을 예상할 수 있었습니다.

위 주소의 /wp-admin/load-scripts.php… 는 워드프레스에서 해당 페이지에서 필요한 자바스크립트들을 한 번에 모은 뒤 압축(필요없는 공간을 제거하여 용량을 줄임)해서 관리하는 기능을 하는 것입니다.

보안 모듈 혹은 플러그인에 예외 경우를 두는 방법으로도 해결되겠지만, 호스팅회사의 경우 한 사이트 만을 위해서 보안상의 위험을 감수할 수 없기도 하고 예외 경우를 사이트별로 적용하는 구조를 가지지 못한 경우도 있기에 이 문제를 해결하기 어려울 수도 있습니다.

이런 경우 wp-config.php 에 아래 한 줄을 추가하는 방법으로 문제를 간단히 해결할 수 있습니다.

load-scripts.php 로 통합하여 자바스크립트들을 호출하지 않고 각각의 파일들을 따로 호출하도록 하는 정의입니다.

Query Monitor 플러그인 소개

개발자 혹은 사이트 제작자를 위한 플러그인을 하나 소개할까 합니다.

Query Monitor

banner-772x250
어떤 특정 페이지 혹은 관리자 화면에서 페이지 로딩시간이 눈에띄게 늘어나는 경우가 있는데요, 이 경우 원인을 파악하기란 정말 쉽지 않습니다.
 
플러그인을 하나하나 비활성화 해 가면서 원인이 되는 플러그인을 찾아 볼 수 는 있지만 어떤 부분에서 지체가 되는지를 파악하려면 아주 많은 경험에 운까지 필요하곤 하지요.
이럴 때 큰 도움이 되는 플러그인이 바로 Query Monitor 플러그인입니다.
 
페이지 로딩 타임(PHP), MySQL Query Time, 메모리 사용 등 기본 정보 이외에도 디버깅에 필요한 대부분의 정보를 한 눈에 파악할 수 있습니다.

데이터베이스 Queries

  • 현재 페이지에 호출된 모든 query
  • 영향을 받은 row들과 질의(query)에 걸린 시간
  • slow queries, 오류가 있는 query 에 대한 알림
  • 다양한 필터링 기능

Hooks

  • 현재 페이지에서 호출된 모든 후크(hooks) 정보
  • 다양한 필터링 기능

PHP 오류

  • 오류, 경고, 정보성 알림 등 PHP 오류를 정리하여 보여줌

HTTP Requests

  • 현재 페이지에서의 모든 HTTP 요청(워드프레스 HTTP API 이용)에 대한 정보와 소요시간 표시

이 외에도 서버환경, 테마, 템플릿, AJAX 등 생각할 수 있는 거의 모든 정보를 한 번에 볼 수 있도록 해 줍니다.

참고로 제가 이번에 찾은 원인은 바로 Jetpack 플러그인의 ‘alert_identity_crisis()’ 함수에서 jetpack 서버로의 호출이 매 페이지마다 발생하는 중에 가끔씩 name lookup timeout 이 걸리면서(jetpack 서버의 늦은 반응으로) 10초 가량 로딩이 지연되는 경우였습니다.

slow-loading-monitor

이 플러그인 아니었으면, 몇 시간을 그냥 날릴뻔 했는데 말이지요;-)