انتقل إلى المحتوى الرئيسي

بنية الويب على AWS

مقدمة​

يتطلب نشر خدمة ويب على AWS دمج عدة خدمات: VPC، EC2، موازن تحميل، واستراتيجية أمان جيدة. تغطي هذه القسم الأنماط الأكثر شيوعًا للبنية.

النمط 1: بنية بسيطة​

مثيل EC2 عام​

┌─────────────────────────────────────────────────────────────┐
│ بنية بسيطة (تطوير/اختبار) │
├─────────────────────────────────────────────────────────────┤
│ │
│ الإنترنت │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ IGW │ │
│ └────┬─────┘ │
│ │ │
│ ┌─────────────────────┼─────────────────────┐ │
│ │ VPC │ │ │
│ │ │ │ │
│ │ ┌─────────────────▼───────────────────┐ │ │
│ │ │ الشبكة الفرعية العامة │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────────┐ │ │ │
│ │ │ │ EC2 │ │ │ │
│ │ │ │ خادم الويب │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ IP: 52.1.2.3 │ │ │ │
│ │ │ │ SG: web-server │ │ │ │
│ │ │ └─────────────────┘ │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ المزايا: │
│ ✅ سهل النشر │
│ ✅ تكلفة منخفضة │
│ ✅ مثالي للتطوير/الاختبار │
│ │
│ العيوب: │
│ ❌ لا يوجد توفر عالي │
│ ❌ نقطة فشل واحدة │
│ ❌ غير قابل للتوسع │
│ │
└─────────────────────────────────────────────────────────────┘

التكوين​

# 1. إنشاء مجموعة أمان للويب
aws ec2 create-security-group \
--group-name sg-web-simple \
--description "Web server SG" \
--vpc-id vpc-xxx

# 2. السماح لـ HTTP و HTTPS
aws ec2 authorize-security-group-ingress \
--group-id sg-xxx \
--protocol tcp --port 80 --cidr 0.0.0.0/0

aws ec2 authorize-security-group-ingress \
--group-id sg-xxx \
--protocol tcp --port 443 --cidr 0.0.0.0/0

# 3. تشغيل المثيل
aws ec2 run-instances \
--image-id ami-xxx \
--instance-type t3.micro \
--subnet-id subnet-public \
--security-group-ids sg-xxx \
--associate-public-ip-address \
--user-data '#!/bin/bash
yum install -y httpd
systemctl start httpd
echo "Hello World" > /var/www/html/index.html'

النمط 2: بنية مع موازن تحميل​

ALB + مثيلات خاصة​

┌─────────────────────────────────────────────────────────────────────────┐
│ بنية مع ALB (إنتاج) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ الإنترنت │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ IGW │ │
│ └────┬─────┘ │
│ │ │
│ ┌────────────────────────────┼────────────────────────────────┐ │
│ │ VPC │ (10.0.0.0/16) │ │
│ │ │ │ │
│ │ ┌────────────────────────┴────────────────────────────┐ │ │
│ │ │ الشبكات الفرعية العامة │ │ │
│ │ │ │ │ │
│ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │
│ │ │ │ عام 1a │ │ عام 1b │ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │ │
│ │ │ │ │ ALB │◄─┼──────────────┼──│ ALB │ │ │ │ │
│ │ │ │ │ node │ │ │ │ node │ │ │ │ │
│ │ │ │ └───┬───┘ │ │ └───┬───┘ │ │ │ │
│ │ │ └──────┼──────┘ └──────┼──────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ └─────────┼────────────────────────────┼───────────────┘ │ │
│ │ │ │ │ │
│ │ ┌─────────┼────────────────────────────┼───────────────┐ │ │
│ │ │ │ الشبكات الفرعية الخاصة │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ │ │
│ │ │ │ خاص 1a │ │ خاص 1b │ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │ │
│ │ │ │ │ EC2 │ │ │ │ EC2 │ │ │ │ │
│ │ │ │ │ ويب 1 │ │ │ │ ويب 2 │ │ │ │ │
│ │ │ │ └─────────┘ │ │ └─────────┘ │ │ │ │
│ │ │ └─────────────┘ └─────────────┘ │ │ │
│ │ │ │ │ │
│ │ └──────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ المزايا: │
│ ✅ توفر عالي (متعدد المناطق) │
│ ✅ قابل للتوسع (إضافة مثيلات) │
│ ✅ إنهاء SSL على مستوى ALB │
│ ✅ خوادم الويب محمية (شبكة فرعية خاصة) │
│ │
└─────────────────────────────────────────────────────────────────────────┘

أنواع موازنات التحميل AWS​

النوعالاستخدامطبقة OSIالبروتوكولات
ALBتطبيقات HTTP/HTTPSطبقة 7HTTP، HTTPS، gRPC
NLBأداء فائقطبقة 4TCP، UDP، TLS
CLBقديمطبقة 4/7TCP، SSL، HTTP، HTTPS
GWLBأجهزة الشبكةطبقة 3IP

تكوين ALB​

# 1. إنشاء مجموعة الهدف
aws elbv2 create-target-group \
--name tg-web-servers \
--protocol HTTP \
--port 80 \
--vpc-id vpc-xxx \
--health-check-path /health \
--health-check-interval-seconds 30

# 2. إنشاء موازن التحميل للتطبيق
aws elbv2 create-load-balancer \
--name alb-web \
--subnets subnet-public-1a subnet-public-1b \
--security-groups sg-alb \
--scheme internet-facing \
--type application

# 3. إنشاء المستمع
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:...:alb-web \
--protocol HTTP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=arn:aws:...:tg-web-servers

# 4. تسجيل المثيلات
aws elbv2 register-targets \
--target-group-arn arn:aws:...:tg-web-servers \
--targets Id=i-web1 Id=i-web2

النمط 3: بنية ثلاثية الطبقات​

ويب + تطبيق + قاعدة بيانات​

┌─────────────────────────────────────────────────────────────────────────┐
│ بنية ثلاثية الطبقات │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ الإنترنت │
│ │ │
│ ┌──────▼──────┐ │
│ │ IGW │ │
│ └──────┬──────┘ │
│ │ │
│ ┌──────────────────────────────┼──────────────────────────────┐ │
│ │ VPC │ │ │
│ │ │ │ │
│ │ ╔══════════════════════════╧════════════════════════════╗ │ │
│ │ ║ الطبقة 1: العرض ║ │ │
│ │ ║ (شبكة فرعية عامة) ║ │ │
│ │ ║ ║ │ │
│ │ ║ ┌─────────────────────────┐ ║ │ │
│ │ ║ │ موازن تحميل التطبيق │ ║ │ │
│ │ ║ │ (ALB) │ ║ │ │
│ │ ║ └───────────┬─────────────┘ ║ │ │
│ │ ╚═══════════════════════╪═══════════════════════════════╝ │ │
│ │ │ │ │
│ │ ╔═══════════════════════╪═══════════════════════════════╗ │ │
│ │ ║ الطبقة 2: التطبيق ║ │ │
│ │ ║ (شبكة فرعية خاصة للتطبيق) ║ │ │
│ │ ║ │ ║ │ │
│ │ ║ ┌────────────────────┼────────────────────┐ ║ │ │
│ │ ║ │ │ │ ║ │ │
│ │ ║ ┌───▼───┐ ┌─────▼─────┐ ┌─────▼───┐ ║ │ │
│ │ ║ │ EC2 │ │ EC2 │ │ EC2 │ ║ │ │
│ │ ║ │ تطبيق 1 │ │ تطبيق 2 │ │ تطبيق 3 │ ║ │ │
│ │ ║ └───┬───┘ └─────┬─────┘ └────┬────┘ ║ │ │
│ │ ║ │ │ │ ║ │ │
│ │ ╚══════╪════════════════════╪═══════════════════╪═══════╝ │ │
│ │ │ │ │ │ │
│ │ ╔══════╪════════════════════╪═══════════════════╪═══════╗ │ │
│ │ ║ │ الطبقة 3: البيانات │ │ ║ │ │
│ │ ║ │ (شبكة فرعية خاصة لقاعدة البيانات) │ ║ │ │
│ │ ║ │ │ │ ║ │ │
│ │ ║ └────────────────────┼───────────────────┘ ║ │ │
│ │ ║ │ ║ │ │
│ │ ║ ┌──────▼──────┐ ║ │ │
│ │ ║ │ RDS │ ║ │ │
│ │ ║ │ MySQL │ ║ │ │
│ │ ║ │ متعدد المناطق │ ║ │ │
│ │ ║ └─────────────┘ ║ │ │
│ │ ║ ║ │ │
│ │ ╚════════════════════════════════════════════════════════╝ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘

مجموعات الأمان للطبقات الثلاث​

┌─────────────────────────────────────────────────────────────┐
│ مجموعات الأمان للطبقات الثلاث │
├─────────────────────────────────────────────────────────────┤
│ │
│ sg-alb (موازن التحميل) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Inbound: HTTP/443 من 0.0.0.0/0 │ │
│ │ Outbound: HTTP/80 إلى sg-app │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ sg-app (خوادم التطبيقات) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Inbound: HTTP/80 من sg-alb │ │
│ │ Inbound: SSH/22 من sg-bastion │ │
│ │ Outbound: MySQL/3306 إلى sg-db │ │
│ │ Outbound: HTTPS/443 إلى 0.0.0.0/0 (APIs خارجية) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ sg-db (قاعدة البيانات) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Inbound: MySQL/3306 من sg-app │ │
│ │ Outbound: لا شيء (أو الحد الأدنى) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ المبدأ: كل طبقة تقبل فقط حركة المرور من الطبقة السابقة │
│ │
└─────────────────────────────────────────────────────────────┘

الفحوصات الصحية​

تكوين الفحص الصحي لـ ALB​

┌─────────────────────────────────────────────────────────────┐
│ الفحوصات الصحية لـ ALB │
├─────────────────────────────────────────────────────────────┤
│ │
│ المعلمات المهمة: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Protocol : HTTP │ │
│ │ Path : /health أو /api/health │ │
│ │ Port : traffic-port (80) │ │
│ │ Healthy threshold : 2 (نجاحات متتالية) │ │
│ │ Unhealthy threshold : 3 (إخفاقات متتالية) │ │
│ │ Timeout : 5 ثواني │ │
│ │ Interval : 30 ثانية │ │
│ │ Success codes : 200-299 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ نقطة النهاية /health النموذجية: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ HTTP 200 OK │ │
│ │ { │ │
│ │ "status": "healthy", │ │
│ │ "database": "connected", │ │
│ │ "cache": "connected" │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

DNS مع Route 53​

┌─────────────────────────────────────────────────────────────┐
│ ROUTE 53 + ALB │
├─────────────────────────────────────────────────────────────┤
│ │
│ المستخدم يكتب: www.monsite.com │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Route 53 │ │
│ │ DNS │ │
│ └──────┬───────┘ │
│ │ │
│ │ سجل Alias │
│ │ www.monsite.com │
│ │ → alb-web-xxx.elb.amazonaws.com│
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ ALB │ │
│ └──────────────┘ │
│ │
│ أنواع السجلات: │
│ • A (Alias) : يشير إلى موارد AWS (ALB، CF، S3) │
│ • CNAME : يشير إلى اسم نطاق آخر │
│ │
│ ميزة Alias: │
│ ✅ مجاني للطلبات إلى موارد AWS │
│ ✅ يرد مع عناوين IP مباشرة │
│ │
└─────────────────────────────────────────────────────────────┘

ملخص الأنماط​

النمطالتعقيدالتكلفةHAحالة الاستخدام
EC2 بسيط⭐$❌تطوير/اختبار
ALB + EC2⭐⭐$$✅إنتاج بسيط
ثلاثي الطبقات⭐⭐⭐$$$✅✅إنتاج
الخدمات المصغرة⭐⭐⭐⭐$$$$✅✅✅نطاق واسع

القسم التالي: مختبر: نشر الويب