نظرة عامة
يحاكي هذا المكوّن عقدة CDN حافة لبيئات المختبر والعرض التوضيحي. يمثّل الدور الذي يؤديه البائعون أمثال Akamai وCloudflare وAmazon CloudFront وFastly في بنية شبكة العميل — طبقة التخزين المؤقت الأقرب إلى المستخدمين النهائيين والتي تقع أمام خادم المصدر.
في البنى التحتية متعددة البائعين للإنتاج، يقوم العملاء بشكل شائع بإقران شبكة CDN تابعة لجهة خارجية مع F5 Distributed Cloud:
End User → CDN Edge (Akamai/Cloudflare/etc.) → F5 XC HTTP LB → Origin Appيحل هذا المحاكي محل شبكة CDN التجارية بعقدة حافة مستندة إلى NGINX، مما يتيح إجراء العرض التوضيحي والاختبار للتكامل دون الحاجة إلى عقود بائعين أو بنية تحتية إنتاجية.
البنية التحتية
Section titled “البنية التحتية”┌─────────┐ ┌──────────────────────┐ ┌─────────────────┐ ┌────────────┐│ Client │────▶│ CDN Edge (NGINX) │────▶│ F5 XC HTTP LB │────▶│ Origin App ││ │ │ Ubuntu 24.04 Azure │ │ (Origin Server) │ │ │└─────────┘ │ - TLS termination │ └─────────────────┘ └────────────┘ │ - Disk-based cache │ │ - X-Cache-Status │ └──────────────────────┘عقدة الحافة NGINX:
- تُنهي TLS عند الحافة (موقّعة ذاتيًا أو Let’s Encrypt)
- تُخزّن الاستجابات مؤقتًا على القرص باستخدام
proxy_cache_path - تُحيل طلبات إخفاق التخزين المؤقت إلى خادم مصدر قابل للتهيئة (عنوان VIP لموازن تحميل F5 XC HTTP)
- تُبلّغ عن حالة التخزين المؤقت عبر رأس الاستجابة
X-Cache-Status(HITأوMISSأوBYPASSأوEXPIRED)
ما يُحاكيه هذا المكوّن
Section titled “ما يُحاكيه هذا المكوّن”| وظيفة CDN | تطبيق NGINX |
|---|---|
| التخزين المؤقت عند الحافة | proxy_cache مع تخزين قائم على القرص |
| توليد مفتاح التخزين المؤقت | proxy_cache_key استنادًا إلى المخطط والمضيف وURI |
| سحب البيانات من المصدر | proxy_pass إلى موازن تحميل F5 XC HTTP |
| إنهاء TLS | توجيه ssl_certificate في NGINX |
| احترام Cache-Control | proxy_cache_valid مع تمرير رؤوس المصدر |
| الإبلاغ عن حالة التخزين المؤقت | add_header X-Cache-Status $upstream_cache_status |
| نقطة نهاية الفحص الصحي | موقع /health يُعيد 200 OK |
نقاط النهاية وسلوك الطلب/الاستجابة
Section titled “نقاط النهاية وسلوك الطلب/الاستجابة”الفحص الصحي
Section titled “الفحص الصحي”GET /healthالاستجابة (200 OK، Content-Type: application/json):
{ "status": "healthy", "component": "cdn-edge", "engine": "nginx", "vendor_profiles": ["akamai", "cloudflare", "cloudfront", "fastly", "azure-front-door"]}وكيل CDN (جميع المسارات الأخرى)
Section titled “وكيل CDN (جميع المسارات الأخرى)”GET /<any-path>رؤوس الطلبات المُحقنة نحو المصدر (أكثر من 67 رأسًا من 5 بائعين):
| الفئة | الرؤوس المُضافة |
|---|---|
| عنوان IP للعميل | True-Client-IP وCF-Connecting-IP وFastly-Client-IP وX-Azure-ClientIP وCloudFront-Viewer-Address وX-Forwarded-For وX-Real-IP |
| تحديد الموقع الجغرافي | X-Akamai-Edgescape (مركّب) وCF-IPCountry وcf-ipcity وcf-iplatitude/longitude وCloudFront-Viewer-Country/City/Latitude/Longitude وX-Geo-Country-Code/City/Region |
| اكتشاف الجهاز | CloudFront-Is-Mobile-Viewer وCloudFront-Is-Desktop-Viewer وCloudFront-Is-Tablet-Viewer وX-Akamai-Device-Characteristics |
| TLS/البصمة الرقمية | CloudFront-Viewer-TLS وcf-ja3-hash وcf-ja4 وCloudFront-Viewer-JA3-Fingerprint |
| اكتشاف البوت | cf-bot-score (85 = يُرجّح أنه إنسان) وcf-verified-bot |
| تتبع الطلبات | Cf-Ray وX-Akamai-Request-ID وX-Amz-Cf-Id وX-Azure-Ref |
| هوية الحافة | X-CDN-Edge وX-CDN-POP وX-Served-By وFastly-FF وX-Azure-FDID |
| قياسي | Via وForwarded وCDN-Loop وX-Forwarded-Proto/Host/Port |
رؤوس الاستجابة المُضافة إلى كل استجابة وكيل:
| الرأس | القيم | الغرض |
|---|---|---|
X-Cache-Status | HIT أو MISS أو BYPASS أو EXPIRED أو STALE | سلوك التخزين المؤقت لهذا الطلب |
X-CDN-Edge | cdn-simulator | يُعرّف بعقدة الحافة هذه |
X-CDN-POP | SJC | رمز IATA لنقطة التواجد المحاكاة |
X-Served-By | cache-sjc3120-SJC | عقدة التخزين المؤقت المحاكاة بتنسيق Fastly |
X-Request-ID | UUID (لكل طلب) | معرّف فريد للطلب |
سلوك التخزين المؤقت
Section titled “سلوك التخزين المؤقت”- الطلب الأول إلى أي مسار:
X-Cache-Status: MISS(مُجلب من المصدر، مُخزَّن الآن مؤقتًا) - الطلبات المتطابقة اللاحقة:
X-Cache-Status: HIT(مُقدَّم من التخزين المؤقت على القرص) - مفتاح التخزين المؤقت:
$scheme$host$request_uri(المخطط + اسم المضيف + المسار الكامل + سلسلة الاستعلام) - مدة صلاحية التخزين المؤقت: 10 دقائق للاستجابات 200/301/302، و1 دقيقة للاستجابات 404
- تقديم المحتوى القديم: يُعيد المحتوى المُخزَّن مؤقتًا عند حدوث أخطاء المصدر (500/502/503/504)
الوصول إلى الجهاز الافتراضي
Section titled “الوصول إلى الجهاز الافتراضي”| طريقة الوصول | الأمر/المسار |
|---|---|
| SSH | ssh azureuser@<PUBLIC_IP> |
| تهيئة NGINX | /etc/nginx/conf.d/cdn-edge.conf |
| سجلات NGINX | /var/log/nginx/access.log و/var/log/nginx/error.log |
| دليل التخزين المؤقت | /var/cache/nginx/cdn/ |
| سجل Cloud-init | /var/log/cloud-init-output.log |
التصميم المعياري للمكونات
Section titled “التصميم المعياري للمكونات”هذا المكوّن جزء واحد من بيئة مختبر أكبر. كل مكوّن مستقل بذاته ويُنشر بشكل مستقل:
- هذا المكوّن يوفر حافة CDN (NGINX على Azure VM)
- مكونات أخرى توفر تطبيق المصدر، وتهيئة F5 XC، وDNS، وسياسات جدار حماية تطبيقات الويب (WAF)، وغيرها.
يُضيف المشغّل البشري المكونات واحدًا تلو الآخر. توثيق كل مكوّن مكتوب بحيث يستطيع مساعد الذكاء الاصطناعي قراءته ونشر البنية التحتية باستقلالية تامة.
سبب اختيار NGINX
Section titled “سبب اختيار NGINX”تم اختيار NGINX محرّكًا لمحاكاة CDN للأسباب التالية:
- منتج F5 — استحوذت F5 على NGINX Inc. عام 2019؛ وهو جزء من محفظة منتجات F5
- مُثبَت صناعيًا — اعتمدت Cloudflare شبكة CDN الخاصة بها بالكامل على NGINX لأكثر من عقد قبل الانتقال إلى Pingora؛ تستخدم Netflix كذلك NGINX لشبكة Open Connect CDN الخاصة بها
- عملية واحدة — يتولى إنهاء TLS والتخزين المؤقت في ملف ثنائي واحد، على عكس Varnish الذي يتطلب وكيل TLS منفصلًا
- نشر بسيط —
apt install nginxعلى Ubuntu 24.04، وتوجيهان يُفعّلان التخزين المؤقت - موثّق توثيقًا جيدًا — توثيق رسمي شامل لتخزين المحتوى المؤقت وتهيئة الوكيل العكسي