이 글은 Hugo + PaperMod 블로그 세팅 시리즈의 마지막 글이다.
- Hugo + PaperMod로 기술 블로그 만들기
- NCP 서버에 Hugo 블로그 배포하기
- 커스텀 도메인 연결과 Let’s Encrypt SSL 설정 ← 현재 글
진행 순서
도메인과 SSL 설정에는 순서가 있다. 순서가 바뀌면 인증서 발급이 실패한다.
도메인 구매 → DNS A 레코드 설정 → Nginx server_name 변경
→ hugo.toml baseURL 변경 → certbot SSL 발급 → 재배포
1. 도메인 구매
도메인 구매처는 여러 곳이 있다:
| 업체 | 특징 |
|---|---|
| Cloudflare | 원가 판매, DNS 관리 편리 |
| 가비아 | 국내 최대, 한글 지원 |
| NCP | 서버와 같은 곳에서 관리 |
나는 Cloudflare를 선택했다. DNS 관리 UI가 깔끔하고 추가 비용이 없다.
.dev 도메인 참고사항
.dev는 Google이 관리하는 TLD로, HSTS preload가 적용되어 있다. 즉:
- 모든
.dev도메인은 브라우저에서 HTTPS만 허용 - HTTP로는 접속 자체가 불가
- SSL 설정이 필수
기술 블로그에 어울리는 도메인이지만, SSL 없이는 쓸 수 없다는 점을 알고 있어야 한다.
2. DNS 설정
Cloudflare DNS에서 A 레코드를 추가한다:
| Type | Name | Content | Proxy |
|---|---|---|---|
| A | @ | 서버IP | DNS only |
중요: Proxy를 반드시 꺼야 한다 (회색 구름). Cloudflare 프록시가 켜져 있으면 서버 IP가 Cloudflare로 대체되어 Let’s Encrypt 인증서 발급이 복잡해진다.
DNS 전파 확인:
dig +short dbalog.dev
# 서버IP가 나오면 성공
보통 Cloudflare는 수 분 내로 전파된다.
3. Hugo 설정 변경
hugo.toml의 baseURL을 변경한다:
# 변경 전
baseURL = "https://example.com/"
# 변경 후
baseURL = "https://dbalog.dev/"
이 값은 sitemap, RSS, 메타 태그 등 블로그 전체에서 사용되므로 반드시 변경해야 한다.
4. Nginx server_name 변경
deploy/nginx/blog.conf:
server_name dbalog.dev; # IP 또는 example.com에서 변경
서버에 반영:
scp deploy/nginx/blog.conf ncp-blog:/etc/nginx/conf.d/blog.conf
ssh ncp-blog "nginx -t && systemctl reload nginx"
5. Let’s Encrypt SSL 인증서 발급
certbot 설치
Rocky Linux 9 기본 저장소에는 certbot이 없다. EPEL 저장소를 먼저 추가한다.
ssh ncp-blog "dnf install -y epel-release"
ssh ncp-blog "dnf install -y certbot python3-certbot-nginx"
인증서 발급
certbot의 --nginx 플러그인이 인증서 발급과 Nginx 설정 수정을 한번에 처리한다.
ssh ncp-blog "certbot --nginx -d dbalog.dev \
--non-interactive \
--agree-tos \
--email your@email.com \
--redirect"
--nginx: Nginx 설정을 자동으로 수정--redirect: HTTP→HTTPS 301 리다이렉트 자동 추가--non-interactive: 대화형 프롬프트 없이 실행
성공하면 이런 메시지가 나온다:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/dbalog.dev/fullchain.pem
Key is saved at: /etc/letsencrypt/live/dbalog.dev/privkey.pem
This certificate expires on 2026-07-09.
certbot이 Nginx에 추가한 설정
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/dbalog.dev/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dbalog.dev/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
그리고 HTTP→HTTPS 리다이렉트를 위한 별도 server 블록:
server {
if ($host = dbalog.dev) {
return 301 https://$host$request_uri;
}
listen 80;
server_name dbalog.dev;
return 404;
}
인증서 자동 갱신
Let’s Encrypt 인증서는 90일마다 만료된다. certbot이 systemd 타이머를 자동 등록하므로 수동 갱신이 필요 없다.
갱신 테스트:
ssh ncp-blog "certbot renew --dry-run"
6. 재배포
baseURL이 변경되었으므로 빌드 후 재배포한다.
./deploy.sh
확인
# HTTPS 접속
curl -s -o /dev/null -w "%{http_code}" https://dbalog.dev/
# 200
# HTTP → HTTPS 리다이렉트
curl -s -o /dev/null -w "%{http_code}" http://dbalog.dev/
# 301
브라우저에서 https://dbalog.dev/에 접속하면 자물쇠 아이콘이 표시된다.
시리즈 마무리
3편에 걸쳐 Hugo 블로그를 처음부터 세팅했다:
- Hugo + PaperMod 설치 및 설정
- NCP 서버에 Nginx + rsync 배포
- 도메인 연결 + SSL 인증서
이제 남은 건 글을 쓰는 것뿐이다. 마크다운 파일을 만들고, ./deploy.sh를 실행하면 끝.