Skip to content
Back to blog
Rehber Node.js AWS EC2 Deploy PM2 Nginx SSL DevOps Mistral

Node.js Uygulamalarınızı AWS EC2 Üzerine Kolayca Deploy Etme: Adım Adım Rehber

Node.js uygulamalarınızı AWS EC2 üzerinde nasıl güvenli ve ölçeklenebilir şekilde yayınlayacağınızı adım adım öğrenin. Bu rehberde, PM2, Nginx reverse proxy ve Let’s Encrypt SSL sertifikalarıyla profesyonel bir yayınlama süreci oluşturacaksınız.

Caner Serbest

Sistem ve Altyapı

10 min read

Node.js Uygulamalarınızı AWS EC2 Üzerine Kolayca Deploy Etme: Adım Adım Rehber

Merhaba! Bu rehberde, Node.js uygulamalarınızı AWS EC2 bulut sunucusuna nasıl güvenli, ölçeklenebilir ve performans odaklı bir şekilde yayınlayacağınızı adım adım öğreneceksiniz. AWS EC2, geliştiricilerin ve sistem yöneticilerinin en sık tercih ettiği bulut sunucu hizmetlerinden biridir. Bu rehberde, uygulamanızı yayınlamak için gerekli tüm adımları, en iyi uygulamaları ve sık karşılaşılan sorunların çözümlerini ele alacağız.

İçindekiler


1. Gerekli Ön Koşullar

Bu rehberde ilerleyebilmek için aşağıdaki ön koşulları sağlamanız gerekmektedir:

  1. AWS Hesabı: AWS hesabınızın olması gerekmektedir. Eğer hesabınız yoksa AWS web sitesi üzerinden ücretsiz bir hesap oluşturabilirsiniz.
  2. Node.js Uygulaması: Yayınlamak istediğiniz Node.js uygulamasının hazır olması gerekmektedir. Uygulamanızın package.json dosyası ve gerekli bağımlılıkları içermelidir.
  3. Alan Adı (Opsiyonel): Eğer uygulamanızı bir alan adı üzerinden yayınlamak istiyorsanız, bir alan adına sahip olmanız gerekmektedir. Bu rehberde alan adı kullanımı opsiyoneldir.
  4. SSH Anahtarı: AWS EC2’ye bağlanmak için bir SSH anahtar çiftine ihtiyacınız olacaktır. Eğer yoksa AWS konsolundan bir tane oluşturabilirsiniz.

2. AWS EC2 Sunucusunu Hazırlama

AWS EC2 sunucusunu hazırlamak için aşağıdaki adımları izleyin:

2.1. EC2 Örneği Oluşturma

  1. AWS Management Console’a giriş yapın ve EC2 hizmetini seçin.
  2. Launch Instance butonuna tıklayın.
  3. Name and tags bölümünde, örneğinize bir ad verin (örneğin: nodejs-app-server).
  4. Application and OS Images (Amazon Machine Image - AMI) bölümünde, Ubuntu Server 22.04 LTS seçeneğini seçin. Ubuntu, Node.js uygulamaları için yaygın olarak kullanılan ve iyi desteklenen bir işletim sistemidir.
  5. Instance type bölümünde, t2.micro seçeneğini seçin. Bu, ücretsiz kullanım sınırları içerisinde olan bir seçenektir. Üretim ortamında daha güçlü bir instance türü tercih edebilirsiniz.
  6. Key pair (login) bölümünde, yeni bir SSH anahtar çifti oluşturun veya mevcut birini seçin. Bu anahtar, sunucuya SSH üzerinden bağlanmanızı sağlayacaktır.
  7. Network settings bölümünde, aşağıdaki ayarları yapın:
    • Allow SSH traffic: Evet (port 22)
    • Allow HTTP traffic from the internet: Evet (port 80)
    • Allow HTTPS traffic from the internet: Evet (port 443)
  8. Configure storage bölümünde, varsayılan olarak gelen 8 GB’lık depolama alanını kabul edin veya ihtiyacınıza göre artırın.
  9. Launch Instance butonuna tıklayın.

2.2. Güvenlik Grubu Ayarları

EC2 örneğiniz oluşturulduktan sonra, güvenlik grubunuza aşağıdaki kuralları ekleyin:

TürProtokolPort AralığıKaynak
SSHTCP220.0.0.0/0
HTTPTCP800.0.0.0/0
HTTPSTCP4430.0.0.0/0

Not: SSH erişimini sadece belirli IP adreslerinden sınırlamak için kaynak olarak 0.0.0.0/0 yerine, kendi IP adresinizi veya ofisinizin IP aralığını kullanabilirsiniz. Bu, güvenlik açısından daha iyi bir uygulamadır.

2.3. Örnek Bağlantısı

EC2 örneğinizin durumunu “Running” olarak gördüğünüzde, aşağıdaki komutla sunucuya SSH üzerinden bağlanabilirsiniz:

ssh -i /path/to/your-key.pem ubuntu@<EC2-Instance-Public-IP>

Örnek:

ssh -i ~/.ssh/nodejs-app-key.pem [email protected]

3. Node.js ve Bağımlılıkların Kurulumu

Sunucuya bağlandıktan sonra, Node.js ve gerekli bağımlılıkları kurun:

3.1. Node.js Kurulumu

Ubuntu’da Node.js kurmak için aşağıdaki komutları çalıştırın:

# Node.js 18.x (LTS) kurulumu
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# Node.js ve npm versiyonlarını kontrol edin
node -v
npm -v

3.2. PM2 Kurulumu

PM2, Node.js uygulamalarınızı yönetmek ve sürekli çalışır durumda tutmak için kullanılan popüler bir araçtır. PM2’yi global olarak kurun:

sudo npm install -g pm2

3.3. Diğer Bağımlılıklar

Uygulamanızın bağımlılıklarını kurmak için proje dizinine gidin ve aşağıdaki komutu çalıştırın:

cd /path/to/your/app
npm install

4. Uygulamanın Sunucuya Aktarılması

Uygulamanızı sunucuya aktarmak için birkaç yöntem bulunmaktadır. En yaygın kullanılan yöntemler arasında scp (Secure Copy) ve rsync bulunmaktadır.

4.1. Uygulamanın Aktarılması (scp)

Aşağıdaki komutla uygulamanızı sunucuya aktarın:

scp -i /path/to/your-key.pem -r /path/to/local/app ubuntu@<EC2-Instance-Public-IP>:/home/ubuntu/app

Örnek:

scp -i ~/.ssh/nodejs-app-key.pem -r ~/projects/my-node-app [email protected]:/home/ubuntu/app

4.2. Aktarılan Uygulamanın Kontrolü

Sunucuya bağlandıktan sonra, aktarılan uygulamanın dizinine gidin ve dosyaların doğru şekilde aktarıldığından emin olun:

cd /home/ubuntu/app
ls -la

5. PM2 ile Uygulamanın Yönetimi

PM2, Node.js uygulamalarınızı yönetmek ve sürekli çalışır durumda tutmak için kullanılan bir araçtır. PM2’yi kullanarak uygulamanızı başlatabilir, durdurabilir, yeniden başlatabilir ve izleyebilirsiniz.

5.1. PM2 ile Uygulamanın Başlatılması

Aşağıdaki komutla uygulamanızı PM2 ile başlatın:

pm2 start app.js --name "my-node-app"

Not: app.js dosyanızın adı farklıysa, ilgili dosya adını kullanın.

5.2. PM2 Komutları

PM2 ile kullanabileceğiniz bazı temel komutlar:

KomutAçıklama
pm2 listÇalışan uygulamaları listeleyin.
pm2 logsUygulamanın loglarını görüntüleyin.
pm2 restart <app-name>Uygulamayı yeniden başlatın.
pm2 stop <app-name>Uygulamayı durdurun.
pm2 delete <app-name>Uygulamayı PM2’den silin.
pm2 saveMevcut uygulamaları kaydedin.
pm2 startupPM2’yi sistem başlangıcında otomatik başlatın.

5.3. PM2’yi Sistem Başlangıcında Başlatma

PM2’yi sistem başlangıcında otomatik olarak başlatmak için aşağıdaki komutu çalıştırın:

pm2 startup
pm2 save

Bu komutlar, PM2’yi sistem başlangıcında otomatik olarak başlatacak ve mevcut uygulamaları kaydedecektir.


6. Nginx ile Reverse Proxy Kurulumu

Nginx, HTTP ve ters proxy olarak kullanılan popüler bir web sunucusudur. Uygulamanızı doğrudan localhost:3000 gibi bir port üzerinden yayınlamak yerine, Nginx kullanarak uygulamanızı bir alan adı üzerinden yayınlayabilirsiniz.

6.1. Nginx Kurulumu

Nginx’i kurmak için aşağıdaki komutları çalıştırın:

sudo apt update
sudo apt install -y nginx

6.2. Nginx Konfigürasyonu

Nginx konfigürasyon dosyasını oluşturun ve düzenleyin:

sudo nano /etc/nginx/sites-available/my-node-app

Aşağıdaki içeriği ekleyin (uygulamanızın portuna göre değiştirin):

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Not: your-domain.com yerine kendi alan adınızı veya sunucu IP adresini kullanın. Eğer alan adınız yoksa, IP adresini kullanabilirsiniz.

6.3. Konfigürasyonu Etkinleştirme

Oluşturulan konfigürasyon dosyasını sites-enabled dizinine sembolik bir bağlantı olarak ekleyin:

sudo ln -s /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/

6.4. Nginx’i Yeniden Başlatma

Değişiklikleri uygulamak için Nginx’i yeniden başlatın:

sudo systemctl restart nginx

6.5. Nginx Hata Kontrolü

Eğer Nginx çalışmıyorsa, hata ayıklamak için aşağıdaki komutu çalıştırın:

sudo nginx -t

7. Let’s Encrypt ile SSL Sertifikası Kurulumu

SSL sertifikası, uygulamanızın güvenli bir şekilde yayınlanmasını sağlar. Let’s Encrypt, ücretsiz ve otomatik olarak yenilenebilen SSL sertifikaları sunan bir hizmettir.

7.1. Certbot Kurulumu

Certbot, Let’s Encrypt sertifikalarını yönetmek için kullanılan bir araçtır. Certbot’u kurmak için aşağıdaki komutları çalıştırın:

sudo apt install -y certbot python3-certbot-nginx

7.2. SSL Sertifikası Oluşturma

Aşağıdaki komutla SSL sertifikasını oluşturun:

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

Not: your-domain.com yerine kendi alan adınızı kullanın.

Certbot, otomatik olarak Nginx konfigürasyonunu güncelleyecek ve SSL sertifikasını oluşturacaktır.

7.3. SSL Sertifikasının Otomatik Yenilenmesi

Let’s Encrypt sertifikaları 90 günlük bir süreyle geçerlidir. Otomatik yenileme için bir cron job oluşturun:

sudo crontab -e

Aşağıdaki satırı ekleyin:

0 12 * * * /usr/bin/certbot renew --quiet

Bu komut, her gün saat 12:00’de sertifikaları kontrol edecek ve gerekirse yenileyecektir.


8. Güvenlik Duvarı ve Erişim Kontrolleri

Güvenlik, herhangi bir sunucu ortamında en önemli önceliklerden biridir. AWS EC2’de güvenlik grubunu zaten yapılandırmış olsanız da, sunucu düzeyinde de bazı güvenlik önlemleri almanız gerekmektedir.

8.1. UFW (Uncomplicated Firewall) Kurulumu ve Yapılandırması

UFW, Ubuntu’da kullanılan basit bir güvenlik duvarı aracıdır. UFW’yi kurmak ve yapılandırmak için aşağıdaki komutları çalıştırın:

sudo apt install -y ufw
sudo ufw enable

UFW’ye aşağıdaki kuralları ekleyin:

# SSH erişimini sadece belirli IP'lerden izin verin (örneğin, sadece ofisinizin IP'si)
sudo ufw allow from <your-ip-address> to any port 22

# HTTP ve HTTPS erişimini herkese açın
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Diğer tüm gelen trafiği engelleyin
sudo ufw default deny incoming

# Giden trafiği her zaman izin verin
sudo ufw default allow outgoing

Not: <your-ip-address> yerine kendi IP adresinizi veya ofisinizin IP aralığını kullanın.

8.2. Root Kullanıcısı ve SSH Güvenliği

Root kullanıcısı olarak doğrudan SSH erişimini devre dışı bırakmak ve SSH anahtar tabanlı giriş kullanmak güvenlik açısından önemlidir.

  1. Root kullanıcısı olarak SSH erişimini devre dışı bırakma:

    sudo nano /etc/ssh/sshd_config

    Aşağıdaki satırı bulun ve değiştirin:

    PermitRootLogin no
  2. SSH anahtar tabanlı giriş kullanma:

    Eğer henüz yapmadıysanız, SSH anahtar tabanlı giriş kullanmak için aşağıdaki adımları izleyin:

    • Yerel makinenizde bir SSH anahtar çifti oluşturun:
      ssh-keygen -t rsa -b 4096
    • Public anahtarını sunucuya ekleyin:
      ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@<EC2-Instance-Public-IP>
  3. SSH servisini yeniden başlatın:

    sudo systemctl restart sshd

9. Uygulamanın İzlenmesi ve Log Yönetimi

Uygulamanızın performansını izlemek ve hata ayıklamak için log yönetimi ve izleme araçları kullanmak önemlidir.

9.1. PM2 Logları

PM2, uygulamanızın loglarını yönetmenize olanak sağlar. Logları görüntülemek için aşağıdaki komutu kullanın:

pm2 logs

Logları dosyaya kaydetmek için:

pm2 logs > app-logs.txt

9.2. Nginx Logları

Nginx logları, /var/log/nginx/ dizininde bulunur. Temel log dosyaları:

  • /var/log/nginx/access.log: Tüm HTTP isteklerinin logları.
  • /var/log/nginx/error.log: Hata logları.

Logları görüntülemek için:

sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

9.3. Sistem Logları

Sistem loglarını görüntülemek için journalctl komutunu kullanabilirsiniz:

sudo journalctl -u nginx -f
sudo journalctl -u pm2-my-node-app -f

10. Sık Karşılaşılan Sorunlar ve Çözümleri

Bu bölümde, Node.js uygulamalarını yayınlarken karşılaşabileceğiniz yaygın sorunları ve çözümlerini ele alacağız.

10.1. Uygulama Portunun Erişilebilir Olmaması

Sorun: Uygulamanız localhost:3000 üzerinde çalışıyor ancak dışarıdan erişilemiyor.

Çözüm:

  1. Uygulamanızın doğru portta çalıştığından emin olun. PM2 ile uygulamanızı başlatırken portu belirtin:
    pm2 start app.js --name "my-node-app" -- --port 3000
  2. Güvenlik grubunuzda ilgili portun (örneğin, 3000) açık olduğundan emin olun.
  3. Nginx konfigürasyonunda doğru portu kullandığınızdan emin olun:
    proxy_pass http://localhost:3000;

10.2. Nginx Hatası: 502 Bad Gateway

Sorun: Nginx üzerinden uygulamanıza erişmeye çalıştığınızda 502 Bad Gateway hatası alıyorsunuz.

Çözüm:

  1. Uygulamanızın çalıştığından emin olun:
    pm2 list
  2. Uygulamanızın doğru portta çalıştığından emin olun (örneğin, 3000).
  3. Nginx konfigürasyonunda doğru portu kullandığınızdan emin olun.
  4. Nginx’i yeniden başlatın:
    sudo systemctl restart nginx
  5. Logları kontrol edin:
    sudo tail -f /var/log/nginx/error.log

10.3. SSL Sertifikası Hatası

Sorun: SSL sertifikası yüklenemiyor veya tarayıcıda güvenlik uyarısı alıyorsunuz.

Çözüm:

  1. SSL sertifikasının doğru şekilde yüklendiğinden emin olun:
    sudo certbot certificates
  2. Nginx konfigürasyonunda SSL ayarlarının doğru olduğundan emin olun:
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
  3. Tarayıcı önbelleğini temizleyin ve yeniden deneyin.

10.4. PM2 Uygulamasının Düşmesi

Sorun: PM2 ile başlattığınız uygulama sürekli olarak düşüyor.

Çözüm:

  1. Uygulamanın loglarını kontrol edin:
    pm2 logs
  2. Uygulamanızda hata olup olmadığını kontrol edin. Örneğin, veritabanı bağlantısı, API anahtarları gibi bağımlılıkların doğru şekilde yapılandırıldığından emin olun.
  3. PM2’ye uygulamanın otomatik olarak yeniden başlatılmasını sağlayın:
    pm2 start app.js --name "my-node-app" --watch

11. Sonuç ve İleri Adımlar

Bu rehberde, Node.js uygulamanızı AWS EC2 üzerine nasıl yayınlayacağınızı adım adım öğrendiniz. Artık uygulamanız güvenli, ölçeklenebilir ve performans odaklı bir şekilde yayınlanıyor. İşte bazı ileri adımlar ve öneriler:

11.1. Ölçeklenebilirlik

Uygulamanızın trafiği arttıkça, yükü dağıtmak için aşağıdaki adımları düşünebilirsiniz:

  • AWS Auto Scaling: Uygulamanızı otomatik olarak ölçeklendirmek için AWS Auto Scaling kullanabilirsiniz.
  • Load Balancer: AWS Elastic Load Balancer (ELB) kullanarak trafiği birden fazla EC2 örneğine dağıtabilirsiniz.
  • Containerization: Uygulamanızı Docker konteynerleri içinde yayınlayarak daha esnek ve taşınabilir bir yapı oluşturabilirsiniz.

11.2. Veritabanı Yönetimi

Uygulamanızda bir veritabanı kullanıyorsanız, veritabanınızı da AWS hizmetleriyle yönetebilirsiniz:

  • AWS RDS: Amazon Relational Database Service (RDS) kullanarak MySQL, PostgreSQL veya diğer ilişkisel veritabanlarını yönetebilirsiniz.
  • MongoDB Atlas: MongoDB kullanıyorsanız, MongoDB Atlas kullanarak bulut tabanlı bir veritabanı hizmeti kullanabilirsiniz.

11.3. Sürekli Entegrasyon ve Dağıtım (CI/CD)

Uygulamanızın sürekli olarak güncellenmesi ve yayınlanması için CI/CD (Continuous Integration/Continuous Deployment) araçları kullanabilirsiniz:

  • GitHub Actions: GitHub deposunda CI/CD pipeline’ları oluşturabilirsiniz.
  • AWS CodePipeline: AWS’nin sunduğu CI/CD hizmetini kullanabilirsiniz.
  • Jenkins: Açık kaynaklı bir CI/CD aracı olan Jenkins’i kullanabilirsiniz.

11.4. İzleme ve Uyarılar

Uygulamanızın performansını ve kullanılabilirliğini izlemek için aşağıdaki araçları kullanabilirsiniz:

  • AWS CloudWatch: AWS hizmetlerini izlemek ve uyarılar oluşturmak için kullanabilirsiniz.
  • Prometheus ve Grafana: Açık kaynaklı izleme ve görselleştirme araçları olan Prometheus ve Grafana’yı kullanabilirsiniz.
  • New Relic: Uygulamanızın performansını izlemek için ticari bir hizmet olan New Relic’i kullanabilirsiniz.

11.5. Güvenlik İyileştirmeleri

Uygulamanızın güvenliğini artırmak için aşağıdaki adımları düşünebilirsiniz:

  • AWS WAF: AWS Web Application Firewall (WAF) kullanarak uygulamanızı saldırılara karşı koruyabilirsiniz.
  • DDoS Koruması: AWS Shield kullanarak DDoS saldırılarına karşı koruma sağlayabilirsiniz.
  • Güncellemeler: Sunucu ve uygulama bağımlılıklarınızı düzenli olarak güncelleyerek güvenlik açıklarını kapatabilirsiniz.

Son Söz

Node.js uygulamalarınızı AWS EC2 üzerine yayınlamak, başlangıçta karmaşık görünebilir ancak adım adım ilerlediğinizde oldukça basit ve yönetilebilir bir süreçtir. Bu rehberde ele aldığımız adımları takip ederek, uygulamanızı güvenli, performanslı ve ölçeklenebilir bir şekilde yayınlayabilirsiniz.

Unutmayın, her uygulama farklıdır ve ihtiyaçları da farklı olabilir. Bu rehberde ele alınmayan özel durumlar için AWS dokümantasyonunu incelemeniz ve gerektiğinde profesyonel destek almanız önemlidir.

Başarılar ve mutlu kodlamalar! 🚀


Bu yazı Mistral ile otomatik oluşturulmuştur.