AWS EC2 Deployment Guide for Web Applications

Complete AWS EC2 deployment guide: instance selection, security groups, Node.js deployment, Nginx reverse proxy, SSL, auto-scaling, CloudWatch monitoring, and cost optimization.

E
ECOSIRE Research and Development Team
|19 Mart 20269 dk okuma2.1k Kelime|

Web Uygulamaları için AWS EC2 Dağıtım Kılavuzu

EC2, tutarlı performans, özel yazılım yığınları ve öngörülebilir fiyatlandırma gerektiren web uygulamaları için AWS'deki en esnek bilgi işlem seçeneği olmaya devam ediyor. ECS, EKS ve Lambda bulut tabanlı dünyada daha fazla ilgi görürken EC2 size tamamen kontrol ettiğiniz bir sunucu sunar; konteyner düzenleme karmaşıklığı yoktur, soğuk başlatma gecikmesi yoktur, sürpriz çağrı maliyetleri yoktur.

Bu kılavuz, EC2'de üretim Node.js web uygulamasının dağıtımını kapsar: örnek seçimi, güvenlik grubu yapılandırması, uygulama dağıtımı, Nginx ters proxy, Cloudflare ile SSL, CloudWatch ile izleme ve EC2 dağıtımını sağlıklı tutan devam eden bakım modelleri.

Önemli Çıkarımlar

  • t3.large, tam yığın Node.js + PostgreSQL dağıtımı için doğru başlangıç noktasıdır
  • Ubuntu 24.04 LTS kullanın — 2029'a kadar desteklenir, geniş çapta belgelenir, mükemmel paket kullanılabilirliği
  • Elastik IP zorunludur — EC2 IP'niz bu olmadan her durma/başlatmada değişir
  • Güvenlik grupları durum bilgisi içerir; yalnızca gelen kurallara ihtiyacınız vardır; giden genellikle hepsine izin ver şeklindedir
  • Dağıtım SSH anahtarınızı ayrı bir .pem dosyasında saklayın; asla git'e taahhüt etmeyin
  • Mümkün olduğunda doğrudan SSH yerine EC2 bulut sunucusu bağlantısını veya Oturum Yöneticisini kullanın (sıfır anahtar yönetimi)
  • CloudWatch aracısı size bellek ve disk ölçümlerini verir (varsayılan olarak mevcut değildir)
  • Rezerve Edilmiş Bulut Sunucuları veya Tasarruf Planları, EC2 maliyetlerini isteğe bağlı olarak %40-60 oranında azaltır

Örnek Seçimi

Doğru bulut sunucusu türü iş yükünüze bağlıdır:

İş YüküÖnerilen ÖrnekvCPURAMMaliyet/ay
Light (blog, küçük uygulama)t3.küçük22GB~18$
Orta (tam yığın uygulama)t3.medium24GB~35$
Üretim (çoklu hizmet)t3.large28GB~70$
Ağır (yüksek trafik API'si)c6i.xlarge48GB~140$
Bellek ağırlıklı (ML/önbellek)r6i.large216GB~120$

5 Node.js uygulamasına (Next.js, NestJS, Docusaurus, 2 marka site) ve Docker altyapısına (PostgreSQL, Redis, Authentik) sahip bir monorepo için t3.large minimum geçerli yapılandırmadır. t3 ailesi "artışlı" performans kullanır; normal çalışma sırasında performans mükemmeldir ancak sürekli yüksek CPU, kısıtlamayı tetikler.

Sürekli olarak yüksek CPU iş yükleri için (video işleme, makine öğrenimi çıkarımı, ağır şifreleme), bunun yerine c6i (bilgi işlem için optimize edilmiş) örnekleri kullanın.


İlk Sunucu Kurulumu

EC2 bulut sunucunuzu Ubuntu 24.04 ile başlattıktan sonra:

# Connect via SSH
ssh -i your-key.pem [email protected]

# Update system packages
sudo apt update && sudo apt upgrade -y

# Install essential tools
sudo apt install -y \
  git curl wget unzip \
  build-essential \
  nginx \
  certbot python3-certbot-nginx \
  docker.io docker-compose-plugin \
  htop ncdu iotop

# Install Node.js via NVM (allows easy version management)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 22
nvm use 22
nvm alias default 22

# Install pnpm
curl -fsSL https://get.pnpm.io/install.sh | sh -
source ~/.bashrc

# Install PM2 globally
npm install -g pm2

# Install PM2 log rotation immediately
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

Güvenlik Grubu Yapılandırması

Güvenlik grubu EC2 bulut sunucunuzun güvenlik duvarıdır. Dikkatlice yapılandırın:

Inbound Rules:
┌─────────┬──────────┬─────────────┬──────────────────────────────────┐
│ Type    │ Protocol │ Port Range  │ Source                           │
├─────────┼──────────┼─────────────┼──────────────────────────────────┤
│ SSH     │ TCP      │ 22          │ Your IP only (not 0.0.0.0/0!)    │
│ HTTP    │ TCP      │ 80          │ 0.0.0.0/0 (Cloudflare IPs only)  │
│ HTTPS   │ TCP      │ 443         │ 0.0.0.0/0 (Cloudflare IPs only)  │
└─────────┴──────────┴─────────────┴──────────────────────────────────┘

Note: Internal app ports (3000, 3001, 3002, etc.) should NOT be
      in the security group — traffic goes through Nginx only

Cloudflare proxy'li alanlar için HTTP/HTTPS'yi Cloudflare IP aralıklarıyla sınırlayın:

# Cloudflare IPv4 ranges — restrict port 80/443 source to these
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
104.16.0.0/13
104.24.0.0/14
108.162.192.0/18
131.0.72.0/22
141.101.64.0/18
162.158.0.0/15
172.64.0.0/13
173.245.48.0/20
188.114.96.0/20
190.93.240.0/20
197.234.240.0/22
198.41.128.0/17

Bu, Cloudflare'in WAF ve DDoS korumasını atlayarak sunucunuza doğrudan erişimi engeller.


Uygulama Dağıtımı

# Create application directory
sudo mkdir -p /opt/ecosire/app
sudo chown ubuntu:ubuntu /opt/ecosire/app

# Clone the repository
git clone https://github.com/your-org/your-repo.git /opt/ecosire/app
cd /opt/ecosire/app

# Create .env.local from template
cp .env.example .env.local
# Edit with production values
nano .env.local

# Install dependencies
pnpm install --frozen-lockfile

# Build everything
npx turbo run build

# Run database migrations
pnpm --filter @ecosire/db db:migrate

# Start infrastructure (PostgreSQL, Redis, Authentik)
docker compose -f infrastructure/docker-compose.dev.yml up -d

# Wait for services to be healthy
sleep 30

# Start Node.js applications
pm2 start ecosystem.config.cjs

# Save process list for reboot persistence
pm2 save

# Configure PM2 to start on system boot
pm2 startup
# Run the command it outputs

Elastik IP ve DNS

Bir EC2 bulut sunucusunun genel IP'si, onu her durdurduğunuzda ve başlattığınızda değişir. Elastik IP kalıcı bir IP sağlar:

# In AWS Console:
# 1. EC2 > Network & Security > Elastic IPs
# 2. Allocate Elastic IP address
# 3. Associate it with your instance

# Your IP is now permanent — update Cloudflare DNS to point to it
# A record: ecosire.com → 13.223.116.181 (your Elastic IP)
# A record: api.ecosire.com → 13.223.116.181
# A record: auth.ecosire.com → 13.223.116.181

Cloudflare'de bu kayıtları web trafiği için "Proxied" (turuncu bulut) olarak ayarlayın. Cloudflare proxy'si gerçek EC2 IP'nizi gizleyerek DDoS koruması sağlar.


Depolama: EBS Birim Yönetimi

EC2 bulut sunucuları bir kök EBS birimi içerir. Üretim için derleme yapıtları, günlükler ve Docker verileri için yeterli alana ihtiyacınız vardır:

# Check current disk usage
df -h

# Check which directories are consuming space
ncdu /

# Typical space requirements for a 5-app monorepo:
# - /opt/ecosire/app: ~2GB (code + node_modules + .next builds)
# - Docker data (/var/lib/docker): ~5GB
# - PM2 logs (/var/log/pm2): ~1GB (with rotation)
# - System: ~5GB
# Total: ~13GB minimum, recommend 30GB+ root volume

# If you need to resize an EBS volume (no downtime needed):
# 1. In AWS Console: EC2 > Volumes > Modify Volume
# 2. After resize completes, grow the filesystem:
sudo growpart /dev/xvda 1
sudo resize2fs /dev/xvda1

CloudWatch İzleme

EC2, varsayılan olarak temel CPU ve ağ ölçümlerini sağlar. Bellek ve disk ölçümleri için CloudWatch aracısını yükleyin:

# Download and install CloudWatch agent
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb

# Create configuration
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
// /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "cwagent"
  },
  "metrics": {
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "mem": {
        "measurement": ["mem_used_percent"],
        "metrics_collection_interval": 60
      },
      "disk": {
        "measurement": ["used_percent"],
        "metrics_collection_interval": 60,
        "resources": ["/", "/opt/ecosire"]
      }
    }
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/pm2/ecosire-api.err.log",
            "log_group_name": "/ec2/ecosire/api-errors",
            "log_stream_name": "{instance_id}"
          },
          {
            "file_path": "/var/log/nginx/ecosire-error.log",
            "log_group_name": "/ec2/ecosire/nginx-errors",
            "log_stream_name": "{instance_id}"
          }
        ]
      }
    }
  }
}
# Start the agent
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
  -s

Otomatik Yedeklemeler

S3'e otomatik PostgreSQL yedeklemelerini ayarlayın:

# Create backup script
cat > /opt/ecosire/scripts/backup-db.sh << 'EOF'
#!/bin/bash
set -e

DATE=$(date +%Y-%m-%d-%H%M%S)
BACKUP_FILE="/tmp/ecosire-db-${DATE}.sql.gz"
S3_BUCKET="s3://your-backups-bucket/postgres"

# Dump the database (connects via Docker network)
docker exec ecosire-postgres pg_dump \
  -U ecosire \
  -d ecosire_dev \
  --no-owner \
  --no-privileges \
  | gzip > "$BACKUP_FILE"

# Upload to S3
aws s3 cp "$BACKUP_FILE" "$S3_BUCKET/"

# Clean up local file
rm "$BACKUP_FILE"

# Delete backups older than 30 days from S3
aws s3 ls "$S3_BUCKET/" \
  | awk '{print $4}' \
  | sort \
  | head -n -30 \
  | xargs -I {} aws s3 rm "$S3_BUCKET/{}" 2>/dev/null || true

echo "Backup complete: ${DATE}"
EOF

chmod +x /opt/ecosire/scripts/backup-db.sh

# Schedule daily backups at 3 AM UTC
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/ecosire/scripts/backup-db.sh >> /var/log/db-backup.log 2>&1") | crontab -

IAM Rol Yapılandırması

AWS hizmet erişimi (S3, CloudWatch, SES) için EC2 bulut sunucunuza bir IAM rolü ekleyin:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::your-products-bucket",
        "arn:aws:s3:::your-products-bucket/*",
        "arn:aws:s3:::your-backups-bucket",
        "arn:aws:s3:::your-backups-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ses:SendEmail",
        "ses:SendRawEmail"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData",
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}

Örneğinize IAM rolü eklendiğinde AWS SDK çağrıları, örnek kimlik bilgilerini otomatik olarak kullanır; ortam değişkenlerinizde erişim anahtarına/gizli anahtara gerek yoktur.


Yaygın Tuzaklar ve Çözümler

Tuzak 1: Esnek IP yok — Yeniden başlatma sırasında IP değişiyor

Bir EC2 örneğinin durdurulması ve başlatılması (yeniden başlatılmaması) yeni bir genel IP atar. Elastik IP olmazsa DNS'niz bozulur. Örneğinizi başlattıktan hemen sonra bir Elastik IP tahsis edin ve ilişkilendirin.

2. Tuzak: SSH erişimi kilitlendi

SSH anahtarınızı kaybederseniz veya güvenlik gruplarını yanlış yapılandırarak kendinizi kilitlerseniz, AWS konsolundan EC2 Instance Connect'i (tarayıcı tabanlı SSH) veya Session Manager'ı (varsayılan olarak Ubuntu ile birlikte gelen SSM aracısının yüklü olmasını gerektirir) kullanın. Son çare olarak kök EBS birimini ayırın, başka bir örneğe ekleyin, yetkili_anahtarlar dosyasını düzeltin ve yeniden ekleyin.

3. Tuzak: Dağıtım sırasında disk alanının yetersiz kalması

.next derleme önbelleği ve node_modules geliştirme sırasında önemli ölçüde büyür. df -h ile disk kullanımını izleyin ve disk_used_percent > %80'e CloudWatch alarmı ayarlayın. ncdu komutu (ncdu /) hangi dizinlerin yer kapladığını tanımlar.

4. Tuzak: Node.js OOM'dan kaynaklanan hafıza tükenmesi

Node.js'nin, büyük uygulamalarda OOM çökmelerine neden olabilecek varsayılan bir bellek sınırı vardır (64 bitte 1,4 GB). Bellek kullanımını açıkça sınırlamak için PM2 ekosistem dosyanızda node_args: '--max-old-space-size=1024' değerini ayarlayın. Aşılması durumunda otomatik olarak yeniden başlatmak için max_memory_restart değerini bunun biraz üstüne ayarlayın.

Tuzak 5: Sürekli yük altında T3 CPU'nun yavaşlaması

T3 bulut sunucuları, hızlı performans için "CPU kredileri" kullanır. Genişletilmiş yüksek CPU işlemleri (büyük yapılar, ağır veritabanı sorguları) kredileri tüketerek "temel" performansın azalmasına neden olur. CloudWatch'ta CPUCreditBalance'ı izleyin. Krediler sürekli olarak tükeniyorsa, bir c6i örneğine yükseltin veya "sınırsız" modu etkinleştirin (taban çizgisinin üzerinde CPU saati başına ek maliyet).


Sıkça Sorulan Sorular

EC2'yi mi yoksa AWS Elastic Beanstalk gibi yönetilen bir hizmeti mi kullanmalıyım?

EC2 size tam kontrol sağlar: tam Node.js sürümü, dosya sistemi erişimi, Docker sepet konteynerlerini çalıştırma yeteneği ve özel Nginx yapılandırması. Elastic Beanstalk temel altyapıyı yönetir ancak seçeneklerinizi kısıtlar ve sorun gidermeyi karmaşık hale getirir. Linux sunucu yönetimi konusunda deneyimli bir ekip için PM2 + Nginx içeren EC2, yönetilen platformlara göre daha basit ve daha öngörülebilirdir. Platformun ölçeklendirmeyi ve sistem durumu yönetimini otomatik olarak yönetmesini istiyorsanız Beanstalk'ı kullanın.

EC2'de sıfır kesinti süreli dağıtımları nasıl halledebilirim?

PM2 pm2 reload komutu, küme modu işlemleri (NestJS API) için sıfır kesinti süresi sağlar. Next.js (çatal modu) için önce yeni sürümü oluşturun, ardından PM2'yi yeniden yükleyin. PM2'nin işlemleri değiştirmesi için geçen birkaç saniye boyunca Nginx, gelen istekleri (küçük bir zaman aşımı ile) sıraya koyar. Gerçek anlamda sıfır kesinti süresi için, bir ALB'nin (Uygulama Yük Dengeleyicisi) arkasında iki EC2 bulut sunucusu kullanın ve birine dağıtım yaparken diğeri trafiğe hizmet verin.

Otomatik ölçeklendirmeyi ne zaman kullanmalıyım?

Otomatik ölçeklendirme, durum denetimleri, başlatma şablonları, yük dengeleyiciler ve oturum benzeşimi hususları gibi önemli düzeyde operasyonel karmaşıklık katar. Tahmin edilebilir trafiğe sahip uygulamalar için, dikey ölçeklendirmeye (daha büyük bulut sunucusu türü) sahip, uygun boyutta bir EC2 bulut sunucusu, yatay otomatik ölçeklendirmeden daha basit ve çoğu zaman daha ucuzdur. Trafiğinizde taban çizgisinin 5 katından fazla ani artışlar yaşandığında ve kalıcı olarak daha büyük bir örneği çalıştırmanın maliyeti, otomatik ölçeklendirmenin karmaşıklığını aştığında otomatik ölçeklendirmeyi düşünün.

EC2'den kapsayıcılara daha sonra nasıl geçiş yaparım?

Uygulamanızı Docker ile kapsayıcı hale getirerek başlayın (her uygulama için bir Docker dosyası yazın). Docker Compose ile yerel olarak test edin. Ardından ECS Fargate (sunucusuz konteynerler, daha basit) veya EKS (Kubernetes, daha güçlü ama karmaşık) arasından seçim yapın. Aşamalı olarak kapsayıcıya alırsanız geçiş kesintiye neden olmaz; kapsayıcıya alınmış sürümü aynı Nginx/Cloudflare kurulumunun arkasında çalıştırın, davranışı doğrulayın ve ardından işlemi sonlandırın.

EC2'yi üretimde çalıştırmanın en uygun maliyetli yolu nedir?

Temel bulut sunucunuz için 1 yıllık Rezerve Edilmiş Bulut Sunucusu (peşin veya kısmi ön ödeme yok) satın alın; isteğe bağlı bulut sunucusundan %40 daha ucuz. Trafik artışları sırasında ek kapasite için, uygulamanız kesintileri kaldırabiliyorsa Spot Bulut Sunucularını kullanın (%90'a kadar daha ucuz). Beklenmedik maliyet artışlarının erken fark edilmesi için aylık bütçenizin %80'ine CloudWatch faturalandırma alarmı kurun. Üretim web uygulamaları için Rezerve Edilmiş Bulut Sunucuları en iyi maliyet ve güvenilirlik dengesini sağlar.


Sonraki Adımlar

EC2'de bir üretim web uygulaması çalıştırmak, güvenlik yamaları, disk yönetimi, performans izleme ve dağıtım otomasyonu gibi sürekli operasyonel dikkat gerektirir. ECOSIRE, otomatik yedeklemeler, CloudWatch izleme ve sıfır kesinti süreli PM2 dağıtımları ile birden fazla etki alanında 5 uygulamaya hizmet veren bir üretim EC2 t3.large örneğini çalıştırır.

Node.js uygulamanız için AWS altyapı danışmanlığına, EC2 dağıtım kurulumuna veya DevOps desteğine ihtiyacınız varsa, nasıl yardımcı olabileceğimizi görmek için hizmetlerimizi keşfedin.

E

Yazan

ECOSIRE Research and Development Team

ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.

WhatsApp'ta Sohbet Et