Kinsta 캐시 문제 해결하기 (feat. MU-Plugins)

Stock 664148713 jpg

카페24에서 킨스타 Kinsta로 워드프레스 호스팅 이전하기

Kinsta 호스팅 서버로 일부 웹사이트들을 이전한지 2개월 정도 되었습니다. 역시 고성능 프리미엄 호스팅답게 속도도 잘 나오고 MyKinsta 대시보드, 매뉴얼 및 고객 지원도 매우 만족스러웠지만, 얼마간 사용하다 보니 Kinsta 캐시에 문제가 있다는 느낌이 들었습니다. 어쩌다 한 번씩 마이너 업데이트를 할 때마다 변경 사항이 바로바로 반영되지 않았기 때문입니다. 업데이트가 잦은 사이트들이 아니었기 때문에 처음에는 잘 몰랐다가, 이런 일이 계속 반복되면서 캐시 삭제가 제대로 이루어지지 않고 있다는 것을 확인하고 찾아본 결과 MU-Plugins가 설치되지 않아 생긴 문제였습니다.

캐싱(Caching)이란


‘캐싱’이란, 요청이 자주 일어나는 데이터의 사본을 ‘캐시’라고 불리는 임시 저장 위치에 저장하는 프로세스 전반을 가리키는 용어입니다. 캐싱의 목적은, 업데이트가 없는 데이터를 매번 새로 가져오는 대신 캐시에 임시 저장된 복사본을 가져옴으로써 로딩 속도를 개선하는 것입니다. 요즘은 거의 모든 컴퓨팅에서 성능을 최적화하기 위한 필수 요소로 캐싱을 사용하고 있습니다. 프로그램이나 시스템에서 특정 데이터가 필요하면 먼저 캐시를 확인하고, 캐시에서 데이터가 발견되면 원본 소스에 액세스하지 않고 바로 캐시 데이터를 반환합니다. 이 과정에서 엄청난 속도 개선이 발생하게 됩니다. 확인 결과 캐시에 해당 데이터가 없는 경우, 프로그램은 원본 소스에서 데이터를 가져와 나중에 사용할 수 있도록 캐시에 복사본을 저장한 후 사용하게 됩니다.

이 부분에서 단순한 궁금증이 하나 생깁니다. 사용하려는 데이터, 예를 들어 웹페이지에 변경 사항이 발생한 경우, 막 업데이트 된 원본 데이터와 이전에 임시 저장된 캐시 데이터 간에 불일치가 발생하게 됩니다. 이 때 사용자가 웹페이지 로딩을 요청하면, 캐시에 임시 저장된 데이터가 있다는 이유로 굳이 원본을 가져오지 않고 오래된 캐시 데이터를 반환할텐데 이 부분은 대체 어떻게 되는 것인지, 하는 것입니다. 즉, 사용자가 아무리 브라우저를 새로고침 해도 업데이트 된 새 페이지 대신 계속해서 예전 페이지가 보여지는 문제가 생길 수 있습니다. 그래서 클라이언트 및 서버 설정에 따라 이러한 상황을 해결하는 몇몇 방법들이 있습니다.

워드프레스에서 사용하는 캐시의 종류


Kinsta에서 호스팅하고 있는 워드프레스 웹사이트의 캐싱 문제를 해결해야 하는 상황이므로, 이를 위해 워드프레스에서 사용하는 캐시의 유형과 특징을 먼저 살펴보도록 하겠습니다.

바이트코드 캐시(Bytecode Cache)

바이트코드 캐시는 컴퓨터 프로그램, 특히 해석된 프로그래밍 언어의 실행에 사용되는 메커니즘입니다. 프로그램이 Python, PHP 또는 Java와 같은 고급 언어로 작성된 경우 가상 머신이나 인터프리터에서 실행되기 전에 바이트코드(Bytecode)라는 중간 단계 언어로 변환되는 경우가 많습니다. 바이트코드 캐시는 프로그램을 실행할 때마다 다시 컴파일할 필요가 없도록 프로그램의 컴파일된 바이트코드를 저장합니다. 이는 반복적인 컴파일과 관련된 오버헤드를 줄여 프로그램의 전반적인 성능을 향상시키는 데 도움이 됩니다. 컴파일된 바이트코드는 가상 머신 혹은 인터프리터에서 실행되며, 이 과정에서 해당 컴퓨터의 CPU가 이를 실행할 수 있도록 기계어인 옵코드(Opcodes: Operation Codes)에 바이트코드 명령어를 매핑하게 됩니다. 따라서, 넓은 의미의 바이트코드 캐싱은 이 옵코드를 캐싱하는 작업까지 포함합니다.

워드프레스는 PHP 프로그래밍 언어로 구축된 콘텐츠 관리 시스템입니다. PHP 코드는 인터프리터에 의해 실행되는 과정에서 옵코드로 컴파일된 후 CPU에 의해 실행됩니다. 바이트 캐시에 해당하는 옵캐시/옵코드 캐시(OPcache)는 PHP 코드의 첫 번째 실행 후 이러한 옵코드를 공유 메모리에 저장하여 동일한 스크립트에 대한 후속 요청 시 다시 컴파일할 필요가 없도록 해줍니다. PHP 환경 설정 파일(php.ini)을 수정하여 옵캐시를 활성화할 수 있습니다. 옵캐시를 사용하면 PHP 성능이 크게 향상된다는 장점이 있지만, 캐싱 기능으로 인해 PHP 파일의 변경 사항이 즉각적으로 반영되지 않기 때문에 업데이트가 발생 시 캐시를 삭제하는 메커니즘이 필수적으로 고려되어야 합니다. 이러한 이유로, 개발 및 업데이트가 활발하게 이루어지는 스테이징 서버에서는 옵캐시를 비활성화하는 것이 일반적입니다. 요약하자면, 바이트코드 캐싱은 컴파일된 중간 코드를 저장하고 재사용함으로써 프로그래밍 언어의 실행 속도와 효율성을 향상시키는 데 사용되는 캐싱 기술이라 할 수 있습니다.

객체 캐시(Object Cache)

워드프레스에서 객체 캐시는 자주 사용하거나 계산 비용이 많이 드는 쿼리 결과를 메모리에 보관하여 더 빠른 속도로 데이터를 저장하고 검색할 수 있게 해주는 메커니즘입니다. 이는 데이터베이스에서 동일한 데이터를 반복적으로 생성하거나 가져올 필요성을 줄여주기 때문에 워드프레스 사이트의 전반적인 성능을 향상시켜줍니다. 객체 캐싱은 트래픽 양이 많거나 데이터베이스 쿼리가 복잡한 웹 사이트에 특히 유용합니다. 특정 정보가 필요할 때마다 데이터베이스를 쿼리하는 대신 캐시에 저장된 데이터를 반환하여 해당 데이터에 대한 후속 요청을 더 빠르고 효율적으로 처리해줍니다.

워드프레스 자체에는 객체 캐싱이 내장되어 있지 않지만 이를 구현하는 유연한 방법들을 제공합니다. 개발자는 캐싱 플러그인을 사용하거나 Memcached 또는 Redis와 같은 타사 라이브러리를 이용하여 객체 캐싱 기능을 테마 또는 플러그인에 추가할 수 있습니다. 개체 캐싱을 구현함으로써 워드프레스 사이트의 데이터베이스 부하를 줄이고 실행 속도를 단축시킬 수 있습니다.

워드프레스에는 객체 캐시를 위한 내장 클래스(WP_Object_Cache)가 wp-includes/cache.php에 정의되어 있지만, 이 객체 캐시의 목적은 단일 페이지 로드 중에 데이터베이스가 동일한 방식으로 여러 번 쿼리되지 않도록 하는 것이기 때문에 해당 페이지 밖에서는 무용지물이 됩니다. 나름대로 유용한 기능이지만, 객체 캐싱은 여러 페이지 간에 사용할 때 훨씬 더 강력해지므로 내장 객체 캐시 대신 W3 Total Cache 등의 캐싱 플러그인이나 Memcached 또는 Redis와 같은 타사 라이브러리 등의 외부 솔루션 활용을 고려해보는 것이 좋습니다.

페이지 캐시(Page Cache)

페이지 캐싱은 페이지의 전체 HTML을 저장하여 후속 요청시 페이지를 새로 생성하지 않고도 조회가 가능하도록 하는 기술입니다. 워드프레스가 웹사이트를 로드하려면 많은 수의 PHP 파일을 처리하고 여러 차례 데이터베이스를 쿼리해야 합니다. 업데이트가 자주 발생하지 않는 페이지의 경우 매번 이러한 과정이 반복된다면 불필요한 리소스의 낭비가 발생하게 됩니다. 그래서, 각 페이지가 생성되면 해당 페이지를 저장하여 이후 요청이 있을 때마다 저장된 페이지를 전달하는 것이 여러모로 효율적일 것입니다. 이것이 바로 페이지 캐싱의 역할입니다.

페이지 캐싱을 사용함으로써 사용자는 훨씬 빠른 로딩을 경험할 수 있고, 서버 부하가 크게 줄어들어 더 많은 트래픽을 처리할 수 있게 됩니다. 대부분의 호스팅 서버가 자체적으로 페이지 캐싱 기능을 제공하며 사용자가 캐시 만료 시간을 자유롭게 변경할 수 있도록 합니다.

CDN 캐시(CDN Cache)

CDN 캐싱은 미디어 파일, 스타일시트, 자바스크립트 등의 웹사이트 파일들을 콘텐츠 전송 네트워크(CND)에 저장함으로써 호스트 서버에서 물리적으로 멀리 떨어져 있는 사용자에게 더 빠르게 전달할 수 있도록 하는 기술입니다. 사용자가 웹사이트에 접속하면, 해당 파일은 실제로 원본 서버가 아닌 CDN에서 전달됩니다.

CDN를 이용하면 서버의 부하도 줄어들고, 원본 서버에서 물리적으로 멀리 있는 사용자의 웹사이트 성능도 향상된다는 잇점이 있습니다. CDN에는 표준 CDN과 보안 추가 CDN이 있는데, 전자는 일반적으로 미디어 파일, 스타일시트, 자바스크립트 등 주로 정적인 웹사이트 자산 파일들만 캐싱하는데 반해, 후자는 전체 프록시 서버 역할을 하며 모든 요청이 CDN 서버를 먼저 거치도록 되어 있어 이 과정에서 각종 보안 기능과 전체 페이지 캐싱 등이 처리됩니다.

Kinsta 캐시 제어 방법


하지만 Kinsta는 이 모든 유형의 캐싱을 구현하고 있기 때문에, Kinsta 서버에 웹사이트를 호스팅하면 캐싱에 대해 일일히 대처하지 않아도 됩니다. 추가로 캐싱 플러그인을 설치할 필요도 없이, 웹사이트를 Kinsta 서버로 마이그레이션하는 것만으로도 로드 시간이 단축되어 최대 212.5%까지 성능이 증가한 통계 보고가 있습니다. 실제로 워드프레스 캐싱 플러그인을 별도로 설치하고도 복잡한 설정에 실패하여 오히려 워드프레스 웹사이트 속도가 더 느려지는 경우도 있습니다.

그렇다면 Kinsta 서버에서 캐시를 완벽하게 제어하기 위해 알아야 할 사항들을 살펴보겠습니다. 물론, 특히 문제 해결 시에는 캐시를 삭제해야 할 경우가 있는데, 이를 위해 MyKinsta 대시보드에서 캐시를 삭제하거나 Kinsta MU 플러그인을 활용할 수 있습니다. Kinsta MU 플러그인은 캐싱 관련 플러그인으로, Kinsta 전용 프로세스를 통해 추가하거나 마이그레이션 하는 모든 웹사이트에 기본으로 설치됩니다. Kinsta MU 플러그인이 설치된 상태에서는 기본적으로 페이지나 글이 업데이트 될 때 자동으로 캐시가 삭제됩니다. 제 경우는 수동으로 마이그레이션을 하는 바람에 Kinsta MU 플러그인이 설치되지 않은 상태였고, 그래서 업데이트 된 글의 캐시 자동 삭제에 문제가 생겼던 것이었습니다.

MyKinsta 대시보드에서 캐시 수동 삭제


Kinsta 캐시 삭제

전체 페이지 캐시를 수동으로 삭제하려면 MyKinsta 대시보드에서 사이트를 선택한 후, Tools 메뉴의 Site cache 아래 ‘Clear cache’ 버튼을 클릭하면 모든 캐시가 삭제됩니다. Kinsta 스테이징 사이트에서는 기본적으로 캐싱이 비활성화되어 있지만, 필요한 경우 Site cache에서 캐싱을 활성화하면 라이브 서버와 동일하게 캐시를 삭제할 수 있습니다.

Kinsta MU 플러그인 이용하기


20240302 221722

두 번째 옵션은 Kinsta MU 플러그인을 사용하는 것입니다. Kinsta MU 플러그인이 기본으로 설치된 경우, 워드프레스 관리자 대시보드 메뉴의 ‘Kinsta Cache’에서 옵션별로 캐시 수동 삭제를 할 수도 있습니다. ‘Custom URLs to purge’ 옵션을 이용하면 매번 불필요하게 전체 페이지 캐시를 삭제하는 대신, 업데이트가 잦은 특정 웹페이지들만 URL로 미리 지정해두고 삭제할 수도 있습니다. 그러면 속도에도 크게 영향을 주지 않으면서 스마트하게 필요한 부분의 캐시만 삭제할 수 있습니다. Kinsta에 호스팅 된 워드프레스 웹사이트가 원활하게 실행되려면 Kinsta MU 플러그인이 반드시 설치되어야 합니다.

플러그인을 사용하면 WordPress 관리 표시줄에서 바로 캐시를 제거할 수도 있습니다.

20240302 223603

대시보드 우측 상단의 ‘Clear Caches’ 드롭다운 메뉴에서도 동일하게 캐시 삭제 메뉴를 사용할 수 있습니다. 

Kinsta MU 플러그인 설치


제 경우 수동 마이그레이션을 했기 때문에 Kinsta MU 플러그인도 수동으로 설치해줘야 하는데 이 부분을 간과하고 있다가, 캐시 삭제가 원활하게 이루어지지 않는 것을 발견하고 이리저리 알아보던 중 Kinsta MU 플러그인을 설치해야 한다는 것을 알게 되었습니다. 그래서 Kinsta MU 플러그인을 수동으로 설치해보았습니다.

1. mu-plugins 폴더 생성하기

20240302 235359

SFTP를 이용해서 접속한 후 /wp-content/ 폴더 아래에 mu-plugins 폴더를 만듭니다. 해당 이름의 폴더가 이미 있다면 그대로 두고 다음 단계로 넘어가시면 됩니다.

2. Kinsta MU 플러그인 다운로드해서 압축 풀기

Kinsta MU 플러그인 다운로드 (kinsta-mu-plugins.zip / 53.3KB)

20240303 000009

MU 플러그인을 다운로드 한 후 압축을 해제하면 kinsta-mu-plugins.php 파일과 kinstas-mu-plugins폴더가 들어있습니다.

3. 플러그인 업로드

20240303 000412

아까 생성해둔 /wp-content/mu-plugins 폴더에 kinsta-mu-plugins.php 파일과 kinstas-mu-plugins폴더를 업로드하면 설치가 완료됩니다.

4. 설치 완료 확인

20240303 002914

관리자 대시보드 [플러그인 Plugins]의 ‘필수 Must-Use’ 탭에서 Kinsta Must-use Plugins가 설치되어 있는 것을 확인합니다. 이제 업데이트 된 글의 캐시 자동 삭제 포함, Kinsta에 구현되어 있는 캐싱 기능을 모두 사용할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *