19강 / 20강

【실습】 새 서비스 하나를 세상에 내놓는다

빈 서버에서 https 주소가 열리기까지 아홉 걸음

【실습】 새 서비스 하나를 세상에 내놓는다
앞의 열여덟 강이 여기서 한 줄로 이어집니다.

이제 실제로 하나 띄워 봅니다. 조건은 이 서버와 같습니다 — 공인 IP 없음, 열린 포트 없음, 도메인은 클라우드플레어에.

목표: lab.example.com 을 치면 서버 안 localhost:8080 의 앱이 https 로 열린다.

걸음을 하나씩 밟아 보세요. 빠뜨리면 어디서 어떻게 막히는지 알려 줍니다.
불러오는 중…

① 앱이 안에서 도는지 먼저 본다

$ curl -sI localhost:8080 HTTP/1.1 200 OK

여기서 안 되면 뒤의 여덟 걸음은 전부 의미가 없습니다. 가장 안쪽부터 확인하는 것이 순서예요.

② nginx 블록을 만든다

server { listen 443 ssl; server_name lab.example.com; ssl_certificate /etc/ssl/certs/example.com.pem; ssl_certificate_key /etc/ssl/private/example.com.key; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }
$ sudo nginx -t && sudo systemctl reload nginx

③ 오리진 인증서가 이 이름을 덮는지 본다

12강에서 example.com 과 *.example.com 을 넣었다면 lab.example.com 은 덮입니다. a.lab.example.com 이었다면 인증서를 새로 만들어야 했고요(17강).

④ 터널 설정에 줄을 더한다

ingress: - hostname: lab.example.com service: https://127.0.0.1:443 originRequest: originServerName: lab.example.com … - service: http_status:404

터널을 nginx 의 443 으로 보냅니다. 그러면 nginx 가 이름으로 방을 고를 수 있어요(17강). originServerName 은 SNI 로 이 이름을 말해 달라는 뜻입니다.

$ sudo systemctl restart cloudflared $ systemctl status cloudflared --no-pager

⑤ DNS 레코드를 만든다

$ cloudflared tunnel route dns mytunnel lab.example.com

이 한 줄이 CNAME 레코드를 대신 만들어 줍니다 — lab → <UUID>.cfargotunnel.com. 대시보드에서 손으로 만들어도 같습니다. 구름은 주황이어야 하고요.

⑥ SSL 모드를 확인한다

Full (strict). 오리진 인증서를 깔았으니 여기까지 갈 수 있습니다(11·12강).

⑦ 확인한다 — 바깥에서 안쪽 순서로

$ dig +short lab.example.com 104.21.x.x $ curl -sI https://lab.example.com | head -3 HTTP/2 200 server: cloudflare
값을 False 로 바꿔 보세요. 실제 장애 대응이 이 표를 위에서부터 훑는 일입니다.
Python 브라우저에서 실행
🤔 확인 문제
아홉 걸음 가운데 가장 먼저 확인해야 할 것은?
🤔 확인 문제
터널의 service 를 https://127.0.0.1:443 으로 두고 nginx 에 맡기는 이유는?