← 모든 글

회사 사이트 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 200
  • server: cloudflare
  • cf-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