회사 사이트 1시간 만에 띄우기 — iwinv + nginx + Cloudflare Flexible SSL
회사 도메인이 있다. VM 한 대도 있다. 인증서 갱신은 신경 쓰기 싫다. 그러면 이 조합이 답이다.
회사 사이트 (www.hedvion.com) 를 띄우는 데 1시간 걸렸습니다. 이 글은 그 1시간을 그대로 적은 것입니다.
독자가 따라 하면 똑같이 1시간 안에 끝낼 수 있도록 — 정확한 명령과 그 이유까지.
전제
- 도메인 1개가 Cloudflare 에 위임되어 있음 (NS 레코드만 박혀 있고 A 는 비어 있어도 됩니다)
- 리눅스 VM 1대 (저는 iwinv vgna_2_n 13,100원/월 플랜 사용)
- VM 에 root SSH 접근 가능
- Let’s Encrypt 안 씁니다. SSL 은 Cloudflare 가 처리합니다.
왜 Cloudflare Flexible SSL 인가
- certbot · Let’s Encrypt 자동 갱신은 잘 됩니다. 잘 안 될 때 빼고는요.
- Flexible 모드는 사용자 ↔ Cloudflare 구간만 HTTPS 로, Cloudflare ↔ 우리 서버 는 HTTP 로 둡니다.
- 서버에 인증서를 깔지 않아도 됩니다. 갱신 신경 쓸 일도 없습니다.
- 단점 — Cloudflare 와 origin 사이 평문이라 같은 IDC 안에서의 도청은 가능. 회사 정적 페이지엔 큰 문제 X.
요점: 갱신 자동화에 시간을 쓰지 않는 만큼 다른 곳에 쓸 수 있다.
1단계 — Cloudflare DNS
대시보드 → 도메인 → DNS → Records:
A | @ | <서버 IP> | Proxied 🟠
A | www | <서버 IP> | Proxied 🟠
* 와일드카드 A 도 가능합니다 (blog.hedvion.com 같은 서브도메인이 자동 라우팅됨).
다만 무료 플랜에서는 wildcard 의 Proxied 동작 여부가 변하니 직접 확인하세요.
2단계 — SSL/TLS 모드
Cloudflare → SSL/TLS → Overview → Flexible 선택.
이걸 안 하면 521 에러 (origin 이 HTTPS 받을 준비 안 됨) 가 뜹니다. 저도 처음에 이걸로 10분 날렸습니다.
3단계 — VM 에 nginx
ssh hedvion # 또는 직접 IP
sudo apt install nginx
server block 만들기 — /etc/nginx/sites-available/hedvion:
server {
listen 80;
listen [::]:80;
server_name hedvion.com www.hedvion.com;
root /var/www/hedvion;
index index.html;
# Cloudflare 뒤에 있으므로 진짜 IP 는 CF-Connecting-IP 헤더 사용
set_real_ip_from 0.0.0.0/0;
real_ip_header CF-Connecting-IP;
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/javascript image/svg+xml;
location ~* \.(?:css|js|png|jpg|svg|webp|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location / { try_files $uri $uri/ =404; }
}
활성화 + reload:
sudo ln -sf /etc/nginx/sites-available/hedvion /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
4단계 — 정적 파일 올리기
로컬에서:
rsync -avz --delete ./ hedvion:/var/www/hedvion/
./ 자리는 본인 사이트 루트. index.html, styles.css 등이 있어야 합니다.
5단계 — 검증
curl -I https://www.hedvion.com/
HTTP/2 200server: cloudflarecf-ray: ...
이 세 줄 보이면 끝입니다.
흔한 함정
521 Web server is down
Cloudflare SSL 모드가 Full 로 되어 있고 우리 서버는 80 만 열어둔 상태. → Flexible 로 변경.
캐시가 풀리지 않음
nginx expires 1y + Cloudflare CDN 둘 다 캐싱. CSS 변경 후 안 보이면:
<link rel="stylesheet" href="/styles.css?v=20260506">
쿼리스트링 버전 갱신 → 새로운 키로 캐시 분리.
로그에 진짜 IP 가 안 보임
real_ip_header CF-Connecting-IP 빼먹은 경우. nginx access.log 가 전부 Cloudflare IP 로 찍힙니다.
비용
- iwinv vgna_2_n: 월 13,100원 (VAT 별도)
- Cloudflare Free
- 도메인 (이미 보유)
- 합계: 월 1.5만원 미만
회사 사이트 + 블로그 + 작은 어드민까지 한 대로 굴려도 충분합니다.
다음 글에서
이 사이트의 블로그 (지금 읽고 계신 곳) 는 Astro 로 만들었습니다.
다음 글에선 blog.hedvion.com 을 어떻게 같은 서버에 띄웠는지, nginx 한 server block 에서 두 사이트 분리하는 법을 다룹니다.
— slecs