콘텐츠로 이동

검증

배포 후 다음 검사를 실행하여 CDN 에지 노드가 올바르게 작동하는지 확인하십시오. terraform apply 후 cloud-init이 NGINX 설치를 완료할 때까지 2-3분 정도 기다리십시오.

NGINX가 실행 중이고 응답하는지 확인하십시오:

Terminal window
curl -s "http://<PUBLIC_IP>/health" | jq .

예상 출력:

{
"status": "healthy",
"component": "cdn-edge",
"engine": "nginx",
"vendor_profiles": [
"akamai",
"cloudflare",
"cloudfront",
"fastly",
"azure-front-door"
]
}

Terraform 출력을 사용하는 경우:

Terminal window
curl -s "$(terraform output -raw health_check_url)" | jq .

특정 경로에 대한 첫 번째 요청은 캐시 미스가 됩니다 — 에지가 오리진에서 데이터를 가져옵니다:

Terminal window
curl -I "http://<PUBLIC_IP>/"

응답에서 다음 헤더를 확인하십시오:

X-Cache-Status: MISS
X-CDN-Edge: cdn-simulator

MISS는 콘텐츠가 캐시에 없어 오리진 서버에서 가져왔음을 의미합니다.

동일한 요청을 즉시 반복하십시오:

Terminal window
curl -I "http://<PUBLIC_IP>/"

예상 헤더:

X-Cache-Status: HIT
X-CDN-Edge: cdn-simulator

HIT는 오리진에 접속하지 않고 NGINX 디스크 캐시에서 응답이 제공되었음을 확인합니다.

VM에 SSH로 접속하여 캐시된 콘텐츠가 디스크에 존재하는지 확인하십시오:

Terminal window
ssh azureuser@<PUBLIC_IP>
# 캐시 디렉터리에 콘텐츠가 있는지 확인
sudo find /var/cache/nginx/cdn -type f | head -20
# 캐시 크기 확인
sudo du -sh /var/cache/nginx/cdn

NGINX가 실행 중이고 구성이 유효한지 확인하십시오:

Terminal window
ssh azureuser@<PUBLIC_IP>
# 서비스 상태 확인
sudo systemctl status nginx
# 구성 유효성 검사
sudo nginx -t
# 활성 연결 확인 (stub_status가 활성화된 경우)
curl -s http://localhost/health

에지 노드가 오리진 서버에 도달할 수 있는지 확인하십시오:

Terminal window
ssh azureuser@<PUBLIC_IP>
# 오리진에 대한 연결 테스트 (귀하의 오리진 URL로 교체)
curl -I "https://your-origin.example.com/"

이 과정이 실패하는 경우 다음을 확인하십시오:

  1. Terraform 구성에서 origin_server 변수가 올바른지 확인
  2. 오리진 서버가 에지 노드의 공용 IP에서 인바운드 연결을 허용하는지 확인
  3. VM에서 DNS 확인이 작동하는지 확인 (nslookup your-origin.example.com)

cloud-init 로그를 통해 프로비저닝 진행 상황을 모니터링하십시오:

Terminal window
ssh azureuser@<PUBLIC_IP> "tail -f /var/log/cloud-init-progress.log"

예상 단계: [init], [nic] (동적 NIC 감지), [complete].

cloud-init에서 오류가 보고되는 경우:

Terminal window
ssh azureuser@<PUBLIC_IP> "sudo cloud-init status --long"

전체 요청 주기를 실행하고 응답 체인을 확인하십시오:

Terminal window
# 첫 번째 요청 — MISS (오리진에서 가져옴)
echo "=== Request 1 (expect MISS) ==="
curl -s -o /dev/null -w "HTTP %{http_code} | Cache: %{header:X-Cache-Status}\n" "http://<PUBLIC_IP>/test-path"
# 두 번째 요청 — HIT (캐시에서 제공)
echo "=== Request 2 (expect HIT) ==="
curl -s -o /dev/null -w "HTTP %{http_code} | Cache: %{header:X-Cache-Status}\n" "http://<PUBLIC_IP>/test-path"

예상 출력:

=== Request 1 (expect MISS) ===
HTTP 200 | Cache: MISS
=== Request 2 (expect HIT) ===
HTTP 200 | Cache: HIT

/headers 경로를 요청하여 모든 CDN 벤더 헤더가 삽입되고 있는지 확인하십시오 (httpbin.org를 오리진으로 사용하는 경우):

Terminal window
curl -s "http://<PUBLIC_IP>/headers" | python3 -m json.tool

예상 응답에는 다섯 개 벤더 모두의 헤더가 포함됩니다:

{
"headers": {
"True-Client-Ip": "<YOUR_CLIENT_IP>",
"Cf-Connecting-Ip": "<YOUR_CLIENT_IP>",
"Cf-Ipcountry": "US",
"Cf-Ray": "<request_id>-SJC",
"Cf-Bot-Score": "85",
"Cf-Ja3-Hash": "e7d705a3286e19ea42f587b344ee6865",
"Cloudfront-Viewer-Country": "US",
"Cloudfront-Viewer-City": "San Jose",
"Cloudfront-Is-Desktop-Viewer": "true",
"Cloudfront-Is-Mobile-Viewer": "false",
"Fastly-Client-Ip": "<YOUR_CLIENT_IP>",
"X-Akamai-Edgescape": "georegion=263,country_code=US,...",
"X-Azure-Clientip": "<YOUR_CLIENT_IP>",
"X-Azure-Fdid": "a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1",
"X-Geo-Country-Code": "US"
}
}

모바일 User-Agent로 테스트하여 디바이스 감지 헤더가 변경되는지 확인하십시오:

Terminal window
curl -s "http://<PUBLIC_IP>/headers?device=mobile" \
-H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)" \
| python3 -m json.tool | grep -E "Is-Mobile|Is-Desktop|is_mobile"

예상 결과:

"Cloudfront-Is-Desktop-Viewer": "false",
"Cloudfront-Is-Mobile-Viewer": "true",
Terminal window
ssh azureuser@<PUBLIC_IP>
sudo systemctl status nginx
sudo journalctl -u nginx --no-pager -n 50

terraform apply 후 cloud-init은 2-3분이 소요됩니다. 진행 상황을 확인하십시오:

Terminal window
ssh azureuser@<PUBLIC_IP>
sudo cloud-init status
sudo tail -f /var/log/cloud-init-output.log

캐시가 항상 MISS를 표시하는 경우

섹션 제목: “캐시가 항상 MISS를 표시하는 경우”
  • 오리진이 캐시 가능한 응답 코드(200, 301, 302)를 반환하는지 확인
  • 오리진이 Cache-Control: no-cache 또는 no-store 헤더를 전송하지 않는지 확인
  • NGINX 오류 로그 확인: sudo tail -f /var/log/nginx/error.log

포트 80/443에서 연결이 거부되는 경우

섹션 제목: “포트 80/443에서 연결이 거부되는 경우”
  • NSG 규칙이 적용되었는지 확인: az network nsg rule list --nsg-name "$(terraform output -raw nsg_name)" --resource-group "$(terraform output -raw resource_group_name)" -o table
  • NGINX가 수신 대기 중인지 확인: ssh azureuser@<PUBLIC_IP> "sudo ss -tlnp | grep nginx"