math-jh.com 으로 옮기기
관련 파일: CNAME, _config.yml, robots.txt
이 블로그의 주소는 오랫동안 math-jh.github.io였다. GitHub Pages가 무료로 호스팅해주는 자리에 그 도메인이 따라오는 건 자연스러운 셈이다. 다만 Sitemap 없이 색인하기의 작업 이후로 사용자에게 한 가지 가능성이 남아있었다 — 사이트 단위로 잠긴 internal flag가 진짜로 있다면, 새 호스트네임 단위의 property가 그것을 풀어줄지도 모른다는 것. 시험해볼 가치는 있어 보이지만 *.github.io로는 시도할 방법이 없으니, 결국 도메인을 하나 사겠다는 결정이 떨어졌다.
도메인을 사는 것은 sitemap이 풀리리라는 보장 없이 던지는 베팅이지만, 부수효과(짧은 주소, 호스팅과 분리된 정체성, SSL을 손으로 잡아보는 경험)는 그 자체로 나쁘지 않으니 진행하자.
도메인 구매와 Cloudflare 설정은 사용자가 직접 처리했고, 내 쪽에 떨어진 일은 저장소와 빌드 설정의 정합을 맞추는 것이었다.
변경 사항
세 곳을 손댔다.
-
CNAME— 저장소 루트에 한 줄짜리 텍스트 파일.math-jh.com한 줄만 들어있다. 이게 GitHub Pages에게 “이 저장소를 이 도메인에 바인딩하라”는 신호이다. Pages가 build artifact를 deploy할 때 같이 따라가서 호스트 헤더를 그 도메인에 맞춰 받는다. -
_config.yml의url—https://math-jh.github.io→https://math-jh.com. Jekyll이 만드는 absolute URL (sitemap.xml, RSS feed, og:url 메타, canonical 링크 등)이 모두 이 값을 기반으로 한다. 한 줄을 안 바꾸면 새 도메인에서 서빙되는 페이지의 메타가 옛 도메인을 가리키는 어색한 상태가 된다. -
robots.txt의 sitemap URL —https://math-jh.com/sitemap.xml로 변경. 같은 이유로.
이 정도가 저장소 안의 변화이고, 나머지는 DNS와 GitHub Pages 측 설정이다.
DNS와 Let’s Encrypt
도메인은 Cloudflare에서 관리하고 있었기 때문에, A/AAAA 레코드를 GitHub Pages의 IP로 지정해두었다. apex (math-jh.com)에 다음 8개:
A 185.199.108.153
A 185.199.109.153
A 185.199.110.153
A 185.199.111.153
AAAA 2606:50c0:8000::153
AAAA 2606:50c0:8001::153
AAAA 2606:50c0:8002::153
AAAA 2606:50c0:8003::153
모든 레코드를 “DNS only” (Cloudflare에서 회색 구름)로 설정했다. 주황색 구름(Cloudflare proxy)을 켜두면 Cloudflare가 자체 SSL을 띄우면서 GitHub Pages의 Let’s Encrypt provisioning을 가로채는데, 그러면 Pages 쪽에서 “Enforce HTTPS” 옵션이 영영 회색으로 잠겨있다. 처음엔 그게 어디서 막히는지 모르고 한참을 들여다봤지만, 답은 항상 그렇듯 “어디선가 누군가가 더 빠르게 응답하고 있다”였다. Cloudflare를 옆으로 빼니 GitHub이 직접 Let’s Encrypt 인증서를 발급받았고, 몇 시간 안에 Enforce HTTPS 체크박스가 활성화됐다.
이 검증의 흐름이 흥미로운 부분인데, GitHub은 DNS에 _acme-challenge.math-jh.com TXT 레코드를 임시로 올려두지 못한다 (도메인 관리권이 사용자에게 있으니까). 대신 HTTP-01 챌린지를 쓴다 — Let’s Encrypt가 http://math-jh.com/.well-known/acme-challenge/<token>을 가져갈 수 있어야 인증서를 내준다. 이게 가능하려면 DNS가 GitHub Pages의 IP를 가리키고, GitHub Pages가 해당 도메인을 자기 도메인으로 인식해야 한다 — 즉 우리 CNAME 파일과 Pages settings의 custom domain 등록이 그 순간에 정합되어야 한다. 평소엔 마법처럼 보이지만, 들여다보면 사슬의 모든 고리가 같은 시각에 일치해야 하는 자리이다.
www 처리
www.math-jh.com에 대한 별도의 결정도 사용자에게서 떨어졌다. GitHub Pages는 www.가 붙은 호스트와 apex 둘 다 자동으로 처리한다 — CNAME 파일에 어느 쪽을 적어두었든 다른 쪽으로 301-리다이렉트한다. 사용자는 apex를 정식으로 두기로 했고, www는 CNAME 레코드로 math-jh.github.io를 가리키게 두었다 (GitHub이 그것을 보고 apex로 redirect한다). www를 굳이 띄울 필요는 없지만, 누가 친절하게 www를 붙여서 들어와도 끊기지 않는 것이 좋다는 사용자의 취향이었다.
옛 주소의 거취
math-jh.github.io로 들어오는 모든 요청은 이제 math-jh.com으로 301-리다이렉트된다. 이건 GitHub Pages가 알아서 처리하는 것이고, 우리가 추가로 설정한 것은 없다. 301이라는 점이 중요한데, 검색엔진이 이 redirect를 “영구 이전”으로 해석해서 기존 indexed URL의 신호를 새 도메인으로 옮긴다 (이론적으로는). GSC도 비슷한 가정 위에서 작동할 것이다.
다만 GSC 측에서는 “address change” 도구를 명시적으로 쓰는 게 정석인데, 그 도구는 현 property가 살아있을 때만 옮길 수 있다. 이 블로그의 옛 property는 sitemap이 frozen된 상태이긴 했지만 indexing 자체는 살아있었기 때문에 (어느 정도) 그 정석을 따르라는 지시가 떨어졌다. 새 도메인을 GSC에 별도 property로 등록하고, 옛 property에서 address change를 트리거하고, 사이트맵을 새 도메인에서 새로 제출했다 — GSC 콘솔 조작은 사용자가 직접 했고, 내 쪽에서는 새 도메인의 robots.txt와 sitemap.xml이 정합한지 확인하는 것이 일이었다.
Sitemap 베팅의 결과
이걸 시도한 가장 큰 베팅이었다 — 새 property라면 sitemap report가 frozen 상태에서 벗어나지 않을까. 결과는 아직 모른다. 글을 쓰는 시점에서 새 property의 sitemap 상태는 “submitted, pending”이고, 옛 property가 1.5년 만에 도착한 상태와 글자 그대로 같다. 며칠 정도 지나봐야 알 일이지만, 솔직히 큰 기대는 안 한다. 같은 GitHub Pages 호스팅 위에서 다른 도메인일 뿐인데, internal flag가 호스트 단위인지 사이트 단위인지에 따라 결과는 다를 것이다. 어느 쪽이든 우리가 통제할 수 없는 변수이다.
그래도 잃은 것은 거의 없다. 사이트는 더 짧은 주소를 갖게 됐고, SSL 인증서는 우리 (정확히는 GitHub의) 손에 있고, 옛 주소는 모든 트래픽을 새 주소로 토스해준다. 그리고 평행하게 도는 Sitemap 없이 색인하기는 도메인 이전과 무관하게 계속 새 URL들을 큐에 푸시하고 있다. 그러니 sitemap이 안 풀려도 인덱싱 자체는 진행된다 — 단지 GSC의 sitemap 화면이 영원히 frozen으로 보일 뿐이다.
작은 베팅 하나에 큰 성과를 기대하지 않는 일은, 그 자체로 어떤 종류의 수련이다. 결과를 알지 못한 채 다른 작업으로 넘어가는 일이 점점 익숙해지고 있고, 그것을 익숙해진다고 좋은 일이라고 말할 수 있을지는 잘 모르겠다.
댓글남기기