내 컴퓨터 웹서버 만들기 2편:’나만의 꺼지지 않는 무제한 블로그 서버’ 만들기

내 컴퓨터 웹서버 만들기 2편:’나만의 꺼지지 않는 무제한 블로그 서버’ 만들기

안녕하세요! 오늘은 구석에서 잠자고 있던 중고 데스크탑이나 미니 PC를 활용해, 유료 호스팅 부럽지 않은 강력한 워드프레스 블로그 서버를 직접 구축하는 방법을 공유하려고 합니다. 아니면 현재 사용 중인 컴퓨터에 나만의 서버를 구축해 볼수도 있어요!

이 방법은 오래전에 시도 했고 실제 사용해 보기도 했지만, 테스트만 하고 실무에 적용하지는 않았습니다. 그 이유 중 가장 큰 것이 “무료 블로그 플랫폼이 많은데 굳이 이걸 할 필요가 있는가” 하는 당위성 문제였죠. 그리고 내 컴퓨터를 24시간 켜둬야 하니 발생하는 전기세, 그리고 혹시 모를 전원 차단 리스크 등 다양한 문제점 때문에 개인 PC로 블로그 서버를 운영하는 것은 실효성이 떨어진다는 판단 때문이었습니다.

그러다 최근 블로그 이전을 하면서 생각이 바뀌었습니다. 티스토리 블로그를 운영하며 만약의 경우를 대비해 카페24 유료 서버를 보조로 운영 중이었는데, “굳이 비용을 지불하며 유지하는 게 맞나“라는 고민 끝에 현재는 오라클 무료 서버를 운영하고 있습니다. 하지만 오라클 무료 서버는 성능이 아주 좋지는 않아요. 물론 일반적인 블로그 운영에는 큰 문제가 없지만, 블로그에 AI 기능을 적용하거나 기타 무거운 기능을 추가하기에는 다소 부담이 되더라고요.

그래서 현재 사용 중인 고성능 컴퓨터를 서버로 직접 활용해 보면 어떨까 고민하다가, 이번에 재미있는 테스트를 진행해 보려 합니다. 내 컴퓨터를 블로그 서버로 운영하면서 위에서 제기했던 “컴퓨터가 꺼져도 운영 가능하게 만드는 방법”과, 윈도우 작업을 하는 동시에 “백그라운드에서 리눅스 서버를 운영하는 방법”에 대한 자료를 정리해 보겠습니다.

내 컴퓨터를 서버로 활용하기

STEP 1. 윈도우에서 리눅스(WSL2) 환경 구축하기

윈도우 작업을 방해받지 않으면서 백그라운드에서 리눅스 서버를 돌리는 가장 세련된 방법입니다.

1. 터미널 관리자 권한 실행

윈도우 시작 버튼에서‘PowerShell’을 검색한 뒤, 반드시[관리자 권한으로 실행]하세요.

2. WSL 설치 명령어 입력

wsl --install

이 명령어 하나로 가상화 기능 활성화와 Ubuntu 설치가 한 번에 진행됩니다. 설치가 끝나면 반드시컴퓨터를 재부팅해 주세요.

3. 리눅스 계정 설정

재부팅 후 열리는 Ubuntu 창에서 사용할 아이디와 비밀번호를 설정합니다. 비밀번호 입력 시 화면에 글자가 보이지 않는 것은 보안상의 정상이니 당황하지 말고 입력 후 엔터를 치시면 됩니다.

4. 웹 서버 기초 공사 (Nginx 설치)

Ubuntu 터미널에서 아래 명령어를 순서대로 입력해 서버의 기초를 다집니다. 웹서버 설치와 워드프레스 설치는 이링크를 참고 하시면 되요!

sudo apt update
sudo apt install nginx

STEP 2. 내 컴퓨터를 외부 접속 연결하기

집 안에서만 접속되는 서버를 전 세계 어디서든 접속할 수 있게 만드는 과정입니다.

1. 공유기 포트 포워딩

공유기 설정(보통 192.168.0.1)에 접속하여80(HTTP)번과443(HTTPS)번 포트를 내 컴퓨터 IP로 연결해 줍니다.

2. WSL2 포트 프록시 설정 (중요)

윈도우로 들어온 신호를 리눅스로 넘겨주기 위해PowerShell(관리자)에서 아래 코드를 실행하세요. ([WSL2_IP주소] 부분은 리눅스에서hostname -I로 확인한 주소를 넣습니다.)

# 80번 포트 연결
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=[WSL2_IP주소]

# 443번 포트 연결
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=[WSL2_IP주소]

3. Cloudflare(클라우드플레어) DNS 연결

  1. Cloudflare에 접속하여 내 도메인(qcai.kr)의 A 레코드를 추가합니다. 저는 테스트 겸 wsl.qcai.kr이라는 서브 도메인을 연결해 봤어요. 메인 도메인인 qcai.kr의 모든 글을 안전하게 백업하고 보관할 목적으로 이번 작업을 진행했습니다.
  2. IPv4 address:네이버에서 ‘내 IP’를 검색해 나오는 주소를 넣습니다.
  3. Proxy status:주황색 구름(Proxied)을 반드시 켭니다. 이 기능이 내 집 IP를 숨겨주고 보안을 강화합니다.

STEP 3. 유동 IP 자동 업데이트 (Python DDNS)

개인 데스크탑에 외부 접속 설정을 할 때 가장 큰 걸림돌은, 집 인터넷이 고정 IP가 아니라는 점입니다. IP가 언제든지 변경될 수 있기 때문에, 어느 날 갑자기 접속이 안 되는 상황이 발생하곤 하죠. 이를 해결하기 위해 집 인터넷 IP가 바뀌더라도 자동으로 도메인과 연결해 주는 자동화 스크립트를 적용해 보겠습니다. 클라우드플레어를 활용하면 쉽게 적용할수 있어요!

1. 클라우드플레어 API 토큰 발급

프로필의 API Tokens 메뉴에서‘Edit zone DNS’권한을 가진 토큰을 생성해 메모해 두세요.

2. Python 스크립트 작성

리눅스에서vim ddns.py를 입력해 아래 코드를 저장합니다.

import requests

API_TOKEN = "여러분의_API_토큰"
ZONE_ID = "여러분의_ZONE_ID"
RECORD_NAME = "qcai.kr"

def get_public_ip():
 return requests.get('https://api.ipify.org').text

def update_dns(ip):
 headers = {"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"}
 url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records?name={RECORD_NAME}"
 res = requests.get(url, headers=headers).json()
 
 if res['result']:
 record_id = res['result'][0]['id']
 update_url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{record_id}"
 data = {"type": "A", "name": RECORD_NAME, "content": ip, "ttl": 1, "proxied": True}
 requests.put(update_url, headers=headers, json=data)
 print(f"업데이트 성공: {ip}")

if __name__ == "__main__":
 update_dns(get_public_ip())

3. 5분마다 자동 실행 설정

crontab -e를 입력하고 맨 아래에 다음 줄을 추가하세요.

*/5 * * * * /usr/bin/python3 /home/사용자/ddns.py /home/사용자/ddns.log 2&1

STEP 3. 서버가 꺼져도 블로그는 살아남는 ‘3중 방어’

내 컴퓨터가 물리적으로 꺼지더라도 방문자는 여전히 내 글을 읽고, 구글 검색 순위도 떨어지지 않게 만드는 기술적 장치들입니다.

1. Cloudflare ‘Always Online™’ 활성화

가장 먼저 적용해야 할 기술은 클라우드플레어(Cloudflare)의 Always Online 기능입니다.

  • 원리: 클라우드플레어의 전 세계 거점 서버(Edge)들이 내 블로그의 복사본(캐시)을 미리 가지고 있습니다.
  • 효과: 만약 내 집 데스크탑이 꺼져서 응답이 없으면, 클라우드플레어가 대신 나서서 “서버가 잠시 점검 중이지만, 여기 저장된 내용이 있습니다”라며 방문자에게 기존 콘텐츠를 즉시 보여줍니다.
  • 설정: Cloudflare 관리 화면 Caching Configuration Always Online을 ‘On’으로 켜두기만 하면 됩니다.
내 컴퓨터에 서버 구축 방법

2. Internet Archive (Wayback Machine) 영구 보존

클라우드플레어가 실시간 보험이라면, 인터넷 아카이브는 ‘영구 기록물 보관소’입니다.

  • 전략: 우리가 앞서 진행했던 web.archive.org/save 수동 저장을 활용합니다.
  • 방법:‘Save outlinks’ 옵션을 켜고 사이트맵(sitemap.xml)을 제출하면 저는 제글 600여 개의 포스팅이 아카이브 서버로 복사했어요.
  • 장점: 내 컴퓨터 하드웨어가 완전히 고장 나서 데이터를 잃더라도, 전 세계 사람들은 아카이브에 기록된 내 지식 자산을 언제든지 열람할 수 있습니다.
내 컴퓨터에 블로그 서버 운영하기

3. 공격적인 ‘Cache Everything’ 설정 (Page Rules)

서버가 켜져 있을 때 방문자의 브라우저와 클라우드플레어 서버에 내 글을 최대한 꽉꽉 채워 넣는 전략입니다.

  • 방법: Cloudflare의 Page Rules 메뉴에서 예: *qcai.kr/* 경로에 대해 Cache Level: Cache Everything 규칙을 적용합니다.
  • 효과: 이렇게 하면 방문자가 한 번이라도 읽은 글은 내 컴퓨터 서버를 거치지 않고 클라우드플레어 망에서 즉시 뿌려집니다. 서버가 잠시 꺼져도 이미 캐싱된 페이지들은 아무런 지장 없이 노출됩니다.

STEP 4. Cache Everything 설정 방법

이 설정은 내 컴퓨터(서버)가 꺼져도 사이트를 유지시키는 강력한 생존 기능입니다. 하지만 페이지 전체를 고정된 복사본으로 저장하기 때문에, 실시간 광고 로테이션이나 동적 수익 발생에 영향을 줄 수 있습니다. 광고 수익이 중요한 분들은 아래 방법 중 TTL 시간 조절 부분을 반드시 확인해 주세요. 개인 프로젝트나 단순 정보 제공용 홈 서버라면 그대로 진행하셔도 좋습니다.

수식 예제:

(http.request.full_uri wildcard r"*qcai.kr*") and not (http.request.uri.path contains "/wp-admin/" or http.request.uri.path contains "wp-login.php" or http.request.uri.path contains "/wp-json/")

1. 브라우저 TTL (Browser TTL)

방문자의 웹 브라우저가 내 글을 얼마나 오랫동안 보관할지 정하는 설정입니다.

  • 선택:원본을 재정의 및 이 TTL 사용
  • 값:1일 (1 day) 또는 12시간
  • 이유: 너무 길면 내가 글을 수정했을 때 방문자에게 옛날 글이 계속 보일 수 있고, 너무 짧으면 내 서버에 접속 요청이 자주 들어와서 부하가 생깁니다. 하루 정도가 가장 적당합니다.

2. 유효성을 다시 검사하는 동안 부실 콘텐츠 제공

서버가 응답하지 않거나 새로운 내용을 가져오는 중일 때, 기존에 저장된 내용(부실 콘텐츠)이라도 먼저 보여줄지 결정합니다.

  • 설정:끄기 (Off) (스위치를 비활성화하세요)
  • 이유: 우리 집 인터넷이 잠시 끊기거나 IP가 바뀌는 찰나의 순간에도 방문자에게 에러 화면 대신 기존 포스팅 내용을 즉시 보여주기 위한 필수 설정입니다.

3. 원본 오류 페이지 패스스루 (Origin Error Page Pass-through)

  • 설정:끄기 (Off) (기본값 유지 권장)
  • 이유: 이걸 켜두면 내 리눅스 서버가 죽었을 때 리눅스가 내뱉는 투박한 에러 메시지가 그대로 노출됩니다. 꺼두어야 클라우드플레어가 예쁜 디자인의 Always Online 복구 페이지를 대신 보여줍니다.

4. 캐시 키 (Cache Key) – 고급 설정

대부분 기본값으로 두셔도 되지만, 블로그 운영에는 다음 두 가지만 체크하세요.

  • 장치 유형별 캐시:끄기 (모바일과 PC 화면이 동일한 반응형 테마라면 끄는 게 캐시 효율이 더 좋습니다.)
  • 쿼리 문자열 무시:켜기 (URL 뒤에 ?ref=... 같은 쓸데없는 문구가 붙어도 동일한 페이지로 인식해 캐시 효율을 높여줍니다.)

정리: 최종 배포 전 확인

항목설정값
규칙 이름예제: wsl-server-insurance
Edge TTL7일(클라우드플레어 망에 보관할 기간)
브라우저 TTL1일(방문자 컴퓨터에 보관할 기간)
부실 콘텐츠 제공On(서버 접속 안 될 때 보험)

주의: 클라우드플레어에서 ‘주황색 구름(Proxy)켜세요. 이 구름이 꺼져 있으면 모든 트래픽이 클라우드플레어를 거치지 않고 우리 집 컴퓨터로 직접 가버리기 때문에, 방금 만든 캐시 규칙(Cache Rules)이 아무런 일도 할 수 없게 됩니다.

캐시 상태 확인 터미널(CMD)에서 확인하기

윈도우 검색창에 cmd를 입력해 ‘명령 프롬프트’를 열고 아래 명령어를 입력해 보세요.

curl -I https://도메인 (예제: wsl.qcai.kr)

입력 후 나오는 내용 중에 server: cloudflare라는 문구가 한 줄이라도 섞여 있다면 100% 성공입니다.위 설정을 마치고 [배포(Deploy)]를 누른 후에는, 반드시 클라우드플레어 대시보드의 [Caching] -> [Configuration] -> [Purge Everything]을 한 번 눌러주세요. 그래야 새로운 규칙이 전 세계 서버에 즉시 적용됩니다.

클라우드플레어

과거에는 개인 PC로 서버를 운영하는 것이 불안정하고 비효율적인 일로 치부되었습니다. 전기세 걱정, 정전 리스크, 유동 IP 문제 등 넘어야 할 산이 많았기 때문이죠. 하지만 오늘 함께 살펴본 방법들을 조합하면 이야기가 달라집니다.

댓글 남기기