웹사이트를 배포하는 방법은 정말 다양해요. 버튼 몇 번만 누르면 배포가 끝나는 무료 호스팅 서비스도 많죠. 하지만 직접 리눅스 웹서버를 구축하고, 네트워크를 설정하고, 도메인을 연결해서 서비스를 운영해보는 경험은 그런 원클릭 배포와는 완전히 다른 걸 남겨줘요. 특히 실무에서는 서버 관리, 네트워크, 보안 지식이 생각보다 훨씬 자주 필요해지는데, 이런 감각은 직접 삽질을 해봐야 몸에 익거든요.
저는 실제로 집에 리눅스 서버를 구축해서 UPS와 함께 2년 넘게 여러 웹사이트를 운영하고 있는데, 그동안 겪었던 시행착오와 노하우를 이번 글에 최대한 녹여봤어요.
그래서 오늘은 처음 웹호스팅에 도전하시는 분들도 쉽게 따라올 수 있도록, 웹서버 하드웨어 준비부터 운영체제 기본 보안 설정, Cloudflare Tunnel로 도메인을 연결하는 방법, 그리고 실무에서 바로 써먹을 수 있는 Cloudflare 규칙 설정까지 처음부터 끝까지 차근차근 알려드릴게요.
참고: 이 글은 2026년 8월 기준으로 작성되었어요. Cloudflare 대시보드 UI나 메뉴 이름은 수시로 바뀔 수 있으니, 스크린샷과 실제 화면이 조금 다르게 보이더라도 당황하지 마시고 비슷한 메뉴를 찾아 진행해주시면 돼요.
1. 왜 직접 웹서버를 구축할까?
먼저 "그냥 서버를 임대하면 되지, 왜 굳이 비싼 서버를 사서 집에 두나요?"라는 질문을 많이 받아요. 결론부터 말씀드리면, 비용만 놓고 보면 대부분의 경우 임대형 서버(VPS)나 클라우드 호스팅이 더 합리적이에요. 그럼에도 제가 홈 웹서버를 추천하는 이유는 이 글의 목적 자체가 "실무에 도움이 되는 경험을 쌓는 것"이기 때문이에요.
홈 웹서버의 장점
- 트래픽 제한이 없어요. 대부분의 임대형 서버는 트래픽 한도가 정해져 있고, 이를 초과하면 추가 비용이 발생해요. 직접 서버를 소유하면 회선이 감당하는 한 트래픽 걱정이 없어요.
- 장기적으로는 비용이 역전될 수 있어요. 초기 투자금은 크지만, 장기간 여러 프로젝트를 운영할 계획이라면 매달 임대료를 내는 것보다 총비용이 낮아지는 시점이 와요.
- 네트워크, 리눅스, 보안을 몸으로 배울 수 있어요. 클라우드 콘솔에서 클릭 몇 번으로 끝나는 작업들을 직접 처음부터 구성해보면, 장애가 났을 때 원인을 추적하는 감각이 확실히 달라져요.
홈 웹서버의 단점 (미리 알아두세요)
- 전기세와 소음, 발열 관리가 필요해요. 24시간 켜두는 만큼 전력 효율이 좋은 부품을 골라야 해요.
- 가정용 인터넷 회선은 대부분 유동 IP예요. 다행히 뒤에서 소개할 Cloudflare Tunnel을 쓰면 이 문제는 사실상 해결돼요.
- 일부 ISP 약관은 가정용 회선에서 서버(특히 인바운드 서비스) 운영을 제한하기도 해요. 상용 서비스로 키울 계획이라면 가입하신 통신사 약관을 한 번 확인해보시는 걸 추천해요.
- 정전, 하드웨어 고장 등 장애 대응을 스스로 해야 해요. 그래서 UPS와 이중화 설계가 중요해요. (아래에서 자세히 다룰게요.)
가벼운 개인 프로젝트나 학습용이라면 홈 웹서버로 시작해도 충분하고, 나중에 트래픽이 커지면 그때 클라우드로 옮기는 것도 좋은 전략이에요.
2. 웹서버 하드웨어 준비하기
시작하기 전에 준비물 체크리스트
- 24시간 구동할 컴퓨터(미니 PC, 중고 서버, 또는 예전에 쓰던 데스크탑)
- UPS(무정전 전원 장치)
- 유선 랜 케이블과 공유기
- 보유 중이거나 새로 구매할 도메인
- Cloudflare 계정 (무료로 가입 가능)
CPU와 메모리 선택
집에서 24시간 돌리는 서버인 만큼, 저전력·저소음 세팅이 최우선이에요. 와이파이보다는 반드시 이더넷(유선)으로 연결해야 끊김 없는 안정적인 호스팅이 가능해요.
시중에 좋은 서버용 하드웨어가 워낙 많아서 특정 모델을 콕 집어 추천하기보다는, 규모에 따른 대략적인 스펙 가이드를 드릴게요.
| 사용 목적 | 월 평균 방문자 | 추천 스펙 |
|---|---|---|
| 가벼운 개인 프로젝트 여러 개 | 1만명에서 5만 명 | 저전력 CPU(Intel N100/N305 계열 미니 PC 등) + RAM 16~32GB |
| 아주 가벼운 정적 사이트, 학습용 | 1만 명 이하 | 라즈베리 파이 같은 ARM 보드도 충분히 가능 |
| 무거운 프로젝트, 다중 서비스 | 5만 명 이상 | Dell, HP, Lenovo, Supermicro 등 기업용 랙서버 |
기업용 서버를 사용할 정도로 규모가 커지면 소음이 상당히 커지기 때문에, 오피스텔이나 IDC(데이터센터)의 서버실 랙 일부를 임대해서 서버를 넣어두는 방식(코로케이션)도 고려해볼 만해요.
안정성을 위한 필수 요소
- UPS(무정전 전원 장치)는 필수예요. 웹서버는 24시간 동작해야 하므로, 갑작스러운 정전에도 서비스를 지속하거나 최소한 안전하게 종료할 수 있어야 해요. 리눅스에서는 NUT(Network UPS Tools) 같은 소프트웨어로 UPS와 연동해, 정전 시 배터리가 일정 수준 이하로 떨어지면 서버를 자동으로 안전하게 종료(graceful shutdown)하도록 구성할 수 있어요.
- RAID와 이중화 구조를 설계하세요.
- RAID 1(미러링): 디스크 2개에 같은 데이터를 복제해요. 디스크 하나가 죽어도 서비스가 유지돼요.
- RAID 5/6(패리티 기반): 여러 디스크에 데이터와 패리티 정보를 분산 저장해서, 디스크 1~2개가 고장 나도 복구할 수 있어요.
- RAID 10: 미러링과 스트라이핑을 결합해 성능과 안정성을 동시에 잡는 구성이에요.
- 핫스왑(Hot-swap) 베이를 지원하는 케이스나 서버를 쓰면, 서버 전원을 끄지 않고도 고장 난 디스크를 교체할 수 있어요.
- 서버에는 GUI 대신 CLI 버전의 리눅스를 설치하세요. 비싼 돈 주고 좋은 서버를 샀는데, 데스크탑 환경(GUI)이 CPU와 메모리 리소스를 잡아먹을 이유가 없잖아요.
3. 운영체제 설치와 기본 보안 설정
하드웨어를 준비하셨다면 이제 운영체제 차례예요. 초보자에게는 장기 지원(LTS) 버전이 있고 커뮤니티 자료가 풍부한 Ubuntu Server LTS를 추천드려요. 설치할 때는 반드시 Server(CLI) 버전을 선택해주세요.
설치가 끝나고 서버에 처음 접속했다면, 다음 순서로 기본 보안 설정을 해두는 걸 강력히 추천해요. 인터넷에 노출되는 서버인 만큼, 이 단계를 건너뛰면 얼마 지나지 않아 자동화된 무차별 대입 공격(brute-force)의 표적이 될 수 있어요.
1) 시스템 업데이트 및 일반 사용자 계정 생성
sudo apt update && sudo apt upgrade -y
# root 대신 사용할 일반 계정 생성 후 sudo 권한 부여
sudo adduser myuser
sudo usermod -aG sudo myuser
2) SSH 키 인증으로 전환하고 비밀번호/root 로그인 비활성화
로컬 PC에서 키 쌍을 만들고 서버에 공개키를 등록해요.
ssh-keygen -t ed25519
ssh-copy-id myuser@서버IP
키로 접속이 되는 걸 확인한 뒤, 서버의 /etc/ssh/sshd_config에서 비밀번호 로그인과 root 직접 로그인을 막아주세요.
PasswordAuthentication no
PermitRootLogin no
sudo systemctl restart ssh
3) 방화벽(ufw) 설정
sudo apt install -y ufw
sudo ufw allow OpenSSH
sudo ufw enable
팁: 뒤에서 설명할 Cloudflare Tunnel을 쓰면 웹서비스용으로는 80/443 포트조차 열 필요가 없어요. Tunnel은 서버에서 Cloudflare로 나가는 아웃바운드 연결만 사용하기 때문에, 방화벽에는 관리용 SSH 포트 정도만 열어두면 충분해요. 이것만으로도 공격 표면이 크게 줄어드는 셈이죠.
4) 무차별 대입 공격 방어와 자동 보안 업데이트
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
<br>
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
여기까지 하셨다면 서버는 기본적인 방어선을 갖춘 상태예요. 이제 진짜 재미있는 부분, Cloudflare로 도메인을 연결해볼게요.
4. Cloudflare Tunnel로 도메인 연결하기
서버를 인터넷에 노출하려면 보통 공유기 포트포워딩, 고정 IP 설정 같은 복잡한 과정을 거쳐야 해요. 게다가 가정용 회선은 대부분 IP가 수시로 바뀌는 유동 IP라서 이 방식은 유지보수도 번거로워요.
하지만 Cloudflare Tunnel을 쓰면 이런 복잡한 설정 없이도 안전하게 서비스를 노출할 수 있어요.
Cloudflare Tunnel의 원리
Cloudflare Tunnel은 서버에 설치한 cloudflared라는 데몬이 Cloudflare 네트워크로 아웃바운드(나가는) 연결만 맺는 방식이에요. 즉, 서버가 Cloudflare에 "저 여기 있어요"라고 먼저 말을 거는 구조라서, 공유기에서 인바운드 포트를 열어줄 필요가 없고 고정 IP도 필요 없어요. 이후 요청이 들어오면 Cloudflare가 이 터널을 통해 서버로 트래픽을 전달해주는 거예요.
사전 준비: 도메인을 Cloudflare에 연결하기
Tunnel로 특정 도메인/서브도메인에 트래픽을 라우팅하려면, 그 도메인의 DNS를 Cloudflare가 관리하고 있어야 해요. 즉 아래 둘 중 하나가 필요해요.
- dash.cloudflare.com에서 새 도메인을 구매하기
- 이미 갖고 있는 도메인을 Cloudflare에 "사이트 추가(Add a Site)"로 등록하고, 도메인 등록기관(예: 가비아, 후이즈 등)에서 네임서버(NS)를 Cloudflare가 안내하는 주소로 변경하기
참고: 도메인을 아예 Cloudflare로 이전(등록기관 이전)하면 대부분 남은 기간에 1년이 추가되는 경우가 많아서, 만료일이 많이 남지 않았다면 이전을 고려해보는 것도 좋아요. 다만 네임서버만 Cloudflare로 바꾸는 것도 Tunnel을 쓰기에는 충분해요.
네임서버 변경은 전파되는 데 몇 분에서 최대 24시간 정도 걸릴 수 있으니, 미리 해두고 다음 단계를 진행하시는 걸 추천해요.
4-1. Cloudflare 대시보드에서 터널 만들기

dash.cloudflare.com에 로그인하면 이런 화면이 나와요. 여기서 Zero Trust(또는 Networking) 영역으로 들어가주세요.

네트워크(Networking) → 커넥터 메뉴로 들어가서 '터널 만들기(Create a tunnel)'를 클릭해주세요.

커넥터 유형 중 'Cloudflared'를 선택해주세요.
터널 이름은 나중에 여러 개를 관리할 걸 대비해서 '도메인 이름 - 용도(Backend/Frontend)' 형식으로 짓는 걸 추천해요. 예: myapp.com-frontend

터널을 만들면 운영체제별 설치 명령어가 표시돼요. 여기서 cloudflared service install {{ 토큰 }} 형태의 명령어 중, install 뒤에 있는 실제 토큰 값만 복사해두세요. 아래에서 이 토큰을 사용할 거예요.
4-2. 리눅스 서버에 cloudflared 설치하기
이제 리눅스 웹서버의 터미널에 접속해서 진행할게요.
sudo apt update
sudo apt install -y curl ca-certificates gnupg
Cloudflare 공식 패키지 저장소를 추가할게요. 키 디렉터리를 먼저 만들고, Cloudflare의 공개키를 그대로 저장해요. (Cloudflare가 배포하는 키 파일은 이미 올바른 형식이라 별도로 gpg --dearmor로 변환할 필요는 없어요.)
sudo mkdir -p --mode=0755 /usr/share/keyrings
<br>
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
| sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
저장소를 등록해주세요. any는 데비안 계열 배포판 전반에서 공통으로 동작하는 채널이라 Ubuntu 버전을 매번 신경 쓰지 않아도 돼요.
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' \
| sudo tee /etc/apt/sources.list.d/cloudflared.list
이제 설치해볼게요.
sudo apt update
sudo apt install -y cloudflared
4-3. systemd 서비스로 등록하기
Cloudflare Tunnel이 서버가 재부팅되어도 자동으로 실행되도록 systemd 서비스로 등록해볼게요.
더 빠른 방법도 있어요: 사실
sudo cloudflared service install {{ 토큰 }}명령어 한 줄이면 아래 과정을 전부 자동으로 처리해줘요. 다만 이 글은 "서버가 어떻게 동작하는지 이해하는 것"이 목적이라, systemd 서비스를 직접 만들어보는 방식으로 안내할게요. 원리를 이해하신 뒤에는 자동 설치 명령어를 쓰셔도 무방해요.
서비스 파일을 만들어주세요.
sudo nano /etc/systemd/system/{{ 서비스이름 }}.service
{{ 서비스이름 }}은 원하는 이름으로 바꿔주세요. 파일이 열리면 아래 내용을 입력해주세요. systemd는 설정 키의 대소문자를 구분하니, Wants=처럼 정확한 표기를 지켜야 해요.
[Unit]
Description={{ 서비스이름 }}
After=network-online.target
Wants=network-online.target
<br>
[Service]
Type=simple
User=root
ExecStart=/usr/bin/cloudflared tunnel --no-autoupdate run --token {{ 토큰 }}
Restart=always
RestartSec=5
TimeoutStartSec=0
<br>
[Install]
WantedBy=multi-user.target
{{ 서비스이름 }}과 {{ 토큰 }}을 앞서 준비한 값으로 바꾸신 뒤, Ctrl + X → Y → Enter로 저장해주세요.
systemd가 새 서비스 파일을 인식하도록 설정을 다시 불러오고, 부팅 시 자동 실행되도록 등록한 뒤 바로 실행해볼게요.
sudo systemctl daemon-reload
sudo systemctl enable {{ 서비스이름 }}
sudo systemctl start {{ 서비스이름 }}
<br>
# 정상 동작 여부 확인
sudo systemctl status {{ 서비스이름 }}

여기까지 정상적으로 진행됐다면, Cloudflare 대시보드의 커넥터 목록에 내 서버가 'Healthy' 상태로 표시될 거예요.
4-4. 트래픽 라우팅(Public Hostname 연결)하기
이제 '다음' 버튼을 눌러 실제 트래픽을 어디로 보낼지 라우팅을 설정해볼게요.

도메인 목록에서 내 도메인을 선택하고, 하위 도메인을 입력해주세요. 보통 메인 페이지는 하위 도메인을 www로 설정하는 게 일반적이에요.
아래로 내려서 서비스 항목의 '유형(Type)'은 HTTP를 선택하고, 'URL'에는 127.0.0.1:{{ 포트번호 }}를 입력해주세요. {{ 포트번호 }}는 내 웹서버(예: Nginx, Node.js 앱 등)가 실제로 리스닝 중인 포트예요. 저장하면 끝이에요.
다시 dash.cloudflare.com에서 내 도메인의 DNS 탭에 들어가보면, 방금 설정한 서브도메인이 Tunnel로 연결된 CNAME 레코드로 자동 생성되어 있을 거예요.
5. 자주 쓰는 Cloudflare 규칙 2가지
Cloudflare에는 유용한 규칙(Rules) 기능이 정말 많은데, 그중에서도 제가 실무에서 자주 쓰는 규칙 2가지를 소개해드릴게요. 심심할 때 나만의 규칙을 만들어보는 것도 꽤 재미있어요.
- 루트 도메인 → www로 리디렉션
- 허용되지 않은 서브도메인 접근 시 안내 페이지로 리디렉션
dash.cloudflare.com에서 내 도메인을 먼저 선택한 뒤, 왼쪽 메뉴의 '규칙(Rules)' → '리디렉션 규칙(Redirect Rules)'으로 들어가서 '+ 규칙 생성(Create rule)'을 눌러주세요.
주의: 리디렉션 규칙이 정상 동작하려면, 대상이 되는 DNS 레코드가 Cloudflare를 통해 프록시(주황색 구름 아이콘) 상태여야 해요. DNS 탭에서 회색 구름(DNS Only)으로 되어 있다면 규칙이 적용되지 않으니 꼭 확인해주세요.
규칙 1: 루트에서 WWW로 리디렉션
example.com으로 접속했을 때 자동으로 www.example.com으로 이동시켜주는 규칙이에요. 만약 내 사이트의 메인이 www가 아니라 다른 서브도메인이라면 그 이름으로 바꿔서 커스텀할 수 있어요.
- 규칙 이름: 루트에서 WWW로 리디렉션
- 수신 요청: 와일드카드 패턴
- 요청 URL:
도메인이름/*
- 대상 URL:
www.도메인이름/${1} - 상태 코드:
301 - 위치 > 순서: 첫 번째
규칙 2: 허용되지 않은 서브도메인 접근 시 안내 페이지로 리디렉션
w.example.com처럼 실제로는 존재하지 않는 서브도메인으로 접근했을 때, 자동으로 안내 페이지로 이동시켜주는 규칙이에요. 구글 Search Console 같은 SEO 봇이 잘못된 서브도메인 URL을 색인하는 것도 막아줄 수 있고, 사소한 오류 페이지조차 브랜딩된 페이지로 전환시킬 수 있어요.
- 규칙 이름: 허용되지 않은 서브도메인 접근 시 안내 페이지로 리디렉션
- 수신 요청: 사용자 설정 필터 식
- 필드: 호스트 이름(Hostname)
- 연산자: 같지 않음(does not equal)
- 값: 실제로 존재하는 서브도메인을 전부 등록 (And로 여러 개 연결)
- URL 리디렉션 유형: 고정(Static)
- URL:
도메인이름/invalid-subdomain - 상태 코드:
302
여기서 상태 코드 구분이 중요해요. 302는 임시 이동, 301은 영구 이동이에요. 이 규칙처럼 나중에 서브도메인을 다시 정상적으로 쓸 가능성이 있는 경우엔 반드시 302를 써야 해요. 실수로 301을 써버리면 브라우저와 검색엔진이 그 리디렉션을 오래 캐싱해버려서, 나중에 서브도메인을 되살리려고 해도 사용자 기기마다 캐시를 강제로 초기화해야 하는 번거로운 상황이 생길 수 있어요.
마치며
지금까지 홈 웹서버 하드웨어 선택부터 리눅스 기본 보안 설정, Cloudflare Tunnel로 포트포워딩 없이 도메인을 연결하는 방법, 그리고 실무에서 유용한 리디렉션 규칙까지 쭉 살펴봤어요. 처음에는 단계가 많아 보이지만, 한 번 세팅해두면 그다음부터는 새 프로젝트를 배포할 때마다 Tunnel에 라우팅 하나만 추가하면 되기 때문에 훨씬 수월해져요.
오늘 글이 여러분의 첫 홈 웹서버 구축에 도움이 되었으면 좋겠어요.