Node.js Uygulamasını Ubuntu 22.04 Üzerinde Üretim Ortamı İçin Kurulum Rehberi
Node.js, modern web uygulamaları geliştirmek için popüler bir sunucu tarafı JavaScript çalışma zamanıdır. Bir Node.js uygulamasını geliştirme ortamından üretim ortamına taşımak, uygulamanın kararlılığını, güvenliğini ve performansını sağlamak için belirli adımlar gerektirir. Bu rehberde, bir Node.js uygulamasını Ubuntu 22.04 sunucusu üzerinde üretim ortamına uygun şekilde nasıl kuracağınızı adım adım anlatacağız.
Bu süreç, Node.js ve bağımlılıkların kurulumundan, uygulamanın sürekli çalışmasını sağlayacak bir proses yöneticisi (PM2) kullanmaya, web trafiğini yönetmek ve SSL şifrelemesi sağlamak için bir ters proxy (Nginx) yapılandırmaya kadar uzanacaktır.
1. Ön Hazırlıklar ve Temel Kurulumlar
Üretim ortamı kurulumuna başlamadan önce, Ubuntu sunucunuzun güncel olduğundan ve gerekli temel araçların yüklü olduğundan emin olmalıyız. Ayrıca, güvenlik nedeniyle uygulamanızı yönetmek için ayrı bir kullanıcı oluşturmak iyi bir pratiktir.
Sistem Güncelleme
İlk adım, sunucunuzdaki paket listelerini güncellemek ve mevcut paketleri yükseltmektir. Bu, hem güvenlik açıklarını kapatır hem de en yeni yazılım sürümlerine erişmenizi sağlar.
sudo apt update
sudo apt upgrade -y
Node.js ve npm Kurulumu
Ubuntu’nun varsayılan depolarındaki Node.js sürümü genellikle güncel olmayabilir. Bu nedenle, NodeSource’un resmi deposunu kullanarak en son LTS (Uzun Süreli Destek) sürümünü kurmanız önerilir.
# NodeSource deposunu eklemek için curl'ı kurun (eğer yüklü değilse)
sudo apt install curl -y
NodeSource LTS deposunu ekleyin
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
Node.js ve npm'i kurun
sudo apt install nodejs -y
Kurulumun başarılı olduğunu doğrulamak için Node.js ve npm sürümlerini kontrol edin:
node -v
npm -v
Git Kurulumu
Uygulama kodunuzu sunucuya taşımak için Git kullanmanız en yaygın ve etkili yöntemdir. Git’i aşağıdaki komutla kurabilirsiniz:
sudo apt install git -y
Uygulama İçin Yeni Bir Kullanıcı Oluşturma (Güvenlik)
Root kullanıcısı yerine uygulamanızı yönetmek için ayrı bir kullanıcı oluşturmak, güvenlik açısından kritik öneme sahiptir. Bu, potansiyel güvenlik açıklarının sistem genelinde yayılmasını engeller.
# Yeni bir kullanıcı oluşturun (örneğin 'nodejsuser')
sudo adduser nodejsuser
Yeni kullanıcıya sudo ayrıcalıkları verin (gerekirse)
sudo usermod -aG sudo nodejsuser
Şimdi bu yeni kullanıcıya geçiş yapın ve geri kalan işlemleri bu kullanıcı üzerinden yapın:
su - nodejsuser
2. Uygulamanın Sunucuya Aktarılması ve Bağımlılıkların Kurulumu
Artık temel kurulumlar tamamlandığına göre, Node.js uygulamanızı sunucuya aktarabilir ve gerekli bağımlılıkları kurabilirsiniz.
Uygulama Dizini Oluşturma
Uygulamanız için uygun bir dizin oluşturun. Genellikle /var/www altında veya kullanıcı dizini içinde bir konum tercih edilir. Biz örnek olarak kullanıcımızın ana dizininde bir dizin oluşturalım:
mkdir my_node_app
cd my_node_app
Uygulamayı Klonlama
Git depounuzdan uygulamanızı bu dizine klonlayın. Eğer depoyu mevcut dizine klonlamak istiyorsanız, komutun sonuna bir nokta (.) ekleyin.
git clone .
Eğer uygulamanızı bir Git deposundan klonlamıyorsanız, SFTP gibi bir araç kullanarak dosyaları sunucuya manuel olarak yükleyebilirsiniz.
Bağımlılıkların Kurulumu
Uygulamanızın package.json dosyasında belirtilen tüm bağımlılıkları yüklemek için npm install komutunu çalıştırın.
npm install
Ortam Değişkenlerinin Yönetimi
Üretim ortamında hassas bilgiler (veritabanı kimlik bilgileri, API anahtarları vb.) doğrudan kod içinde yer almamalıdır. Bunları ortam değişkenleri olarak yönetmek en iyi yaklaşımdır.
* .env dosyası kullanıyorsanız, bu dosyayı sunucuda manuel olarak oluşturun ve .gitignore dosyanızda olduğundan emin olun.
* Alternatif olarak, PM2 veya Nginx yapılandırması aracılığıyla ortam değişkenlerini ayarlayabilirsiniz.
* NODE_ENV değişkenini production olarak ayarlamak, Node.js uygulamalarının performansı ve hata yönetimi için önemlidir.
# .env dosyası örneği
my_node_app/.env
PORT=3000
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
NODE_ENV=production
Eğer uygulamanız dotenv paketini kullanıyorsa, bu dosyadaki değişkenler otomatik olarak yüklenecektir.
3. Uygulamayı Arka Planda Çalıştırma ve Yönetme (PM2)
Bir Node.js uygulamasını üretimde doğrudan node app.js ile çalıştırmak tavsiye edilmez. Uygulamanız çökerse veya sunucu yeniden başlatılırsa, manuel müdahale olmadan tekrar çalışmaz. PM2 (Process Manager 2), Node.js uygulamalarını arka planda sürekli olarak çalıştıran, yeniden başlatan ve yöneten bir proses yöneticisidir.
PM2 Kurulumu
PM2’yi global olarak kurun:
npm install pm2 -g
Uygulamayı PM2 ile Başlatma
Uygulamanızı PM2 ile başlatmak için ana dosyanızın adını kullanın (genellikle app.js veya index.js). --name parametresi ile uygulamanıza bir isim verebilirsiniz.
pm2 start app.js --name "my-node-app"
Eğer ortam değişkenlerini manuel olarak ayarlamak isterseniz:
PORT=3000 pm2 start app.js --name "my-node-app"
Daha karmaşık uygulamalar için bir ecosystem.config.js dosyası oluşturabilirsiniz. Bu dosya, birden fazla uygulama, ortam değişkenleri ve diğer PM2 seçeneklerini tanımlamanıza olanak tanır.
// ecosystem.config.js
module.exports = {
apps: [
{
name: "my-node-app",
script: "app.js",
instances: "max", // CPU çekirdeği sayısına göre uygulama klonları oluşturur
exec_mode: "cluster", // Küme modunda çalışır
env: {
NODE_ENV: "development",
PORT: 3001
},
env_production: {
NODE_ENV: "production",
PORT: 3000
}
}
]
};
Bu dosyayı oluşturduktan sonra uygulamayı şu şekilde başlatabilirsiniz:
pm2 start ecosystem.config.js --env production
PM2 Komutları
* Çalışan uygulamaları listeleme:
pm2 list
* Uygulamayı durdurma:
pm2 stop my-node-app
* Uygulamayı yeniden başlatma:
pm2 restart my-node-app
* Uygulamayı silme (PM2 yönetiminden kaldırma):
pm2 delete my-node-app
* Uygulama günlüklerini görüntüleme:
pm2 logs my-node-app
* Sistem kaynaklarını izleme:
pm2 monit
Sistem Başlangıcında Otomatik Çalıştırma
Sunucu yeniden başlatıldığında PM2’nin uygulamalarınızı otomatik olarak başlatmasını sağlamak için startup komutunu kullanın.
pm2 startup systemd
Bu komut, sistemin başlangıçta PM2’yi ve onun yöneteği uygulamaları çalıştırması için gerekli bir servis dosyası oluşturacaktır. Çıktıda size verilecek komutu çalıştırmayı unutmayın (genellikle sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u nodejsuser --hp /home/nodejsuser gibi bir şey olacaktır).
Ardından, PM2’nin şu anki uygulama listesini kaydetmesini sağlayın:
pm2 save
4. Ters Proxy ve SSL Kurulumu (Nginx)
Node.js uygulamanızı doğrudan internete açmak yerine, bir ters proxy (Nginx gibi) kullanmak daha güvenli ve performanslıdır. Nginx, gelen web isteklerini Node.js uygulamanıza iletecek, statik dosyaları sunacak, yük dengelemesi yapacak ve SSL sonlandırması sağlayacaktır.
Nginx Kurulumu
Nginx’i aşağıdaki komutla kurun:
sudo apt install nginx -y
Kurulumdan sonra Nginx servisinin çalıştığından emin olun:
sudo systemctl status nginx
Güvenlik Duvarı Ayarları (UFW)
Ubuntu’nun varsayılan güvenlik duvarı UFW’yi yapılandırarak sadece gerekli portların açık kalmasını sağlayın.
sudo ufw allow 'Nginx HTTP' # Sadece HTTP (80)
sudo ufw allow 'Nginx HTTPS' # Sadece HTTPS (443)
sudo ufw allow 'Nginx Full' # Hem HTTP hem HTTPS
sudo ufw allow 'OpenSSH' # SSH erişimi için
sudo ufw enable # Güvenlik duvarını etkinleştirin
sudo ufw status # Güvenlik duvarı durumunu kontrol edin
Nginx Yapılandırması
Uygulamanız için yeni bir Nginx yapılandırma dosyası oluşturun.
sudo nano /etc/nginx/sites-available/my_node_app.conf
Aşağıdaki yapılandırmayı dosyaya ekleyin. your_domain.com yerine kendi alan adınızı, 3000 yerine Node.js uygulamanızın dinlediği portu yazın.
server {
listen 80;
server_name your_domain.com www.your_domain.com;
location / {
proxy_pass http://localhost:3000; # Node.js uygulamanızın çalıştığı port
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;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Yapılandırma dosyasını kaydedip kapatın (CTRL+X, Y, Enter).
Şimdi bu yapılandırmayı etkinleştirmek için bir sembolik bağlantı oluşturun ve Nginx’in varsayılan yapılandırmasını devre dışı bırakın:
sudo ln -s /etc/nginx/sites-available/my_node_app.conf /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default # Varsayılan yapılandırmayı kaldırın
Nginx yapılandırmanızın doğru olduğunu kontrol edin:
sudo nginx -t
Eğer test başarılı olursa, Nginx servisini yeniden başlatın:
sudo systemctl restart nginx
Artık alan adınız üzerinden HTTP (port 80) üzerinden uygulamanıza erişebiliyor olmalısınız.
SSL Sertifikası Kurulumu (Let’s Encrypt ile Certbot)
Web sitenizin güvenliğini sağlamak için SSL (HTTPS) kullanmak zorunludur. Let’s Encrypt, ücretsiz SSL sertifikaları sunar ve Certbot aracı ile kolayca kurulabilir.
# Certbot ve Nginx eklentisini kurun
sudo apt install certbot python3-certbot-nginx -y
Şimdi Certbot’u kullanarak SSL sertifikasını alın ve Nginx yapılandırmasını otomatik olarak güncelleyin:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot size bazı sorular soracaktır (e-posta adresi, hizmet şartlarını kabul etme vb.). İşlem tamamlandığında, Nginx yapılandırmanız otomatik olarak güncellenecek ve web siteniz HTTPS üzerinden erişilebilir olacaktır.
Sertifikaların otomatik olarak yenilendiğini test etmek için:
sudo certbot renew --dry-run
5. Güvenlik ve Performans İpuçları, Sonuç ve SSS
Uygulamanızı başarıyla kurduktan sonra, güvenlik ve performansını daha da artırmak için bazı ek adımlar atabilirsiniz.
Ek Güvenlik İpuçları
* UFW ile Sıkı Güvenlik Duvarı: Sadece gerekli portları açın (SSH, HTTP, HTTPS).
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
* SSH Güvenliği: SSH için varsayılan portu değiştirin, parola yerine SSH anahtarları kullanın ve root girişi devre dışı bırakın.
* Bağımlılıkları Güncel Tutma: Uygulamanızın bağımlılıklarını düzenli olarak güncelleyin (npm audit ile güvenlik açıklarını kontrol edin).
* Hassas Verileri Koruma: Ortam değişkenleri, veritabanı kimlik bilgileri gibi hassas verileri asla Git deposuna yüklemeyin.
* HTTP Güvenlik Başlıkları: Helmet gibi modülleri kullanarak uygulamanıza çeşitli HTTP güvenlik başlıkları ekleyin.
* Giriş Doğrulama: Tüm kullanıcı girişlerini sunucu tarafında mutlaka doğrulayın ve sanitize edin.
Performans İpuçları
* PM2 Küme Modu: Uygulamanızı PM2’nin küme modunda çalıştırarak CPU çekirdeklerinizden tam verim alın. ecosystem.config.js dosyasında instances: "max", exec_mode: "cluster" kullanın.
* Nginx Önbellekleme: Statik dosyalar için Nginx önbelleklemesini kullanarak sunucu yükünü azaltın.
* Veritabanı Optimizasyonu: Veritabanı sorgularınızı optimize edin, uygun indeksler kullanın.
* Kod Optimizasyonu: Bellek sızıntılarını ve performans darboğazlarını tespit etmek için Node.js uygulamanızı profilleme araçlarıyla analiz edin.
* CDN Kullanımı: Statik varlıklarınızı (resimler, CSS, JS) bir İçerik Dağıtım Ağı (CDN) üzerinden sunarak yükleme sürelerini iyileştirin.
Sonuç
Bu rehberde, Node.js uygulamanızı Ubuntu 22.04 üzerinde üretim ortamına uygun bir şekilde nasıl kuracağınızı detaylı bir şekilde ele aldık. Node.js ve bağımlılıkların kurulumundan, PM2 ile uygulamanızı sürekli çalıştırmaya, Nginx ile ters proxy ve SSL şifrelemesi sağlamaya kadar tüm adımları tamamladınız. Bu yapılandırma, uygulamanızın güvenli, kararlı ve performanslı bir şekilde çalışmasını sağlayacaktır. Unutmayın ki üretim ortamları sürekli izleme ve bakım gerektirir.
Sıkça Sorulan Sorular (SSS)
Node.js uygulamam neden başlamıyor veya Nginx 502 Bad Gateway hatası alıyorum?
Bu genellikle Node.js uygulamanızın PM2 tarafından düzgün bir şekilde başlatılmadığı veya Nginx’in uygulamanızın dinlediği porta erişemediği anlamına gelir. Şunları kontrol edin:
pm2 listkomutuyla uygulamanızın çalıştığından emin olun.- Uygulamanızın doğru portta dinlediğini ve Nginx yapılandırmasındaki
proxy_passdeğerinin bu portla eşleştiğini kontrol edin. pm2 logs my-node-appkomutuyla uygulama günlüklerini kontrol ederek hataları arayın.- Nginx hata günlüklerini kontrol edin:
sudo tail -f /var/log/nginx/error.log - Uygulamanızın dinlediği portun güvenlik duvarı tarafından engellenmediğinden emin olun (
sudo ufw status).
PM2 ile cluster modu nasıl kullanılır?
PM2’nin cluster modu, uygulamanızın birden fazla kopyasını (işlem) çalıştırarak CPU çekirdeklerinizden tam verim almanızı sağlar ve uygulamanızın daha fazla isteği aynı anda işlemesine olanak tanır. Bunu ecosystem.config.js dosyasında yapılandırabilirsiniz:
// ecosystem.config.js
module.exports = {
apps: [
{
name: "my-node-app",
script: "app.js",
instances: "max", // CPU çekirdeği sayısına göre uygulama klonları oluşturur
exec_mode: "cluster", // Küme modunda çalışır
env_production: {
NODE_ENV: "production",
PORT: 3000
}
}
]
};
Daha sonra pm2 start ecosystem.config.js --env production komutuyla başlatın.
SSL sertifikam neden yenilenmiyor?
Let’s Encrypt sertifikaları 90 günde bir yenilenmelidir. Certbot, bu yenilemeyi otomatik olarak bir cron job veya systemd timer aracılığıyla yapar. Eğer yenilenme sorunu yaşıyorsanız:
- Certbot’un otomatik yenileme işleminin çalışıp çalışmadığını kontrol edin:
sudo systemctl status certbot.timer - Manuel bir yenileme denemesi yapın:
sudo certbot renew --dry-run(test) veyasudo certbot renew(gerçek). - Alan adınızın DNS ayarlarının doğru olduğundan ve sunucunuzun 80/443 portlarından erişilebilir olduğundan emin olun.
Ortam değişkenlerini nasıl güvenli bir şekilde yönetirim?
Hassas ortam değişkenlerini .env dosyalarıyla yönetmek yaygın olsa da, daha büyük ve kritik uygulamalar için farklı çözümler mevcuttur:
- Sistem Ortam Değişkenleri:
/etc/environmentveya sistem genelindeki servis dosyaları (systemd) aracılığıyla ayarlamak. - Bulut Sağlayıcıların Gizli Yönetim Servisleri: AWS Secrets Manager, Azure Key Vault veya Google Cloud Secret Manager gibi servisler.
- HashiCorp Vault: Kendi sunucunuzda çalıştırabileceğiniz açık kaynaklı bir gizli yönetim aracı.
Uygulama güncellemelerini nasıl dağıtırım?
Uygulamanızı güncelledikten sonra (örneğin git pull ile yeni kodu çektikten sonra), yeni bağımlılıklar varsa npm install çalıştırmanız ve ardından PM2 ile uygulamanızı yeniden başlatmanız gerekir:
cd /home/nodejsuser/my_node_app
git pull
npm install # Yeni bağımlılıklar varsa
pm2 restart my-node-app
PM2, uygulamanızı kesintisiz bir şekilde yeniden başlatmaya çalışacaktır (sıfır kesinti süresi için cluster modu önerilir).
