تخطَّ إلى المحتوى

التحقق

بعد النشر، قم بتشغيل هذه الفحوصات للتأكد من أن عقدة حافة CDN تعمل بشكل صحيح. اسمح بمرور 2-3 دقائق بعد terraform apply لإنهاء cloud-init تثبيت NGINX.

تحقق من أن 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>
# Check cache directory has content
sudo find /var/cache/nginx/cdn -type f | head -20
# Check cache size
sudo du -sh /var/cache/nginx/cdn

تحقق من أن NGINX يعمل وأن التكوين صالح:

Terminal window
ssh azureuser@<PUBLIC_IP>
# Check service status
sudo systemctl status nginx
# Validate configuration
sudo nginx -t
# View active connections (if stub_status is enabled)
curl -s http://localhost/health

تحقق من أن عقدة الحافة يمكنها الوصول إلى خادم المصدر:

Terminal window
ssh azureuser@<PUBLIC_IP>
# Test connectivity to origin (replace with your origin URL)
curl -I "https://your-origin.example.com/"

إذا فشل هذا، تحقق من:

  1. أن المتغير origin_server صحيح في تكوين Terraform
  2. يسمح خادم المصدر بالاتصالات الواردة من عنوان IP العام لعقدة الحافة
  3. يعمل حل DNS من VM (nslookup your-origin.example.com)

راقب تقدم التوفير عبر سجل cloud-init:

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

المراحل المتوقعة: [init]، [nic] (الكشف الديناميكي عن بطاقة الشبكة)، [complete].

إذا أبلغ cloud-init عن أخطاء:

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

اختبار شامل من البداية إلى النهاية

Section titled “اختبار شامل من البداية إلى النهاية”

قم بتشغيل دورة طلب كاملة والتحقق من سلسلة الاستجابة:

Terminal window
# First request — MISS (fetches from origin)
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"
# Second request — HIT (served from cache)
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

تحقق من حقن جميع رؤوس موردي CDN عن طريق طلب مسار /headers (عند استخدام 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"
}
}

اختبر بعامل مستخدم للجوال للتحقق من تغيير رؤوس الكشف عن الجهاز:

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",

استكشاف الأخطاء وإصلاحها

Section titled “استكشاف الأخطاء وإصلاحها”
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"