Node.js Uygulamasını Canlı Ortamda Çalışır Hale Getirmek: Sıfırdan Üretime Adım Adım Rehber
Yerel ortamda geliştirilen bir Node.js uygulamasının canlı sunucuya hatasız, güvenli ve sürdürülebilir bir şekilde nasıl taşınacağını, süreç yönetimi ve ters proxy yapılandırmalarıyla birlikte inceleyin.
Caner Serbest
Sistem ve Altyapı
4 dk okuma
Node.js Uygulamasını Canlı Ortamda Çalışır Hale Getirmek: Sıfırdan Üretime Adım Adım Rehber
Yazılım geliştirme sürecinin en heyecanlı anlarından biri, lokal makinende günlerdir geliştirdiğin, test ettiğin ve kusursuz çalıştığına emin olduğun kod tabanını canlı bir sunucuya taşımaktır. Ancak lokalde node app.js komutuyla ayağa kaldırmak ile gerçek dünya kullanıcılarına hizmet eden bir üretim (production) ortamı oluşturmak arasında ciddi operasyonel farklar vardır.
Bu rehberde, bir Node.js uygulamasını sıfırdan alıp, canlı sunucuda kesintisiz, güvenli ve kaynakları verimli kullanan profesyonel bir mimariyle nasıl konumlandıracağımızı adım adım inceleyeceğiz.
1. Canlı Ortam İçin Temel Yaklaşım ve Hazırlık
Lokal geliştirme ortamımızda hata ayıklama (debugging) kolaydır, uygulama çöktüğünde terminali yeniden başlatmak zahmetsizdir. Canlı ortamda ise lükslerimiz yoktur. Uygulamanın bellek sızıntısı (memory leak) yapması, beklenmeyen bir hata yüzünden kapanması veya sunucu yeniden başladığında otomatik olarak ayağa kalkmaması kabul edilebilir durumlar değildir.
Bu yüzden üretim ortamında üç temel bileşene ihtiyacımız var:
- Süreç Yöneticisi (Process Manager): Uygulamanın her zaman çalışır durumda kalmasını, çöktüğünde yeniden başlamasını ve CPU/RAM kullanımının denetlenmesini sağlar.
- Ters Proxy (Reverse Proxy): Doğrudan 3000 veya 8080 gibi portlara gelen istekleri yönetmek yerine, trafiği güvenli portlar (80/443) üzerinden karşılayıp Node.js uygulamasına yönlendirir.
- Güvenlik ve Çevre Yönetimi: Hassas verilerin (
.envdosyaları, veritabanı şifreleri) güvenle saklanması ve dış dünyadan izole edilmesi.
2. Sunucu Hazırlığı ve Node.js Kurulumu
Taze kurulmuş bir Linux sunucumuz (örneğin Ubuntu Server) olduğunu varsayalım. İlk iş olarak sistem paketlerini güncellemeli ve Node.js ortamını kurmalıyız. Doğrudan dağıtım yöneticisinin eski sürümlerini kurmak yerine, NodeSource veya nvm (Node Version Manager) kullanarak kararlı (LTS) bir sürüm tercih etmek her zaman en güvenlisidir.
Sistemi güncelledikten sonra LTS sürümünü kuralım:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
Kurulumun başarılı olduğunu doğrulamak için terminale node -v ve npm -v yazarak sürümleri kontrol edebilirsiniz.
3. Uygulamanın Sunucuya Aktarılması ve Bağımlılıklar
Kodlarımızı sunucuya genellikle Git aracılığıyla çekeriz. /var/www/ dizini altında projemiz için uygun bir klasör yapısı oluşturalım:
sudo mkdir -p /var/www/benim-uygulamam
sudo chown -R $USER:$USER /var/www/benim-uygulamam
cd /var/www/benim-uygulamam
# Git deposunu klonlama veya kodları aktarma
git clone https://github.com/kullaniciadi/proje.git .
Proje dizinine gittikten sonra bağımlılıkları yüklememiz gerekiyor. Canlı ortamda sadece üretim bağımlılıklarını kurmak, şişkinliği önler:
npm ci --production
npm ci komutu, package-lock.json dosyasına sadık kalarak tutarlı bir yükleme yapar ve canlı ortamlar için npm install komutuna göre çok daha güvenlidir.
4. PM2 ile Süreç Yönetimi
Node.js tek iş parçacıklı (single-threaded) bir yapidadır. Bu, çok çekirdekli modern sunucuların potansiyelini tam olarak kullanamayacağı anlamına gelir. PM2, hem uygulamanın sürekliliğini sağlayan hem de Cluster Mode sayesinde sunucudaki tüm CPU çekirdeklerini kullanmanıza olanak tanıyan endüstri standardı bir araçtır.
PM2’yi global olarak kuralım:
sudo npm install -g pm2
Doğrudan pm2 start app.js demek yerine, projenin kök dizininde bir yapılandırma dosyası (ecosystem.config.js) oluşturmak operasyonel esneklik sağlar:
module.exports = {
apps: [
{
name: 'benim-uygulamam',
script: './src/index.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
max_memory_restart: '500M',
error_file: './logs/err.log',
out_file: './logs/out.log',
merge_logs: true,
time: true
}
]
};
Bu yapılandırma dosyası ile:
- Uygulama sunucudaki tüm CPU çekirdeklerinde küme olarak çalışır (
instances: 'max'). - Bellek tüketimi 500 MB sınırını aşarsa uygulama güvenli bir şekilde yeniden başlatılır (
max_memory_restart). - Loglar düzenli olarak log dosyalarına yazılır.
Uygulamayı bu yapılandırma ile başlatalım:
pm2 start ecosystem.config.js
Sunucu yeniden başladığında uygulamanın otomatik olarak ayağa kalkması için PM2’nin başlangıç betiğini oluşturun:
pm2 startup
# Çıkan komutu sudo yetkisiyle terminale yapıştırın
pm2 save
5. Nginx ile Ters Proxy (Reverse Proxy) Yapılandırması
Kullanıcılar web sitenize erişirken http://site.com:3000 şeklinde port numarasıyla bağlanmazlar. Standart 80 (HTTP) veya 443 (HTTPS) portları üzerinden istek yaparlar. Bu trafiği alıp arka planda çalışan Node.js uygulamamıza iletmek için Nginx kullanacağız.
Nginx’i kuralım:
sudo apt install -y nginx
/etc/nginx/sites-available/benim-uygulamam adında yeni bir konfigürasyon dosyası oluşturalım:
server {
listen 80;
server_name benimdomainim.com www.benimdomainim.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;
# Gerçek IP adreslerini Node.js tarafına iletmek için
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;
}
}
Bu dosyayı etkinleştirmek ve Nginx yapılandırmasını test etmek için:
sudo ln -s /etc/nginx/sites-available/benim-uygulamam /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
6. Güvenlik ve SSL Sertifikası (Certbot)
Canlı ortamda şifrelenmemiş HTTP trafiği kabul edilemez. Let’s Encrypt ve Certbot kullanarak ücretsiz ve otomatik bir SSL sertifikası kuralım:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d benimdomainim.com -d www.benimdomainim.com
Certbot, Nginx dosyanızı otomatik olarak güncelleyecek ve HTTP isteklerini HTTPS’e yönlendirecektir. Ayrıca sertifikanın otomatik yenilenmesi için sistem zamanlayıcısına (cron/systemd timer) bir görev ekleyecektir.
7. Günlük Operasyonlar ve Bakım
Uygulama artık canlıda ve güvenli bir şekilde çalışıyor. Ancak operasyon burada bitmiyor. Düzenli olarak kontrol etmeniz gerekenler:
- Log Takibi: Uygulamanızda bir hata olduğunda
pm2 logs benim-uygulamamkomutu ile anlık logları takip edebilir veya log dosyalarınızı inceleyebilirsiniz. - Güncellemeler: Yeni bir kod değişikliği olduğunda, sunucuda süreci otomatikleştirmek için şu adımları izleyebilirsiniz:
cd /var/www/benim-uygulamam
git pull
npm ci --production
pm2 reload benim-uygulamam --update-env
pm2 reload komutu, kesinti yaşamadan (zero-downtime restart) eski süreçleri kapatıp yenilerini sırayla ayağa kaldırır; böylece kullanıcılar servis kesintisi yaşamaz.
Sonuç
Node.js uygulamanızı canlı ortama taşımak göz korkutucu görünebilir; ancak PM2 ile süreç yönetimi, Nginx ile ters proxy yapılandırması ve Certbot ile SSL entegrasyonu sağlandığında süreç hem öngörülebilir hem de son derece kararlı hale gelir. Bu katmanları doğru kurmak, uygulamanızın performansını artırırken olası sistem çökmelerinde minimum müdahale ile yola devam etmenizi sağlar.
Bu yazı Gemini ile otomatik oluşturulmuştur.