개발기

워드프레스를 걷어내고 순수 PHP로

"SEO 하려면 워드프레스"라는 생각으로 시작했습니다. 만들다 보니 계산기 사이트에 워드프레스는 짐이었습니다.

왜 걷어냈나

처음에는 당연히 워드프레스로 갔습니다. SEO 플러그인, 사이트맵 자동 생성, 스키마 마크업. 검색하면 전부 워드프레스로 하라고 나옵니다.

그런데 막상 만들다 보니 제가 필요한 건 정적인 페이지 몇십 개와 자바스크립트 계산기였습니다.

RAM 960MB짜리 서버에서 안 쓰는 기능을 위해 MySQL을 띄우고 PHP로 매 요청마다 테마와 플러그인을 로딩하고 있었던 겁니다.

결과

워드프레스순수 PHP
로드 타임659ms133ms
데이터베이스MariaDB 사용미사용

약 5배입니다. 그리고 이후 최적화를 더 해서 지금은 TTFB 67ms까지 내려왔습니다.

속도가 SEO에 얼마나 영향을 주는지는 사실 논쟁적입니다. 하지만 메모리가 남는다는 것은 확실한 이득이었습니다. 이때부터 스왑을 건드리지 않게 됐습니다.

구조 — config 하나가 단일 소스

프레임워크 없이 만들면서 딱 하나 규칙을 정했습니다. 같은 정보를 두 군데 적지 않는다.

inc/config.php 하나에 계산기 목록, 가이드 목록, 관련 링크 맵을 두고 나머지는 전부 여기서 읽어갑니다.

inc/config.php  (계산기 목록 · 가이드 목록 · 관련 링크)
      ↓ 자동 반영
홈 카드 · sitemap.xml · 홈 타이틀("계산기 15종") · 관련글 블록

계산기를 하나 추가하면 배열에 한 줄 넣는 것으로 끝입니다. 홈에 카드가 생기고, 사이트맵에 URL이 들어가고, 관련 계산기 블록에 링크가 걸립니다.

이 글의 목록도 같은 방식입니다. 개발기를 한 편 추가하면 목록 페이지와 사이트맵, 그리고 아래 이전/다음 글 링크가 전부 따라옵니다.

캐시 무효화는 filemtime으로

CSS를 고쳤는데 브라우저가 옛날 걸 들고 있는 문제, 다들 겪습니다. 이건 한 줄로 해결했습니다.

/assets/site.css?v=1787795994

파일의 수정 시각(filemtime)을 쿼리스트링에 붙입니다. 파일을 고치면 숫자가 바뀌고, 브라우저는 다른 파일로 인식해서 새로 받아갑니다.

덕분에 캐시 삭제라는 작업이 아예 없습니다. 배포하고 새로고침하면 끝입니다.

이전하면서 지킨 것

기존 사이트를 갈아엎을 때 제일 무서운 건 검색엔진이 그동안 쌓아둔 것을 날리는 것입니다. 두 가지를 지켰습니다.

덕분에 Search Console에 아무것도 재제출하지 않았습니다. 구글 입장에서는 사이트가 갑자기 빨라진 것 외에는 바뀐 게 없습니다.

삽질 ① 홈이 403

업로드하고 접속했더니 홈페이지가 403이었습니다. 권한 문제라고 생각하고 한참 chmod를 만졌습니다.

진단은 이렇게 했습니다.

CSS는 되는데 index.php만 404라면 권한이 아니라 파일 자체가 없다는 뜻입니다. nginx는 디렉터리 인덱스 파일을 못 찾으면 403을 냅니다.

FileZilla로 올리는 중에 루트의 index.php가 누락됐던 것이었습니다. 전송 목록에 빨간 줄이 하나 있었는데 못 봤습니다.

삽질 ② 흰 화면

더 무서운 건 이쪽이었습니다. 배포했더니 전 페이지가 흰 화면이 됐습니다.

원인은 업로드 순서였습니다. header.php를 먼저 올리고 config.php를 나중에 올렸는데, 그 사이에 접속하면 header.php가 아직 존재하지 않는 상수를 참조합니다. PHP는 치명적 오류를 내고 아무것도 출력하지 않습니다.

여기서 규칙 하나가 생겼습니다.

inc/ 를 항상 먼저 올린다.

설정과 공통 파일이 먼저 있어야 그걸 쓰는 페이지가 동작합니다. 지금도 배포할 때마다 이 순서를 지킵니다.

정리

워드프레스가 나쁘다는 얘기는 아닙니다. 글을 자주 쓰고, 여러 명이 관리하고, 기능을 계속 붙일 거라면 여전히 좋은 선택입니다.

제 경우는 필요한 기능이 거의 없었고 서버가 작았습니다. 그 조합에서는 직접 만드는 쪽이 압도적으로 단순했습니다. 지금 이 사이트 전체가 PHP 파일 몇십 개와 CSS 한 장, 계산기별 JS 한 장씩입니다.

이어서 읽기

개발기 전체 목록 보기 →