홈서버에 도메인 연결하고 HTTPS 적용하기 – Nginx Proxy Manager 활용

목차

홈서버에 도메인 연결하고 HTTPS 적용하기 – Nginx Proxy Manager 활용

내 방에 설치한 홈서버, 이제 진짜 ‘내 사이트’로 만들려면
도메인 연결과 HTTPS(SSL) 적용이 필수다.

이번 글에서는 초보자도 쉽게 따라 할 수 있도록
Nginx Proxy Manager(NPM)을 이용한 도메인 설정과
무료 SSL 인증서(Let’s Encrypt) 적용 방법
하나씩 실습 중심으로 안내한다.

📌 왜 도메인과 HTTPS가 필요한가?

도메인의 필요성

항목IP 주소도메인
접속 주소http://123.45.67.89:8000https://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특징
DuckDNSduckdns.org무료, 쉬움, Let’s Encrypt 지원
No-IPnoip.com무료(30일마다 연장 필요)
Dynudynu.com무료, 여러 도메인 가능
Afraid.orgfreedns.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. 규칙 추가
항목HTTPHTTPS
서비스 이름HTTPHTTPS
외부 포트80443
내부 IP192.168.0.100192.168.0.100
내부 포트80443
프로토콜TCPTCP

테스트

# 외부 네트워크(모바일 데이터)에서 테스트
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

초기 설정

  1. 관리자 정보 변경
    • Email: 실제 이메일
    • Name: 이름
    • Password: 강력한 비밀번호 (12자 이상)
  2. 저장

🌍 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 Namesmyblog.duckdns.org연결할 도메인
Schemehttp워드프레스는 HTTP (NPM이 HTTPS 처리)
Forward Hostname/IPwordpress-app컨테이너 이름 (또는 IP)
Forward Port80워드프레스 내부 포트
Cache Assets✅ 체크정적 파일 캐싱
Block Common Exploits✅ 체크보안 강화
Websockets Support☐ 체크 안 함워드프레스는 불필요

SSL 탭

SSL CertificateRequest 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 연동
  • 복구 테스트

이제 내 블로그는 외부에서도 안전하게 접속 가능하다.
진짜 인터넷 서비스가 된 것! 🌐

댓글 남기기

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.