[WSL2] Cloudflare Tunnel 연동 및 Nginx 웹 서버 구축 가이드
1. WSL(윈도우 속에서 리눅스 환경을 사용할 수 있게 해주는 기능, Windows subsystem for linux)
- WSL1 vs WSL2의 차이 (현재는 무조건 WSL2)
- WSL은 크게 버전 1과 버전 2로 나뉩니다. 지금 우리가 설치하고 사용하는 것은 전부 WSL2입니다.
- WSL1 (과거 버전): 리눅스 명령어가 들어오면 윈도우가 중간에서 자기 언어로 번역해서 처리하는 방식이었습니다. 흉내만 낸 수준이라 속도가 느리고 안 되는 기능이 많았습니다.
- WSL2 (현재 버전): 윈도우 내부에 진짜 경량화된 리눅스 커널(심장)을 심어버렸습니다. MS가 윈도우 시스템에 완전히 최적화를 시켜두었기 때문에 가상머신보다 비교도 안 될 정도로 압도적으로 가볍고 빠릅니다. 진짜 리눅스 컴퓨터와 성능이 거의 똑같습니다.
- WSL2의 핵심 장점
- 완벽한 공존 (윈도우 파일 접근 가능): 우분투 리눅스 터미널 안에서 윈도우에 있는 소스코드 파일을 마음대로 수정하고 실행할 수 있습니다. 반대로 윈도우 탐색기에서 리눅스 내부 파일 시스템(\\wsl$)을 열어볼 수도 있습니다.
- 도커(Docker)와의 찰떡궁합: 개발 필수 도구인 '도커'를 윈도우에서 돌리면 내부적으로 WSL2를 기반으로 작동합니다. 덕분에 복잡한 서버 환경 설정을 단 몇 초 만에 구성할 수 있습니다.
- 가벼움과 고성능: 노트북 배터리를 크게 갉아먹지 않으면서도, 윈도우의 자원(CPU, 메모리)을 리눅스가 필요할 때만 유연하게 나눠 쓰기 때문에 컴퓨터가 느려지지 않습니다.
2. WSL2(우분투) 환경 준비 및 SSH 설정
Windows에서 리눅스 환경을 구축하고, 외부 접속을 위한 기본적인 SSH와 방화벽 설정을 진행합니다.
💡 WSL 주요 명령어 모음
wsl --status # WSL 설치 여부 및 기본 버전 확인
wsl --install # WSL 자체 설치 (기본 Ubuntu 설치)
wsl -l -o # 온라인에서 다운로드 가능한 배포판 목록 확인
wsl -l # 현재 내 PC에 설치된 배포판 확인
wsl -l -v # 설치된 배포판의 버전(WSL1/WSL2) 및 상태 확인
wsl --install -d Ubuntu-24.04 # 특정 배포판(Ubuntu 24.04) 설치 후 진입
wsl -d Ubuntu-24.04 # 특정 배포판으로 진입
wsl -t Ubuntu-24.04 # 특정 배포판 강제 종료
wsl --shutdown # WSL 전체 기능 완전히 종료
우분투 진입 후 초기 설정 및 SSH 설치
우분투 설치가 완료되면 패키지를 최신화하고 원격 접속을 위한 SSH를 활성화합니다. (사용자 계정 예시: user / 비밀번호: 1234)
# 1. 패키지 업데이트 및 업그레이드
sudo apt update && sudo apt upgrade -y
# 2. SSH 서버 설치 및 활성화
sudo apt install openssh-server -y
sudo systemctl start ssh # SSH 서비스 시작
sudo systemctl enable ssh # 부팅 시 자동 시작 설정
sudo systemctl status ssh # SSH 작동 상태 확인
UFW 방화벽 설정
외부의 무분별한 접근을 막고, 필요한 포트(SSH: 22)만 열어줍니다.
sudo apt install ufw -y # 방화벽 설치
sudo ufw default deny incoming # 들어오는 모든 접속 차단 (기본 정책)
sudo ufw default allow outgoing # 나가는 모든 접속 허용 (기본 정책)
sudo ufw allow 22 # SSH 접속을 위한 22번 포트 허용
sudo ufw enable # 방화벽 활성화 (적용)
# [참고 명령어]
# sudo ufw disable # 방화벽 비활성화
# sudo ufw status verbose # 방화벽 상세 상태 확인
# sudo ufw delete allow 22 # 22번 포트 허용 규칙 삭제
3. Cloudflare Tunnel 생성 및 외부 연동
공인 IP 노출이나 복잡한 포트포워딩 없이, Cloudflare Tunnel을 이용해 안전하게 외부 도메인과 내 로컬 서버를 연결합니다.
Cloudflare 웹사이트 설정 (대시보드)
- Cloudflare 계정 홈 로그인 후 [네트워크] > [터널(Tunnel)] 메뉴를 클릭합니다.
- [터널 생성] 버튼을 클릭하여 이동합니다.
- 터널 이름을 입력하고 [터널 생성]을 누릅니다.
- 환경설정 페이지에서 운영체제 환경에 맞게 [Debian] (우분투 계열)을 선택합니다.
우분투 터널 프로그램(cloudflared) 설치 및 실행
대시보드에 나오는 CLI 명령어를 우분투 터미널에 순서대로 복사하여 실행합니다.
# 1. Cloudflare GPG 키 추가
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
# 2. Cloudflare 저장소(Repository) 등록
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
# 3. cloudflared 설치
sudo apt-get update && sudo apt-get install cloudflared -y
# 4. 서비스로 터널 실행 (인증 토큰 코드는 본인 대시보드에 있는 것을 복사하세요)
sudo cloudflared service install eyJhIjoiNzNhMDk5OThkNzNjNjc4NmUyOTM0...
도메인 경로(Public Hostname) 추가
- 웹 대시보드에서 '터널이 성공적으로 연결되었습니다'라는 활성화 메시지가 뜨면 [계속]을 클릭합니다.
- 생성된 터널명을 클릭하고 개요 페이지에서 [경로(Public Hostname)] 탭 클릭 ➡️ [경로 추가]를 누릅니다.
- 아래 예시를 참고하여 정보를 입력한 뒤 [경로 추가]를 완료합니다.
- 서브도메인: web
- 도메인: kakaolab.cloud (본인 소유 도메인)
- 서비스 URL: http://localhost:80 (Nginx가 대기할 로컬 주소)
4. Nginx 웹 서버 구축 및 루트 폴더 정의
Nginx 설치 및 실행
sudo apt install nginx -y
sudo systemctl start nginx # Nginx 실행
sudo systemctl enable nginx # 부팅 시 자동 실행
sudo systemctl status nginx # 상태 확인
📁 Nginx 기본 루트 폴더 소유자 변경 알아보기
Nginx는 설치 시 기본적으로 웹 루트 폴더를 /var/www/html로 지정합니다.
- 기본 폴더 권한 변경: 기본 폴더는 root 소유라 일반 유저(user)가 파일을 수정하기 어렵습니다. 아래 명령어로 소유자를 변경하여 수정 권한을 얻습니다.
-
cd /var/www sudo chown -R user html # html 폴더의 소유자를 user로 변경 - 🤔 루트 폴더 위치를 /home/user/로 바꿔도 되나요?
- 네, 전혀 상관없습니다! 프로젝트 관리 편의상 본인의 홈 디렉터리(~) 내부에 웹 파일(HTML, JS 등)을 두고 관리하는 경우가 실무에서도 많습니다.
5. 사용자 정의 웹사이트(webapp) 설정 파일 생성
기본 제공되는 default 설정을 지우고, 우리의 경로(/home/user/html)를 바라보는 커스텀 설정 파일을 만듭니다.
# 1. 기존 기본 설정 링크 삭제
sudo rm /etc/nginx/sites-enabled/default
# 2. 새로운 설정 파일 생성 (설정 작성 구역: sites-available)
sudo nano /etc/nginx/sites-available/webapp
[webapp 파일 내용]
server {
listen 80;
server_name localhost; # Tunnel이 안에서 호출하므로 localhost로 설정
# static 파일(HTML, CSS, JS) 관리 구역
location / {
root /home/user/html; # 내가 정의한 새로운 웹 루트 폴더 경로
index index.html index.htm;
}
}
설정 활성화 및 Nginx 재설정 적용
# 3. 작성한 설정을 활성화(sites-enabled 폴더에 바로가기 링크 생성)
sudo ln -s /etc/nginx/sites-available/webapp /etc/nginx/sites-enabled/
# 4. Nginx 설정 파일에 오타가 없는지 문법 체크 (반드시 통과 확인!)
sudo nginx -t
# 5. Nginx에 새로운 설정 반영 (재시작이 아닌 무중단 반영)
sudo systemctl reload nginx
💡 Tip. restart와 reload의 차이점
- restart: 완전히 Nginx 프로세스를 죽였다가 다시 켭니다. 아주 잠깐 서버가 내려가므로 접속 중이던 사용자 연결이 끊길 수 있습니다.
- reload: 웹 서버를 멈추지 않고(무중단), 설정 파일의 변경 사항만 실시간으로 싹 긁어와서 부드럽게 반영합니다. 실무 배포 환경에서는 주로 reload를 사용합니다.
* 중요: 홈 디렉터리 권한 허용
루트 폴더 경로를 /home/user/...로 바꿨을 때, Nginx 시스템 계정(www-data)이 해당 폴더에 접근하여 웹 파일을 읽을 수 있도록 상위 폴더들의 접근 권한(755)을 열어주어야 합니다. 이 처리를 안 하면 403 Forbidden 에러가 발생할 수 있습니다.
sudo chmod 755 /home
sudo chmod 755 /home/user
이제 지정한 도메인 주소로 브라우저에 접속하면, 내 홈 디렉터리에 있는 index.html 화면이 정상적으로 출력됩니다!
Question!
💡 Q. Nginx를 실행하기 전에는 공인 IP로 접속이 됐는데, Nginx를 켜니까 왜 localhost로 설정을 해야 접속이 되나요?
A. 핵심은 "누가 내 웹 서버(Nginx)에 직접 요청을 전달하느냐"의 차이입니다.
- Nginx를 실행하기 전 (일반 공인 IP 접속): 외부 사용자가 브라우저를 통해 내 공유기의 공인 IP를 직접 찌르고 들어오는 방식이었습니다.
- Nginx + Cloudflare Tunnel 실행 후:이제 외부 손님은 내가 아닌 Cloudflare 서버로 접속합니다.내 컴퓨터 안에서 돌고 있는 cloudflared(터널 프로그램)가 Cloudflare 본사로부터 그 요청을 안전하게 이어받습니다.이어받은 요청을 내 컴퓨터 안에서 바로 옆방에 있는 Nginx에게 토스해 줍니다.cloudflared 프로그램 입장에서 Nginx는 '같은 컴퓨터 내부'에 있으므로 주소가 localhost:80이 되는 것입니다. 따라서 Nginx 설정의 server_name도 외부 IP가 아닌 localhost로 처리하는 것이 정확합니다.
💡 Q. Ubuntu환경에서 종료했다가 다시 켜도 IP 주소가 바뀌지 않은 이유
1. WSL2 환경인 경우
만약 윈도우에서 wsl --shutdown을 하고 우분투를 완전히 껐다 켜도 IP가 그대로인 것 같다면, 그것은 윈도우가 내부적으로 가상 네트워크 스위치(vEthernet)를 고정해서 관리해주기 때문입니다.
- 컴퓨터 내부의 비밀 통로: WSL2는 윈도우 컴퓨터 안에 독립된 가상 방을 만드는 기술입니다. 윈도우는 우분투를 켤 때마다 Hyper-V라는 기술을 이용해 가상 네트워크 카드를 연결해 줍니다.
- 종료해도 유지되는 가상 IP: 최근 윈도우 업데이트 버전(특히 Windows 11 이후 미러드 모드 등)이나 가상 스위치 설정에 따라, 윈도우는 가상 리눅스가 껐다 켜져도 혼란을 방지하기 위해 기존에 쓰던 내부 가상 IP 대역을 그대로 유지하거나 기억해서 다시 할당해 줍니다. 덕분에 매번 IP가 바뀌어 설정 파일(Cloudflare Tunnel 등)을 고쳐야 하는 번거로움이 없는 것입니다.
2. 일반 물리 컴퓨터나 독립된 가상머신(VM) 환경인 경우
만약 WSL2가 아니라 집에 남는 컴퓨터에 우분투를 직접 깔았거나 AWS 같은 클라우드 환경이라면, IP가 안 바뀌는 원리는 공유기의 임대 시간(Lease Time)과 고정 IP 설정 때문입니다.
① 공유기가 기억하고 있어서 (DHCP 임대 시간)
집이나 사무실에서 쓰는 공유기는 컴퓨터들에게 IP를 나누어주는 역할(DHCP)을 합니다. 이때 공유기는 IP를 무한정 주는 게 아니라 "임대(대여)"해 주는 개념을 씁니다.
- 공유기는 IP 주소를 나누어줄 때 해당 컴퓨터의 고유 주민등록번호 같은 MAC 주소를 기억해 둡니다.
- 우분투를 잠깐 종료했다가 다시 켜더라도, 공유기가 정해둔 IP 임대 시간(보통 2시간~24시간)이 지나지 않았다면 공유기는 이렇게 생각합니다.
"어? 아까 그 MAC 주소를 가진 우분투 녀석이 다시 켜졌네? 아직 대여 시간이 남았으니 아까 쓰던 그 IP 주소 그대로 다시 쓰라고 해야겠다."
그 결과 컴퓨터를 껐다 켜도 IP가 바뀌지 않고 그대로 유지됩니다. (만약 공유기를 완전히 껐다 켜거나, 몇 일 동안 우분투를 끈 채로 방치하면 IP가 바뀔 수 있습니다.)
② 수동으로 고정(Static)을 해두어서
우분투 네트워크 설정 파일(/etc/netplan/*.yaml 등)에 처음부터 dhcp4: no로 끄고, 특정 IP를 직접 타이핑해서 박아두었다면(고정 IP 설정) 우분투는 지구 종말이 올 때까지 그 IP만 고집합니다. 껐다 켜도 당연히 바뀌지 않습니다.
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.05.21) Git (0) | 2026.05.21 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.05.18) (0) | 2026.05.18 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.14) (0) | 2026.05.15 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.13) (0) | 2026.05.13 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.12) (0) | 2026.05.12 |