- หน้าแรก
- ตัวจำลอง CDN
- ภาพรวม
ภาพรวม
วัตถุประสงค์
หัวข้อที่มีชื่อว่า “วัตถุประสงค์”ส่วนประกอบนี้จำลองโหนดขอบ 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 เพื่อให้สามารถสาธิตและทดสอบการผสานรวมได้โดยไม่ต้องมีสัญญากับผู้ให้บริการหรือโครงสร้างพื้นฐานในการผลิตจริง
สถาปัตยกรรม
หัวข้อที่มีชื่อว่า “สถาปัตยกรรม”┌─────────┐ ┌──────────────────────┐ ┌─────────────────┐ ┌────────────┐│ 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 ที่ขอบ (self-signed หรือ Let’s Encrypt)
- แคชการตอบสนอง บนดิสก์โดยใช้
proxy_cache_path - ส่งต่อ cache miss ไปยัง เซิร์ฟเวอร์ต้นทาง ที่กำหนดค่าได้ (VIP ของตัวกระจายโหลด HTTP ของ F5 XC)
- รายงานสถานะแคช ผ่านส่วนหัวการตอบสนอง
X-Cache-Status(HIT,MISS,BYPASS,EXPIRED)
สิ่งที่จำลอง
หัวข้อที่มีชื่อว่า “สิ่งที่จำลอง”| ฟังก์ชัน CDN | การนำไปใช้งานด้วย NGINX |
|---|---|
| การแคชที่ขอบ | proxy_cache พร้อมพื้นที่จัดเก็บบนดิสก์ |
| การสร้าง cache key | proxy_cache_key อ้างอิงจากรูปแบบ, โฮสต์ และ URI |
| การดึงจาก Origin | proxy_pass ไปยังตัวกระจายโหลด HTTP ของ F5 XC |
| การยุติ TLS | คำสั่ง ssl_certificate ของ NGINX |
| การเคารพ Cache-Control | proxy_cache_valid พร้อมการส่งผ่านส่วนหัวจาก Origin |
| การรายงานสถานะแคช | add_header X-Cache-Status $upstream_cache_status |
| จุดปลายทางสุขภาพ | ตำแหน่ง /health ที่ส่งคืน 200 OK |
จุดปลายทางและพฤติกรรมคำขอ/การตอบสนอง
หัวข้อที่มีชื่อว่า “จุดปลายทางและพฤติกรรมคำขอ/การตอบสนอง”การตรวจสอบสุขภาพ
หัวข้อที่มีชื่อว่า “การตรวจสอบสุขภาพ”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 Proxy (ทุกเส้นทางอื่นๆ)
หัวข้อที่มีชื่อว่า “CDN Proxy (ทุกเส้นทางอื่นๆ)”GET /<any-path>ส่วนหัวคำขอที่แทรกไปยัง Origin (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/Fingerprint | 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 ของ Point of Presence ที่จำลอง |
X-Served-By | cache-sjc3120-SJC | โหนดแคชที่จำลองในรูปแบบ Fastly |
X-Request-ID | UUID (ต่อคำขอ) | ตัวระบุคำขอที่ไม่ซ้ำกัน |
พฤติกรรมแคช
หัวข้อที่มีชื่อว่า “พฤติกรรมแคช”- คำขอแรกไปยังเส้นทางใดๆ:
X-Cache-Status: MISS(ดึงจาก Origin แล้วแคชไว้) - คำขอที่เหมือนกันในครั้งต่อมา:
X-Cache-Status: HIT(ให้บริการจากแคชบนดิสก์) - Cache key:
$scheme$host$request_uri(รูปแบบ + ชื่อโฮสต์ + เส้นทางเต็ม + query string) - อายุแคช: 10 นาที สำหรับ 200/301/302 และ 1 นาที สำหรับ 404
- การให้บริการเนื้อหาเก่า: ส่งคืนเนื้อหาที่แคชไว้เมื่อ Origin เกิดข้อผิดพลาด (500/502/503/504)
การเข้าถึง VM
หัวข้อที่มีชื่อว่า “การเข้าถึง VM”| วิธีการเข้าถึง | คำสั่ง/เส้นทาง |
|---|---|
| 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 |
การออกแบบส่วนประกอบแบบโมดูลาร์
หัวข้อที่มีชื่อว่า “การออกแบบส่วนประกอบแบบโมดูลาร์”นี่คือชิ้นส่วนหนึ่งของสภาพแวดล้อมแล็บขนาดใหญ่ แต่ละส่วนประกอบเป็นแบบ self-contained และปรับใช้อย่างอิสระ:
- ส่วนประกอบนี้ ให้บริการขอบ CDN (NGINX บน Azure VM)
- ส่วนประกอบอื่นๆ ให้บริการแอปพลิเคชัน Origin, การกำหนดค่า F5 XC, DNS, นโยบาย WAF ฯลฯ
ผู้ดำเนินการที่เป็นมนุษย์เพิ่มส่วนประกอบทีละชิ้น เอกสารของแต่ละส่วนประกอบเขียนขึ้นเพื่อให้ผู้ช่วย AI อ่านและปรับใช้โครงสร้างพื้นฐานได้อย่างอิสระ
เหตุผลที่เลือก NGINX
หัวข้อที่มีชื่อว่า “เหตุผลที่เลือก NGINX”NGINX ถูกเลือกเป็นเอนจิ้นจำลอง CDN เพราะ:
- ผลิตภัณฑ์ F5 — F5 เข้าซื้อกิจการ NGINX Inc. ในปี 2019 และเป็นส่วนหนึ่งของพอร์ตโฟลิโอ F5
- พิสูจน์แล้วในอุตสาหกรรม — Cloudflare รัน CDN ทั้งหมดบน NGINX มานานกว่าหนึ่งทศวรรษก่อนจะย้ายไปใช้ Pingora; Netflix ใช้ NGINX สำหรับ CDN Open Connect ของตน
- กระบวนการเดียว — จัดการการยุติ TLS และการแคชในไบนารีเดียว ต่างจาก Varnish ที่ต้องใช้พรอกซี TLS แยกต่างหาก
- ปรับใช้ได้ง่าย —
apt install nginxบน Ubuntu 24.04 สองคำสั่งเปิดใช้งานการแคช - มีเอกสารครบถ้วน — เอกสารอย่างเป็นทางการที่ครอบคลุมสำหรับการแคชเนื้อหาและการกำหนดค่า reverse proxy