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
- 2. AWS EC2 Sunucusunu Hazırlama
- 3. Node.js ve Bağımlılıkların Kurulumu
- 4. Uygulamanın Sunucuya Aktarılması
- 5. PM2 ile Uygulamanın Yönetimi
- 6. Nginx ile Reverse Proxy Kurulumu
- 7. Let’s Encrypt ile SSL Sertifikası Kurulumu
- 8. Güvenlik Duvarı ve Erişim Kontrolleri
- 9. Uygulamanın İzlenmesi ve Log Yönetimi
- 10. Sık Karşılaşılan Sorunlar ve Çözümleri
- 11. Sonuç ve İleri Adımlar
1. Gerekli Ön Koşullar
Bu rehberde ilerleyebilmek için aşağıdaki ön koşulları sağlamanız gerekmektedir:
- AWS Hesabı: AWS hesabınızın olması gerekmektedir. Eğer hesabınız yoksa AWS web sitesi üzerinden ücretsiz bir hesap oluşturabilirsiniz.
- Node.js Uygulaması: Yayınlamak istediğiniz Node.js uygulamasının hazır olması gerekmektedir. Uygulamanızın
package.jsondosyası ve gerekli bağımlılıkları içermelidir. - 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.
- 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
- AWS Management Console’a giriş yapın ve EC2 hizmetini seçin.
- Launch Instance butonuna tıklayın.
- Name and tags bölümünde, örneğinize bir ad verin (örneğin:
nodejs-app-server). - 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.
- Instance type bölümünde,
t2.microseç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. - 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.
- 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)
- 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.
- 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ür | Protokol | Port Aralığı | Kaynak |
|---|---|---|---|
| SSH | TCP | 22 | 0.0.0.0/0 |
| HTTP | TCP | 80 | 0.0.0.0/0 |
| HTTPS | TCP | 443 | 0.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:
| Komut | Açıklama |
|---|---|
pm2 list | Çalışan uygulamaları listeleyin. |
pm2 logs | Uygulamanı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 save | Mevcut uygulamaları kaydedin. |
pm2 startup | PM2’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.
-
Root kullanıcısı olarak SSH erişimini devre dışı bırakma:
sudo nano /etc/ssh/sshd_configAşağıdaki satırı bulun ve değiştirin:
PermitRootLogin no -
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>
- Yerel makinenizde bir SSH anahtar çifti oluşturun:
-
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:
- 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 - Güvenlik grubunuzda ilgili portun (örneğin, 3000) açık olduğundan emin olun.
- 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:
- Uygulamanızın çalıştığından emin olun:
pm2 list - Uygulamanızın doğru portta çalıştığından emin olun (örneğin, 3000).
- Nginx konfigürasyonunda doğru portu kullandığınızdan emin olun.
- Nginx’i yeniden başlatın:
sudo systemctl restart nginx - 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:
- SSL sertifikasının doğru şekilde yüklendiğinden emin olun:
sudo certbot certificates - 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; - 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:
- Uygulamanın loglarını kontrol edin:
pm2 logs - 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.
- 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.