Jekyll SEO 2편 — sitemap 미갱신 진단과 _config.yml 수정
SEO 시리즈 2편. 1편 에서 포스트 한 개 단위의 frontmatter·jekyll-seo-tag·permalink 최적화를 다뤘다. 그런데 그 이후 새 글을 여러 개 push 했는데도 Google Search Console에서 sitemap.xml의 마지막 읽은 날짜(Last read)가 몇 주째 갱신되지 않고, 새 포스트가 색인에 잡히지 않는 문제가 발생했다. 일반론(크롤링 예산, 콘텐츠 품질) 이전에 이 저장소에는 _config.yml 설정 누락이라는 명확한 코드 문제가 있었다. 진단 과정과 해결 방법을 정리한다.
SEO 시리즈 구성
-
1편 — 포스트 단위 SEO: frontmatter,
jekyll-seo-tag, permalink·파일명 -
2편 (이 글) — sitemap이 제대로 갱신되도록:
_config.yml의 url·future·timezone 3줄 진단·수정 - 3편 — 사이트 단위 SEO 감사: sitemap 품질, 검증 메타태그, 누락 description 일괄 보강, 404/아카이브 정리
-
4편 — Google Search Console 잔여 이슈 정리: 404·리디렉션·”크롤링됨-색인 안 됨” 분류 진단과
noindex메타태그 적용
환경: Jekyll 3.x + minimal-mistakes + GitHub Pages + jekyll-sitemap 플러그인
[01] 문제 상황
새 포스트를 여러 개 push 했는데도 Google Search Console(GSC)에서 아래 두 가지 증상이 지속됐다.
graph LR
PUSH["새 포스트 push"] -->|1~2주 경과| GSC["Search Console 확인"]
GSC --> SITEMAP["Sitemap
Last read 갱신 없음"]
GSC --> INDEX["색인 페이지
신규 포스트 미포함"]
style PUSH fill:#e3f2fd,stroke:#1565c0
style SITEMAP fill:#ffcccc,stroke:#c62828
style INDEX fill:#ffcccc,stroke:#c62828
| 증상 | 기대 | 실제 |
|---|---|---|
| Sitemap 마지막 읽은 날짜 | 주 1회 이상 갱신 | 수 주 정지 |
| 색인 페이지 수 | 신규 포스트 반영 | 구 포스트만 존재 |
sitemap.xml 내용 |
최신 포스트 포함 | 일부 누락 가능성 |
[02] 일반론 먼저 정리 (AI가 흔히 알려주는 원인)
대부분의 답변은 아래 7가지 일반론을 제시한다. 모두 성립하는 원인이지만, 먼저 본인 저장소 설정을 점검한다.
| # | 원인 | 판단 |
|---|---|---|
| 1 | 사이트에 변화가 거의 없음 | 정상 (문제 아님) |
| 2 |
lastmod 신뢰도 낮음 (모두 동일 / 실제 수정 없음) |
점검 필요 |
| 3 | 사이트 크롤링 우선순위 낮음 (신규 도메인, 트래픽 적음) | 시간 해결 |
| 4 |
robots.txt / 리다이렉트 / 접근 오류 |
점검 필요 |
| 5 | 이전 sitemap 대비 변경 없음으로 판단 | 정상 |
| 6 | 크롤링 예산 제한 | 규모 문제 |
| 7 | Search Console UI 반영 지연 | 무시 가능 |
위 7가지는 일반론이며, 이 저장소의 실제 원인은 별도였다. 다음 섹션에서 진단 과정을 정리한다.
[03] 실제 원인 진단
_config.yml을 점검한 결과 3가지 핵심 설정 누락이 발견됐다.
graph TD
ROOT["sitemap 미갱신 원인"] --> C1["(1) url: 비어 있음
→ canonical URL 미생성"]
ROOT --> C2["(2) future: 기본값 false
→ 오늘 날짜 포스트 빌드 제외"]
ROOT --> C3["(3) timezone: 비어 있음
→ UTC로 해석, KST 날짜 경계 오판"]
C1 --> R1["sitemap URL 불완전
Google 신뢰도 하락"]
C2 --> R2["새 포스트 자체가
_site/ 에 없음"]
C3 --> R3["2026-04-15 작성글이
UTC 환산 시 미래로 인식"]
style ROOT fill:#fff3e0,stroke:#e65100
style C1 fill:#ffcccc,stroke:#c62828
style C2 fill:#ffcccc,stroke:#c62828
style C3 fill:#ffcccc,stroke:#c62828
3-1. url: 값이 비어 있음
1
2
3
# 수정 전
url : # the base hostname & protocol ...
baseurl : # the subpath of your site ...
-
jekyll-sitemap은site.url을 기반으로sitemap.xml의<loc>절대 URL을 생성 - 값이 비어 있으면
<loc>/categories/xxx/</loc>같이 상대경로가 들어가거나<loc>누락 - Google 입장에서는 “sitemap 형식이 이상함” → 신뢰도 하락 → 재크롤링 빈도 감소
-
jekyll-seo-tag의canonical, Open Graph URL도 같은 이유로 생성 실패
3-2. future: 플래그 미설정 (기본값 false)
Jekyll은 기본적으로 미래 날짜 포스트를 빌드에서 제외한다. 이 기본값은 다음 순서로 새 포스트를 sitemap에서 빠뜨린다.
1
2
3
4
5
6
# 현재 시각(UTC 기준): 2026-04-15 23:10
# 포스트 frontmatter: date: 2026-04-16
$ jekyll build
# → 위 포스트는 "미래 글"로 판단되어 _site/ 에 포함 안 됨
# → sitemap.xml 에도 당연히 누락
timezone이 함께 비어 있으면 한국(KST) 기준 오후에 작성한 글이 UTC 기준으로 다음 날로 환산되어 미래글로 분류된다.
3-3. timezone: 값 누락
1
2
# 수정 전
timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
- 빈 값 → Jekyll은 서버(또는 Liquid) 기본 TZ로 해석 (GitHub Pages 빌더 환경은 UTC)
- 포스트에
date: 2026-04-16만 적은 경우 KST 00:00 ≠ UTC 00:00 → 날짜 경계 오판 -
future: true와timezone: Asia/Seoul을 함께 설정해야 안정적
[04] 해결: _config.yml 3줄 수정
4-1. 수정 diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Site Settings
locale : "ko-KR"
title : "블로그"
# ...
- url : # the base hostname & protocol for your site
- baseurl : # the subpath of your site
+ url : "https://cmaven.github.io"
+ baseurl : ""
# Outputting
permalink: /:categories/:title/
paginate: 5
paginate_path: /page:num/
- timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ timezone: Asia/Seoul
+ future: true # 오늘/미래 날짜 포스트도 빌드에 포함
4-2. 각 설정의 효과
| 설정 | Before | After | 효과 |
|---|---|---|---|
url |
(비어 있음) | https://cmaven.github.io |
sitemap <loc> 절대 URL, canonical 태그 생성 |
baseurl |
(비어 있음) |
"" (명시적 빈 문자열) |
루트 도메인 운영 명시 |
timezone |
(비어 있음) | Asia/Seoul |
KST 기준 날짜 해석 |
future |
(기본값 false) | true |
오늘/미래 날짜 포스트도 빌드/색인 |
4-3. 반영 확인 절차
sequenceDiagram
participant Dev as 작성자
participant Repo as GitHub Repo
participant GHP as GitHub Pages 빌더
participant Site as cmaven.github.io
participant GSC as Search Console
Dev->>Repo: _config.yml 수정 push
Repo->>GHP: Pages 빌드 트리거
GHP->>Site: _site/sitemap.xml 재생성
Dev->>Site: sitemap.xml 직접 열기 (200 OK 확인)
Dev->>GSC: Sitemaps 메뉴에서 재제출
GSC->>Site: sitemap.xml 재크롤링
GSC-->>Dev: Last read 날짜 갱신
[05] 검증 체크리스트
수정 후 다음 항목을 순서대로 확인하면 원인이 제대로 해결됐는지 확실히 판단할 수 있다.
| 순서 | 확인 항목 | 방법 | 기대 결과 |
|---|---|---|---|
| 1 | sitemap 접근 가능 | curl -I https://cmaven.github.io/sitemap.xml |
200 OK |
| 2 | sitemap 내 절대 URL | 브라우저로 sitemap.xml 열기 | <loc>https://cmaven.github.io/...</loc> |
| 3 | 최신 포스트 포함 | sitemap 본문에서 신규 포스트 URL 검색 | 존재 |
| 4 |
lastmod 다양성 |
sitemap 내 <lastmod> 값 비교 |
포스트별로 상이 |
| 5 | robots.txt 허용 | https://cmaven.github.io/robots.txt |
Sitemap: 라인 존재 |
| 6 | GSC 색인 요청 | Search Console → URL 검사 → 색인 생성 요청 | 요청 완료 메시지 |
| 7 | Sitemap 재제출 | GSC → Sitemaps → /sitemap.xml 재제출 |
“성공” 상태 |
[06] 핵심 교훈
6-1. 일반론보다 내 저장소 설정부터
sitemap 미갱신 문제를 검색하면 “크롤링 우선순위가 낮다”, “Search Console UI 지연이다” 같은 일반론이 대부분이다. 모두 성립하는 원인이지만, _config.yml 3줄을 먼저 확인하는 편이 빠르다.
6-2. Jekyll 기본값에서 생기는 문제
| 기본값 | 문제 |
|---|---|
future: false |
오늘 작성한 글이 TZ 차이로 미래글 분류 → sitemap 누락 |
timezone: (비어 있음) |
UTC 해석 → KST 기준 날짜 오판 |
url: (비어 있음) |
minimal-mistakes 템플릿은 비어있는 채로 배포됨 |
6-3. GSC “Last read”는 결과 지표
Sitemap Last read 갱신은 Google이 “다시 읽을 가치가 있다”고 판단했을 때 일어난다. 이를 유도하려면:
- sitemap 내용에 실제 변화가 있어야 함 (
url,lastmod) - sitemap 형식이 올바라야 함 (절대 URL, 정상적인
<loc>) - 사이트에 새로 작성하거나 수정한 콘텐츠가 꾸준히 있어야 함
이번 케이스는 “크롤링 예산 부족”이 아니라 “sitemap에 신규 포스트가 애초에 포함되지 않았던” 문제였다. future: true와 url 설정이 이 문제를 해결했다.
[07] 다음 편 예고
_config.yml 3줄 수정으로 sitemap이 제대로 생성·갱신되기 시작하면, 다음 단계는 sitemap의 내용물 자체를 점검하는 것이다. 자동 생성된 sitemap에는 포스트뿐 아니라 카테고리, 태그, pagination 같은 저가치 archive URL이 함께 들어가 있어서, Google이 sitemap 전체를 저품질로 판단할 수 있다.
3편 에서는 저장소 전체를 SEO 감사하면서 발견한 5가지 문제(저가치 URL 혼재, 검증 메타태그 누락, description 누락 9개, 404 페이지 부재, C/C++ 옛 글 미정리)와 일괄 수정 방법을 정리한다. 이어 4편 은 sitemap 등록 이후 Search Console에 남는 4가지 분류(404/리디렉션/크롤링됨-색인 안 됨/검색됨-크롤링 안 됨)의 잔여 이슈를 noindex 메타태그·trailing slash 정리로 마무리한다.
[08] 참고
-
Jekyll Configuration Docs —
future,timezone기본값 확인 -
jekyll-sitemap GitHub —
site.url의존성