홈서버에 도메인 연결하고 HTTPS 적용하기 – Nginx Proxy Manager 활용
내 방에 설치한 홈서버, 이제 진짜 ‘내 사이트’로 만들려면
도메인 연결과 HTTPS(SSL) 적용이 필수다.
이번 글에서는 초보자도 쉽게 따라 할 수 있도록
Nginx Proxy Manager(NPM)을 이용한 도메인 설정과
무료 SSL 인증서(Let’s Encrypt) 적용 방법을
하나씩 실습 중심으로 안내한다.
📌 왜 도메인과 HTTPS가 필요한가?
도메인의 필요성
| 항목 | IP 주소 | 도메인 |
|---|---|---|
| 접속 주소 | http://123.45.67.89:8000 | https://myblog.com |
| 외우기 | ❌ 어려움 | ✅ 쉬움 |
| 신뢰성 | ❌ 낮음 | ✅ 높음 |
| SEO | ❌ 불리 | ✅ 유리 |
| 브랜딩 | ❌ 불가능 | ✅ 가능 |
HTTPS의 필요성
| 항목 | HTTP (없으면) | HTTPS (있으면) |
|---|---|---|
| 브라우저 경고 | ❌ “안전하지 않음” 표시 | ✅ 🔒 자물쇠 표시 |
| 데이터 암호화 | ❌ 평문 전송 | ✅ 암호화 전송 |
| 구글 SEO | ❌ 순위 불이익 | ✅ 순위 우대 |
| 애드센스 | ❌ 승인 어려움 | ✅ 필수 조건 |
| 신뢰도 | ❌ 방문자 불안 | ✅ 안전한 사이트 |
결론: 도메인 + HTTPS는 선택이 아닌 필수!
🎯 전체 구성도
인터넷
↓
공유기 (포트포워딩: 80, 443)
↓
홈서버 (192.168.0.100)
↓
Nginx Proxy Manager (리버스 프록시 + SSL)
↓
워드프레스 컨테이너 (8000 포트)
🌐 Step 1: 도메인 준비하기 (3가지 방법)
방법 1: 무료 DDNS 도메인 (초보자 추천) ⭐⭐⭐⭐⭐
DuckDNS 설정
# 1. DuckDNS 가입
https://www.duckdns.org/ 접속
→ GitHub, Google 등으로 로그인
# 2. 도메인 생성
Sub Domain: myblog
→ add domain
결과: myblog.duckdns.org
# 3. 현재 IP 등록
→ Current IP 확인 (자동 입력됨)
→ update ip
# 4. Token 복사 (나중에 자동 업데이트에 사용)
Token: abcd1234-5678-90ef-ghij-klmnopqrstuv
다른 무료 DDNS 서비스
| 서비스 | URL | 특징 |
|---|---|---|
| DuckDNS | duckdns.org | 무료, 쉬움, Let’s Encrypt 지원 |
| No-IP | noip.com | 무료(30일마다 연장 필요) |
| Dynu | dynu.com | 무료, 여러 도메인 가능 |
| Afraid.org | freedns.afraid.org | 무료, 다양한 TLD |
방법 2: 유료 도메인 구매 (장기 운영 시) ⭐⭐⭐⭐
추천 도메인 등록 업체
| 업체 | .com 가격 | 특징 |
|---|---|---|
| 가비아 | ₩15,000/년 | 한국 대표, 한글 지원 |
| 후이즈 | ₩13,000/년 | 저렴, 간편 |
| Namecheap | $8.88/년 | 해외, 저렴, WHOIS 무료 |
| Cloudflare | $9.77/년 | 도매가, DNS 빠름 |
도메인 구매 후 DNS 설정
# 도메인 관리 페이지에서
DNS 관리 → A 레코드 추가
Type: A
Name: @ (또는 www)
Value: 내 홈서버 외부 IP (예: 123.45.67.89)
TTL: 3600
저장
방법 3: Cloudflare로 DNS 관리 (고급, 권장) ⭐⭐⭐⭐⭐
# 1. Cloudflare 가입
https://www.cloudflare.com
# 2. 사이트 추가
Add a Site → 도메인 입력 → Free 플랜
# 3. DNS 레코드 자동 가져오기
→ Continue
# 4. 네임서버 변경
도메인 등록 업체에서 네임서버를 Cloudflare NS로 변경
예: ns1.cloudflare.com, ns2.cloudflare.com
# 5. DNS 레코드 확인
Type: A
Name: @
Content: 내 홈서버 IP
Proxy status: DNS only (회색 구름) ← 중요!
# DDNS 자동 업데이트 스크립트 (동적 IP 대응)
아래 별도 섹션 참고
🔌 Step 2: 공유기 포트포워딩 설정
포트포워딩이란?
외부에서 내 홈서버로 접속하려면 공유기가 트래픽을 전달해야 함
설정 방법 (공유기 관리 페이지)
# 1. 공유기 관리 페이지 접속
브라우저에서: http://192.168.0.1 (또는 192.168.1.1)
아이디/비밀번호: admin/admin (또는 공유기 뒷면 참고)
# 2. 포트포워딩 메뉴 찾기
고급 설정 → NAT/라우터 관리 → 포트포워딩
(공유기마다 메뉴 이름 다름)
# 3. 규칙 추가
| 항목 | HTTP | HTTPS |
|---|---|---|
| 서비스 이름 | HTTP | HTTPS |
| 외부 포트 | 80 | 443 |
| 내부 IP | 192.168.0.100 | 192.168.0.100 |
| 내부 포트 | 80 | 443 |
| 프로토콜 | TCP | TCP |
테스트
# 외부 네트워크(모바일 데이터)에서 테스트
http://내도메인
또는
https://www.yougetsignal.com/tools/open-ports/
→ 포트 80, 443 Open 확인
주의사항
- ⚠️ ISP가 80/443 포트 차단 시: 8080, 8443 등 대체 포트 사용
- ⚠️ 이중 NAT: 공유기 2개 이상 연결 시 양쪽 모두 설정 필요
- ⚠️ 방화벽: 서버 방화벽도 80, 443 허용 필요
🔧 Step 3: Nginx Proxy Manager 설치
NPM이란?
Nginx Proxy Manager는 웹 GUI로 쉽게 리버스 프록시와 SSL을 관리하는 도구
장점:
- ✅ 명령어 없이 웹에서 클릭만으로 설정
- ✅ Let’s Encrypt SSL 자동 발급/갱신
- ✅ 여러 도메인/서브도메인 관리 가능
- ✅ Access List (접근 제어) 기능
docker-compose.yml 작성
# NPM 전용 디렉토리 생성
mkdir ~/nginx-proxy-manager
cd ~/nginx-proxy-manager
# docker-compose.yml 생성
nano docker-compose.yml
내용:
version: '3.8'
services:
npm:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80' # HTTP
- '81:81' # 관리 페이지
- '443:443' # HTTPS
volumes:
- npm-data:/data
- npm-letsencrypt:/etc/letsencrypt
environment:
DB_SQLITE_FILE: "/data/database.sqlite"
networks:
- npm-network
volumes:
npm-data:
driver: local
npm-letsencrypt:
driver: local
networks:
npm-network:
driver: bridge
실행
# 시작
docker compose up -d
# 로그 확인
docker compose logs -f
# 정상 실행 확인
docker ps
관리 페이지 접속
http://서버IP:81
기본 로그인 정보:
Email: [email protected]
Password: changeme
초기 설정
- 관리자 정보 변경
- Email: 실제 이메일
- Name: 이름
- Password: 강력한 비밀번호 (12자 이상)
- 저장
🌍 Step 4: 워드프레스와 NPM 연결
네트워크 구성 (중요!)
워드프레스 컨테이너와 NPM이 같은 네트워크에 있어야 함
# 방법 1: 기존 워드프레스를 NPM 네트워크에 추가
# wordpress docker-compose.yml 수정
version: '3.8'
services:
wordpress:
# ... 기존 설정 ...
networks:
- wordpress-network
- npm-network # 추가
networks:
wordpress-network:
npm-network:
external: true
name: nginx-proxy-manager_npm-network
# 재시작
docker compose down
docker compose up -d
# 방법 2: NPM과 워드프레스를 같은 compose 파일로 관리 (권장)
# 별도 섹션에서 통합 예제 제공
🔐 Step 5: SSL 인증서 발급 및 프록시 설정
Proxy Host 추가
# NPM 관리 페이지 (http://서버IP:81)
1. Hosts → Proxy Hosts → Add Proxy Host
Details 탭
| 항목 | 값 | 설명 |
|---|---|---|
| Domain Names | myblog.duckdns.org | 연결할 도메인 |
| Scheme | http | 워드프레스는 HTTP (NPM이 HTTPS 처리) |
| Forward Hostname/IP | wordpress-app | 컨테이너 이름 (또는 IP) |
| Forward Port | 80 | 워드프레스 내부 포트 |
| Cache Assets | ✅ 체크 | 정적 파일 캐싱 |
| Block Common Exploits | ✅ 체크 | 보안 강화 |
| Websockets Support | ☐ 체크 안 함 | 워드프레스는 불필요 |
SSL 탭
| SSL Certificate | Request a new SSL Certificate |
| Force SSL | ✅ 체크 (HTTP → HTTPS 자동 리다이렉트) |
| HTTP/2 Support | ✅ 체크 |
| HSTS Enabled | ✅ 체크 |
| HSTS Subdomains | ☐ (서브도메인 없으면 체크 안 함) |
| Use a DNS Challenge | ☐ (일반적으로 불필요) |
| Email Address | [email protected] |
| I Agree | ✅ 체크 (Let’s Encrypt 약관 동의) |
[ Save ] 클릭
인증서 발급 과정
1. Let's Encrypt 서버에 인증 요청
2. HTTP-01 Challenge (80 포트로 확인)
3. 인증 성공 → 인증서 발급
4. 자동 설치 및 활성화
소요 시간: 30초~1분
문제 발생 시
# 로그 확인
docker compose logs npm
# 일반적인 오류
1. "Port 80 unavailable" → 다른 서비스가 80 포트 사용 중
2. "DNS verification failed" → 도메인 DNS 설정 확인
3. "Connection timeout" → 포트포워딩 확인
🧪 Step 6: 외부 접속 테스트
테스트 체크리스트
# 1. 모바일 데이터로 접속 (Wi-Fi 끄기)
https://myblog.duckdns.org
# 2. 브라우저 확인
✅ 주소창에 🔒 자물쇠 표시
✅ "연결이 안전함" 또는 "Connection is secure"
✅ 워드프레스 사이트 정상 로드
# 3. SSL 인증서 확인
자물쇠 클릭 → 인증서 보기
발급자: Let's Encrypt
유효기간: 90일 (자동 갱신됨)
# 4. HTTP → HTTPS 리다이렉트 확인
http://myblog.duckdns.org 접속
→ 자동으로 https://myblog.duckdns.org로 이동
SSL Labs 테스트
https://www.ssllabs.com/ssltest/
→ 도메인 입력 → Test
→ A 또는 A+ 등급 목표
⚙️ Step 7: 워드프레스 URL 설정 변경
중요! 워드프레스에게 새 도메인 알려주기
# 방법 1: 관리자 페이지에서
설정 → 일반
WordPress 주소 (URL): https://myblog.duckdns.org
사이트 주소 (URL): https://myblog.duckdns.org
→ 변경사항 저장
# 방법 2: wp-config.php 수정 (더 안전)
docker exec -it wordpress-app bash
nano /var/www/html/wp-config.php
# 추가
define('WP_HOME', 'https://myblog.duckdns.org');
define('WP_SITEURL', 'https://myblog.duckdns.org');
# 저장 후 재시작
exit
docker restart wordpress-app
🔄 Step 8: 동적 IP 자동 업데이트 (DDNS)
DuckDNS 자동 업데이트 스크립트
# 스크립트 생성
nano ~/duckdns-update.sh
내용:
#!/bin/bash
TOKEN="your-duckdns-token"
DOMAIN="myblog"
echo url="https://www.duckdns.org/update?domains=$DOMAIN&token=$TOKEN&ip=" | curl -k -o ~/duckdns.log -K -
# 로그 확인
cat ~/duckdns.log
# 실행 권한
chmod +x ~/duckdns-update.sh
# 테스트
./duckdns-update.sh
cat ~/duckdns.log # "OK" 출력되면 성공
# Cron으로 5분마다 자동 실행
crontab -e
# 추가
*/5 * * * * ~/duckdns-update.sh >/dev/null 2>&1
Cloudflare DDNS 스크립트
# Cloudflare API Token 필요
# cloudflare-ddns.sh 생성
#!/bin/bash
API_TOKEN="your-cloudflare-api-token"
ZONE_ID="your-zone-id"
RECORD_ID="your-record-id"
DOMAIN="myblog.com"
IP=$(curl -s https://api.ipify.org)
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$DOMAIN\",\"content\":\"$IP\",\"ttl\":120,\"proxied\":false}"
💡 고급 설정 및 팁
1. 서브도메인 추가
# NPM에서 새 Proxy Host 추가
blog.myblog.com → wordpress-app:80
admin.myblog.com → npm:81 (관리 페이지)
files.myblog.com → nextcloud:80 (파일 서버)
2. Access List (접근 제어)
# NPM → Access Lists → Add Access List
Authorization:
- HTTP Basic Auth (아이디/비밀번호)
- IP Whitelist (특정 IP만 허용)
→ Proxy Host에 적용
3. 커스텀 Nginx 설정
# Proxy Host → Advanced 탭
Custom Nginx Configuration:
# 업로드 크기 제한
client_max_body_size 100M;
# 타임아웃 설정
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
🚨 문제 해결
문제 1: “Too Many Requests” (인증서 발급 실패)
원인: Let’s Encrypt 주당 발급 제한 (도메인당 50개)
해결:
# 1주일 대기
# 또는 Staging 환경으로 테스트
SSL 탭 → Use a DNS Challenge 체크 해제
→ Staging 옵션 확인
문제 2: “502 Bad Gateway”
원인: NPM이 워드프레스 컨테이너에 접근 불가
해결:
# 네트워크 확인
docker network ls
docker network inspect nginx-proxy-manager_npm-network
# 워드프레스 컨테이너 이름 확인
docker ps
# Forward Hostname 수정
wordpress-app (컨테이너 이름)
또는
192.168.0.100:8000 (호스트 IP:포트)
문제 3: 내부에서는 되는데 외부에서 안 됨
# 포트포워딩 재확인
1. 공유기 설정 확인
2. 외부 IP 확인: curl ifconfig.me
3. 포트 오픈 테스트: https://www.yougetsignal.com/tools/open-ports/
4. ISP 차단 여부 확인 (통신사 고객센터 문의)
📝 정리하며
이번 글에서 배운 내용:
핵심 요약
- ✅ 도메인 3가지 방법: 무료 DDNS, 유료 도메인, Cloudflare
- ✅ 공유기 포트포워딩: 80, 443
- ✅ Nginx Proxy Manager: 웹 GUI로 쉬운 SSL 관리
- ✅ Let’s Encrypt: 무료 SSL 인증서 자동 발급/갱신
- ✅ DDNS: 동적 IP 자동 업데이트
완성된 구조
myblog.duckdns.org (도메인)
↓ HTTPS (443)
Nginx Proxy Manager (리버스 프록시 + SSL)
↓ HTTP (80)
WordPress (컨테이너)
↓
MySQL (컨테이너)
다음 단계
다음 글에서는 홈서버의 워드프레스 데이터를 자동으로 백업하고,
실수나 고장 시 복구할 수 있는 방법을 정리할 예정이다.
- UpdraftPlus 자동 백업 스케줄
- Docker 볼륨 백업 스크립트
- Google Drive 연동
- 복구 테스트
이제 내 블로그는 외부에서도 안전하게 접속 가능하다.
진짜 인터넷 서비스가 된 것! 🌐
댓글 남기기