コンテンツにスキップ

確認

デプロイ後、以下のチェックを実行して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 .

キャッシュミス(初回リクエスト)

Section titled “キャッシュミス(初回リクエスト)”

任意のパスへの初回リクエストはキャッシュミスとなり、エッジがオリジンサーバーからコンテンツを取得します:

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

レスポンス内の以下のヘッダーを確認してください:

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

MISS はコンテンツがキャッシュに存在せず、オリジンサーバーから取得されたことを意味します。

キャッシュヒット(以降のリクエスト)

Section titled “キャッシュヒット(以降のリクエスト)”

同じリクエストをすぐに繰り返します:

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

期待されるヘッダー:

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

HIT はオリジンサーバーに接触せず、NGINXのディスクキャッシュからレスポンスが提供されたことを確認します。

キャッシュディレクトリの検査

Section titled “キャッシュディレクトリの検査”

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"
# 2回目のリクエスト — 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

期待されるレスポンスには、5つのベンダー全てのヘッダーが含まれます:

{
"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を示す場合

Section titled “キャッシュが常にMISSを示す場合”
  • オリジンがキャッシュ可能なレスポンスコード(200、301、302)を返していることを確認してください
  • オリジンが Cache-Control: no-cache または no-store ヘッダーを送信していないことを確認してください
  • NGINXエラーログを確認してください:sudo tail -f /var/log/nginx/error.log

ポート80/443で接続が拒否される場合

Section titled “ポート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"