التحقق
بعد النشر، قم بتشغيل هذه الفحوصات للتأكد من أن عقدة حافة CDN تعمل بشكل صحيح. اسمح بمرور 2-3 دقائق بعد terraform apply لإنهاء cloud-init تثبيت NGINX.
فحص الصحة
Section titled “فحص الصحة”تحقق من أن NGINX يعمل ويستجيب:
curl -s "http://<PUBLIC_IP>/health" | jq .المخرجات المتوقعة:
{ "status": "healthy", "component": "cdn-edge", "engine": "nginx", "vendor_profiles": [ "akamai", "cloudflare", "cloudfront", "fastly", "azure-front-door" ]}إذا كنت تستخدم مخرجات Terraform:
curl -s "$(terraform output -raw health_check_url)" | jq .إخفاق التخزين المؤقت (الطلب الأول)
Section titled “إخفاق التخزين المؤقت (الطلب الأول)”سيكون الطلب الأول لأي مسار إخفاقاً في التخزين المؤقت — تجلب الحافة من خادم المصدر:
curl -I "http://<PUBLIC_IP>/"ابحث عن هذه الرؤوس في الاستجابة:
X-Cache-Status: MISSX-CDN-Edge: cdn-simulatorMISS يعني أن المحتوى لم يكن في التخزين المؤقت وتم جلبه من خادم المصدر.
إصابة التخزين المؤقت (الطلبات اللاحقة)
Section titled “إصابة التخزين المؤقت (الطلبات اللاحقة)”كرر نفس الطلب فوراً:
curl -I "http://<PUBLIC_IP>/"الرؤوس المتوقعة:
X-Cache-Status: HITX-CDN-Edge: cdn-simulatorHIT يؤكد أن الاستجابة قُدِّمت من ذاكرة التخزين المؤقت لقرص NGINX دون الاتصال بخادم المصدر.
فحص دليل التخزين المؤقت
Section titled “فحص دليل التخزين المؤقت”قم بالاتصال بـ VM عبر SSH للتحقق من وجود المحتوى المخزن مؤقتاً على القرص:
ssh azureuser@<PUBLIC_IP>
# Check cache directory has contentsudo find /var/cache/nginx/cdn -type f | head -20
# Check cache sizesudo du -sh /var/cache/nginx/cdnحالة NGINX
Section titled “حالة NGINX”تحقق من أن NGINX يعمل وأن التكوين صالح:
ssh azureuser@<PUBLIC_IP>
# Check service statussudo systemctl status nginx
# Validate configurationsudo nginx -t
# View active connections (if stub_status is enabled)curl -s http://localhost/healthاتصال خادم المصدر
Section titled “اتصال خادم المصدر”تحقق من أن عقدة الحافة يمكنها الوصول إلى خادم المصدر:
ssh azureuser@<PUBLIC_IP>
# Test connectivity to origin (replace with your origin URL)curl -I "https://your-origin.example.com/"إذا فشل هذا، تحقق من:
- أن المتغير
origin_serverصحيح في تكوين Terraform - يسمح خادم المصدر بالاتصالات الواردة من عنوان IP العام لعقدة الحافة
- يعمل حل DNS من VM (
nslookup your-origin.example.com)
تقدم Cloud-Init
Section titled “تقدم Cloud-Init”راقب تقدم التوفير عبر سجل cloud-init:
ssh azureuser@<PUBLIC_IP> "tail -f /var/log/cloud-init-progress.log"المراحل المتوقعة: [init]، [nic] (الكشف الديناميكي عن بطاقة الشبكة)، [complete].
إذا أبلغ cloud-init عن أخطاء:
ssh azureuser@<PUBLIC_IP> "sudo cloud-init status --long"اختبار شامل من البداية إلى النهاية
Section titled “اختبار شامل من البداية إلى النهاية”قم بتشغيل دورة طلب كاملة والتحقق من سلسلة الاستجابة:
# 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
Section titled “التحقق من رؤوس مورد CDN”تحقق من حقن جميع رؤوس موردي CDN عن طريق طلب مسار /headers (عند استخدام httpbin.org كخادم مصدر):
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" }}اختبار الكشف عن الجهاز
Section titled “اختبار الكشف عن الجهاز”اختبر بعامل مستخدم للجوال للتحقق من تغيير رؤوس الكشف عن الجهاز:
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 “استكشاف الأخطاء وإصلاحها”NGINX لا يعمل
Section titled “NGINX لا يعمل”ssh azureuser@<PUBLIC_IP>sudo systemctl status nginxsudo journalctl -u nginx --no-pager -n 50لم يكتمل cloud-init
Section titled “لم يكتمل cloud-init”بعد terraform apply، يستغرق cloud-init من 2 إلى 3 دقائق. تحقق من التقدم:
ssh azureuser@<PUBLIC_IP>sudo cloud-init statussudo 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"