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
브라우저에서 실행
🤔 확인 문제
아홉 걸음 가운데 가장 먼저 확인해야 할 것은?
해설 가장 안쪽부터 봅니다. 앱이 죽어 있으면 나머지를 아무리 맞춰도 502 만 나옵니다.
🤔 확인 문제
터널의 service 를
https://127.0.0.1:443 으로 두고 nginx 에 맡기는 이유는?해설 앱마다 ingress 줄을 늘리는 대신, 터널은 nginx 한 곳으로 보내고 이름으로 나누는 일은 nginx 에 맡깁니다. 사이트가 120개여도 ingress 는 짧게 유지됩니다.