Node.js Uygulamasını Ubuntu 18.04 Üzerinde Üretim Ortamı İçin Kurulum Rehberi
Node.js, modern web uygulamaları geliştirmek için popüler bir JavaScript çalışma zamanı ortamıdır. Hızlı, ölçeklenebilir ve olay tabanlı mimarisi sayesinde sunucu tarafı uygulamalar, API’ler ve gerçek zamanlı servisler oluşturmak için idealdir. Ancak bir Node.js uygulamasını geliştirme ortamından üretim ortamına taşımak, performans, güvenlik ve kararlılık gibi birçok faktörü göz önünde bulundurmayı gerektirir. Bu kapsamlı rehberde, Node.js uygulamanızı Ubuntu 18.04 sunucusu üzerinde üretim ortamı için nasıl adım adım kuracağınızı, yapılandıracağınızı ve optimize edeceğinizi detaylı bir şekilde anlatacağız.
Ubuntu 18.04 (Bionic Beaver), uzun süreli destek (LTS) sunan stabil bir işletim sistemi olduğu için üretim sunucuları için sıkça tercih edilir. Bu rehber, temel sunucu kurulumundan başlayarak, Node.js ve bağımlılıkların yönetimi, uygulama süreçlerinin sürekli çalışır halde tutulması, ters proxy yapılandırması, SSL şifrelemesi ve güvenlik en iyi uygulamalarına kadar tüm kritik adımları ele alacaktır.
1. Sunucu Hazırlığı
Node.js uygulamanızı kurmaya başlamadan önce Ubuntu sunucunuzun temel hazırlıklarını tamamlamanız gerekmektedir. Bu adımlar, sunucunuzun güvenliğini ve güncelliğini sağlamak için kritik öneme sahiptir.
1.1. Ubuntu Sistemini Güncelleme
İlk adım, sunucunuzdaki paket listelerini güncellemek ve mevcut paketleri en son sürümlerine yükseltmektir. Bu, güvenlik açıklarını kapatır ve yazılım uyumluluğunu artırır.
sudo apt update
sudo apt upgrade -y
sudo apt update komutu, yerel paket indeksini güncellerken, sudo apt upgrade -y komutu tüm yüklü paketleri onay istemeden yükseltir.
1.2. Güvenlik Duvarı (UFW) Kurulumu ve Yapılandırması
Bir güvenlik duvarı, sunucunuza gelen ve giden ağ trafiğini kontrol ederek istenmeyen erişimi engeller. Ubuntu’da UFW (Uncomplicated Firewall) kullanımı oldukça kolaydır.
SSH bağlantınızın kesilmemesi için öncelikle SSH portuna izin vermelisiniz (varsayılan 22). Ardından HTTP (80) ve HTTPS (443) portlarına da izin vererek web trafiğini sağlayın.
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw allow http
sudo ufw allow https
sudo ufw status
sudo ufw enable komutunu çalıştırdıktan sonra bir uyarı alacaksınız. Bu komutun SSH bağlantınızı kesebileceğini belirtecektir. Ancak ufw allow OpenSSH komutunu önceden verdiğimiz için güvenle y tuşuna basıp onaylayabilirsiniz. sudo ufw status komutu, güvenlik duvarınızın durumunu ve hangi portların açık olduğunu gösterir.
1.3. SSH Anahtar Çifti Oluşturma ve Kullanma (Önerilen)
Parola tabanlı kimlik doğrulama yerine SSH anahtar çiftleri kullanmak, sunucu güvenliğini önemli ölçüde artırır. Kendi yerel makinenizde bir anahtar çifti oluşturup (eğer yoksa) genel anahtarı sunucunuza kopyalayabilirsiniz.
Yerel makinenizde:
ssh-keygen -t rsa -b 4096
Sunucuya genel anahtarı kopyalama:
ssh-copy-id kullanıcıadı@sunucu_ip_adresi
Ardından, sunucunuzda SSH yapılandırma dosyasını düzenleyerek parola tabanlı kimlik doğrulamayı devre dışı bırakabilirsiniz (/etc/ssh/sshd_config içinde PasswordAuthentication no olarak ayarlayın ve sudo systemctl restart ssh ile servisi yeniden başlatın). Bu adım, brute-force saldırılarına karşı ek bir koruma sağlar.
2. Node.js ve npm Kurulumu
Node.js uygulamanızı çalıştırmak için Node.js çalışma zamanına ve paket yöneticisi npm’e (Node Package Manager) ihtiyacınız var. Node.js kurulumu için iki yaygın yöntem bulunmaktadır: NVM (Node Version Manager) kullanmak veya APT paket yöneticisi ile doğrudan kurmak. NVM, farklı Node.js versiyonları arasında kolayca geçiş yapma imkanı sunduğu için üretim ortamları da dahil olmak üzere genellikle tercih edilen yöntemdir.
2.1. NVM (Node Version Manager) ile Kurulum (Önerilen)
NVM, tek bir sunucuda birden fazla Node.js sürümünü yönetmenize olanak tanır. Bu, farklı projelerinizin farklı Node.js sürümlerine ihtiyaç duyması durumunda veya yeni Node.js sürümlerini test etmek istediğinizde oldukça kullanışlıdır.
NVM’yi kurmak için, GitHub deposundan en son kurulum script’ini indirebilir ve çalıştırabilirsiniz:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
(Not: v0.39.1 yerine en son NVM sürümünü kontrol edip kullanmanız önerilir.)
Kurulum script’i, NVM’yi kullanıcı dizininize kuracak ve kabuk yapılandırma dosyanıza (örn. .bashrc, .zshrc) ilgili satırları ekleyecektir. Kurulum tamamlandıktan sonra, NVM’nin çalışması için terminal oturumunuzu yeniden başlatmanız veya yapılandırma dosyanızı kaynak göstermeniz gerekir:
source ~/.bashrc
NVM’nin doğru bir şekilde kurulduğunu doğrulamak için:
nvm --version
Şimdi Node.js’nin en son LTS (Uzun Süreli Destek) sürümünü NVM ile kurabiliriz:
nvm install --lts
Bu komut, Node.js’nin en son LTS sürümünü kuracak ve varsayılan olarak kullanmaya başlayacaktır. Belirli bir sürümü kurmak isterseniz (örneğin Node.js 18):
nvm install 18
nvm use 18
nvm alias default 18
nvm use 18 komutu mevcut oturumunuz için Node.js 18’i etkinleştirir. nvm alias default 18 komutu ise her yeni terminal oturumu açtığınızda Node.js 18’in otomatik olarak kullanılmasını sağlar.
Kurulumu doğrulamak için Node.js ve npm sürümlerini kontrol edin:
node -v
npm -v
2.2. Alternatif: Apt Paket Yöneticisi ile Kurulum
Eğer NVM’nin esnekliğine ihtiyacınız yoksa ve tek bir Node.js sürümü sizin için yeterliyse, resmi NodeSource deposunu kullanarak APT ile kurulum yapabilirsiniz. Bu yöntem daha basittir ancak farklı Node.js sürümleri arasında geçiş yapma imkanı sunmaz.
Öncelikle, NodeSource deposunu sisteminize ekleyin. Aşağıdaki komutlar, Node.js’nin belirli bir LTS sürümünü (örneğin 18.x) ekleyecektir:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
(Not: setup_18.x yerine kurmak istediğiniz Node.js sürümüne uygun setup_XX.x adresini kullanmalısınız.)
Depo eklendikten sonra Node.js ve npm’i kurabilirsiniz:
sudo apt install -y nodejs
Bu komut, Node.js çalışma zamanını ve npm’i kurar. Apt ile kurulumda npm genellikle nodejs paketiyle birlikte gelir.
Kurulumu doğrulamak için Node.js ve npm sürümlerini kontrol edin:
node -v
npm -v
3. Uygulama Dosyalarını Sunucuya Aktarma
Node.js ve npm kurulumu tamamlandıktan sonra, Node.js uygulamanızın kaynak kodunu sunucuya aktarmanız gerekir. Bu işlem için birkaç yöntem bulunmaktadır.
3.1. Git Kullanarak (En Yaygın)
Eğer projeniz bir Git deposunda (GitHub, GitLab, Bitbucket vb.) barındırılıyorsa, Git kullanarak sunucuya klonlamak en pratik yöntemdir.
Öncelikle Git’i kurun:
sudo apt install git -y
Ardından, uygulamanız için uygun bir dizin oluşturun (örneğin /var/www/my-app) ve bu dizine giderek projenizi klonlayın:
sudo mkdir -p /var/www/my-app
sudo chown -R $USER:$USER /var/www/my-app
cd /var/www/my-app
git clone https://github.com/kullaniciadi/projeadi.git .
chown komutu, oluşturduğunuz dizinin sahipliğini mevcut kullanıcıya verir, böylece dosyaları düzenleme ve bağımlılıkları yükleme yetkiniz olur. .git ile biten klonlama komutu, deponun içeriğini mevcut dizine kopyalar. Eğer projeniz özel bir depodaysa, SSH anahtarları veya kişisel erişim belirteçleri (PAT) kullanmanız gerekebilir.
3.2. SCP Kullanarak (Küçük Projeler veya İlk Aktarım İçin)
SCP (Secure Copy Protocol), dosyaları SSH üzerinden güvenli bir şekilde kopyalamak için kullanılabilir. Bu yöntem genellikle daha küçük projeler veya tek seferlik aktarımlar için uygundur.
Yerel makinenizden:
scp -r /yerel/yol/projeadi kullanıcıadı@sunucu_ip_adresi:/var/www/my-app
Bu komut, /yerel/yol/projeadi dizinindeki tüm dosyaları ve alt dizinleri sunucudaki /var/www/my-app dizinine kopyalar.
3.3. FTP/SFTP Kullanarak (Daha Az Güvenli/Otomasyon İçin Uygun Değil)
SFTP, SSH’nin bir parçası olarak güvenli dosya transferi sağlar ve FileZilla gibi GUI araçlarıyla kullanılabilir. Ancak otomasyon ve sürekli dağıtım süreçleri için Git veya SCP daha çok tercih edilir. FTP ise şifrelenmediği için üretim ortamlarında kesinlikle önerilmez.
4. Node.js Uygulamasını Yapılandırma ve Bağımlılıkları Yükleme
Uygulama dosyalarını sunucuya aktardıktan sonra, uygulamanızı çalışır hale getirmek için gerekli bağımlılıkları yüklemeniz ve ortam değişkenlerini yapılandırmanız gerekir.
4.1. Proje Dizinine Gitme
Uygulamanızın kök dizinine gidin:
cd /var/www/my-app
4.2. Bağımlılıkları Yükleme
package.json dosyasında tanımlanan tüm bağımlılıkları yüklemek için npm’i kullanın:
npm install --production
--production bayrağı, yalnızca dependencies altında listelenen paketleri yükler ve devDependencies altındaki geliştirme bağımlılıklarını atlar. Bu, üretim ortamında gereksiz paketlerin yüklenmesini önler ve disk alanından tasarruf sağlar.
4.3. Ortam Değişkenleri
Node.js uygulamaları genellikle veritabanı bağlantı bilgileri, API anahtarları veya uygulama portu gibi hassas veya ortama özgü bilgileri ortam değişkenleri aracılığıyla yönetir. Bu, kodunuzu değiştirmeden farklı ortamlarda (geliştirme, test, üretim) farklı yapılandırmalar kullanmanıza olanak tanır.
* .env Dosyası (dotenv ile): Eğer uygulamanız dotenv paketi kullanıyorsa, proje dizininizin kökünde bir .env dosyası oluşturup ortam değişkenlerinizi buraya yazabilirsiniz:
PORT=3000
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
NODE_ENV=production
.env dosyasını git ignore listenize ekleyerek depoya yüklememeye özen gösterin.
* Sistem Ortam Değişkenleri: Ortam değişkenlerini doğrudan sunucu ortamına da ayarlayabilirsiniz. Bu, özellikle hassas veriler için daha güvenli olabilir. systemd servis dosyasında veya PM2 yapılandırmasında bu değişkenleri tanımlayabilirsiniz. Geçici olarak ayarlamak için export komutunu kullanabilirsiniz:
export PORT=3000
export NODE_ENV=production
Ancak bu değişkenler oturum kapandığında kaybolur. Kalıcı hale getirmek için PM2 veya systemd servis dosyalarında tanımlamak en iyi yoldur.
4.4. Uygulamanın Test Edilmesi
Uygulamanızın doğru bir şekilde kurulduğundan ve çalıştığından emin olmak için geçici olarak başlatabilirsiniz:
npm start
veya
node app.js
(Uygulamanızın başlangıç dosyası app.js veya server.js gibi farklı bir isimde olabilir.)
Uygulamanızın belirlediğiniz portta (örneğin 3000) çalıştığını doğrulayın. curl http://localhost:3000 komutu ile veya bir web tarayıcısından http://sunucu_ip_adresi:3000 adresine giderek test edebilirsiniz. Test tamamlandığında Ctrl+C ile uygulamayı durdurabilirsiniz.
5. Uygulamayı Sürekli Çalışır Halde Tutma
Üretim ortamında bir Node.js uygulamasının sürekli çalışır durumda olması hayati önem taşır. Uygulama çökse bile otomatik olarak yeniden başlatılmalı ve sunucu yeniden başlatıldığında da otomatik olarak başlamalıdır. Bu görevi yerine getirmek için PM2 veya systemd servisleri kullanılabilir.
5.1. PM2 Kurulumu ve Kullanımı (Önerilen Süreç Yöneticisi)
PM2, Node.js uygulamaları için popüler bir süreç yöneticisidir. Uygulamaları arka planda çalıştırır, çöktüğünde otomatik olarak yeniden başlatır, logları yönetir ve performansı izler.
PM2’yi global olarak kurun:
npm install pm2 -g
Uygulamanızı PM2 ile başlatın:
pm2 start /var/www/my-app/app.js --name "my-node-app"
/var/www/my-app/app.js yerine uygulamanızın ana giriş dosyasının yolunu belirtmelisiniz. --name bayrağı ile uygulamanıza okunabilir bir isim verebilirsiniz.
Uygulamanızın package.json dosyasında bir start script’iniz varsa, PM2’yi bu script’i kullanarak da başlatabilirsiniz:
cd /var/www/my-app
pm2 start npm --name "my-node-app" -- run start
PM2, uygulamanızı varsayılan olarak cluster modunda başlatmayacaktır. Çoklu çekirdeklerden faydalanmak ve daha yüksek performans elde etmek için cluster modunu kullanabilirsiniz:
pm2 start app.js -i max --name "my-node-app"
-i max bayrağı, PM2’nin CPU çekirdek sayısı kadar uygulama örneği başlatmasını sağlar.
PM2 komutları:
* pm2 list: Çalışan tüm PM2 süreçlerini listeler.
* pm2 logs: Uygulamanızın loglarını gösterir.
* pm2 monit: Uygulamalarınızın CPU, bellek kullanımını gerçek zamanlı izler.
* pm2 stop my-node-app: Uygulamayı durdurur.
* pm2 restart my-node-app: Uygulamayı yeniden başlatır.
* pm2 delete my-node-app: Uygulamayı PM2 listesinden siler.
Otomatik Başlangıç (Startup Script):
Sunucu yeniden başlatıldığında PM2 ve yönettiği uygulamaların otomatik olarak başlaması için bir startup script’i oluşturmanız gerekir:
pm2 startup systemd
pm2 save
pm2 startup systemd komutu, PM2’nin sunucu açılışında otomatik olarak başlaması için bir systemd servisi oluşturur. pm2 save komutu ise mevcut PM2 süreç listesini kaydeder, böylece sunucu yeniden başlatıldığında bu süreçler otomatik olarak başlatılır.
5.2. Alternatif: systemd Servisi Olarak Çalıştırma
PM2 kullanmak istemiyorsanız, Node.js uygulamanızı doğrudan bir systemd servisi olarak da yapılandırabilirsiniz. Bu, daha düşük seviyeli bir kontrol sağlar ancak PM2’nin sunduğu izleme ve yönetim özelliklerinden yoksundur.
Uygulamanız için bir systemd servis dosyası oluşturun:
sudo nano /etc/systemd/system/my-node-app.service
Dosyaya aşağıdaki içeriği ekleyin (yolları ve kullanıcı adını kendi ortamınıza göre düzenleyin):
[Unit]
Description=My Node.js Application
After=network.target
[Service]
User=www-data # Uygulamanın çalışacağı kullanıcı (daha güvenli)
WorkingDirectory=/var/www/my-app
ExecStart=/usr/bin/node /var/www/my-app/app.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my-node-app
Environment=NODE_ENV=production PORT=3000
[Install]
WantedBy=multi-user.target
* User: Uygulamanın hangi kullanıcı altında çalışacağını belirtir. root olarak çalıştırmaktan kaçının. www-data genellikle iyi bir seçenektir.
* WorkingDirectory: Uygulamanızın kök dizini.
* ExecStart: Node.js yürütülebilir dosyasının yolu ve uygulamanızın ana giriş dosyasının yolu. NVM kullanıyorsanız, buradaki /usr/bin/node yolunu NVM’nin Node.js yürütülebilir dosyasının yoluna (/home/kullaniciadi/.nvm/versions/node/vXX.X.X/bin/node) değiştirmelisiniz. Bu yolu which node komutuyla bulabilirsiniz.
* Environment: Ortam değişkenlerini burada doğrudan tanımlayabilirsiniz.
* Restart=always: Uygulama çökerse otomatik olarak yeniden başlatılmasını sağlar.
Dosyayı kaydedip kapatın. Ardından systemd‘yi yeniden yükleyin, servisi başlatın ve otomatik başlatma için etkinleştirin:
sudo systemctl daemon-reload
sudo systemctl start my-node-app
sudo systemctl enable my-node-app
sudo systemctl status my-node-app
sudo systemctl status my-node-app komutu, servisinizin durumunu kontrol etmenizi sağlar.
6. Ters Proxy (Reverse Proxy) Kurulumu
Node.js uygulamalarınızı doğrudan internete açmak yerine, bir ters proxy (Nginx gibi) kullanmak en iyi uygulamadır. Ters proxy, istemci isteklerini alır ve bunları Node.js uygulamanıza yönlendirir. Bu, birçok avantaj sağlar:
* Yük Dengeleme: Birden fazla Node.js sürecini yönetebilir.
* SSL Sonlandırma: SSL sertifikalarını yönetebilir ve şifrelemeyi sağlayabilir.
* Statik Dosya Sunma: Resimler, CSS, JavaScript gibi statik dosyaları daha verimli bir şekilde sunabilir.
* Güvenlik: DDoS saldırılarına karşı koruma, IP kısıtlamaları gibi güvenlik katmanları ekleyebilir.
* Port Yönetimi: Node.js uygulamanızın farklı bir portta (örneğin 3000) çalışmasına izin verirken, Nginx standart HTTP (80) ve HTTPS (443) portlarından hizmet verebilir.
6.1. Nginx Kurulumu
Nginx’i kurmak için APT paket yöneticisini kullanın:
sudo apt install nginx -y
Nginx servisini başlatın ve otomatik başlaması için etkinleştirin:
sudo systemctl start nginx
sudo systemctl enable nginx
6.2. 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
Dosyaya aşağıdaki içeriği ekleyin (alan adınızı ve Node.js uygulamanızın çalıştığı portu kendi değerlerinizle değiştirin):
server {
listen 80;
server_name example.com www.example.com; # Alan adınızı buraya yazın
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;
}
# İsteğe bağlı: Statik dosyaları doğrudan Nginx üzerinden sunmak için
# location /static/ {
# root /var/www/my-app/public; # Statik dosyalarınızın yolu
# expires 30d;
# add_header Cache-Control "public, no-transform";
# }
}
* listen 80: Nginx’in HTTP isteklerini 80 numaralı porttan dinlemesini sağlar.
* server_name: Uygulamanızın erişileceği alan adları.
* proxy_pass http://localhost:3000: Gelen istekleri Node.js uygulamanızın çalıştığı localhost:3000 adresine yönlendirir.
* proxy_set_header satırları, Node.js uygulamanızın istemci IP adresi gibi gerçek istek bilgilerine erişmesini sağlar.
Yapılandırma dosyasını kaydettikten sonra, sites-enabled dizinine bir sembolik link oluşturarak Nginx’in bu yapılandırmayı kullanmasını sağlayın:
sudo ln -s /etc/nginx/sites-available/my-node-app /etc/nginx/sites-enabled/
Varsayılan Nginx yapılandırma dosyasını devre dışı bırakın (çakışmaları önlemek için):
sudo unlink /etc/nginx/sites-enabled/default
Nginx yapılandırmasını test edin:
sudo nginx -t
Eğer herhangi bir hata yoksa, Nginx’i yeniden başlatın:
sudo systemctl restart nginx
Artık web tarayıcınızdan http://example.com adresine gittiğinizde, Nginx isteği Node.js uygulamanıza yönlendirecek ve uygulamanızın çıktısını göreceksiniz.
7. SSL/TLS Şifrelemesi (HTTPS) Kurulumu
Web sitenizin güvenliğini sağlamak ve arama motoru sıralamalarını iyileştirmek için HTTPS kullanmak zorunludur. Let’s Encrypt, ücretsiz SSL/TLS sertifikaları sunar ve Certbot aracı ile kolayca kurulabilir.
7.1. Certbot Kurulumu
Certbot ve Nginx eklentisini kurun:
sudo apt install certbot python3-certbot-nginx -y
7.2. Let’s Encrypt Sertifikası Alma
Aşağıdaki komutu çalıştırın. Certbot, Nginx yapılandırmanızı otomatik olarak algılar ve sertifikayı kurar:
sudo certbot --nginx -d example.com -d www.example.com
example.com ve www.example.com yerine kendi alan adlarınızı yazın.
Certbot size bazı sorular soracaktır:
* E-posta adresinizi girin.
* Let’s Encrypt Hizmet Şartlarını kabul edin.
* E-posta adresinizi paylaşmak isteyip istemediğinizi seçin.
* HTTP trafiğini otomatik olarak HTTPS’ye yönlendirmek isteyip istemediğinizi seçin (genellikle 2: Redirect seçeneği önerilir).
Başarılı bir kurulumdan sonra, Certbot Nginx yapılandırma dosyanızı otomatik olarak güncelleyecek ve HTTPS’yi etkinleştirecektir.
7.3. Otomatik Yenileme
Let’s Encrypt sertifikaları 90 gün geçerlidir. Certbot, bu sertifikaları otomatik olarak yenilemek için bir cron işi veya systemd zamanlayıcısı kurar. Yenileme işleminin doğru çalıştığını test edebilirsiniz:
sudo certbot renew --dry-run
Bu komut, yenileme işlemini gerçek sertifikaları yenilemeden simüle eder. Eğer herhangi bir hata yoksa, sertifikalarınız otomatik olarak yenilenecektir. Yenileme zamanlayıcısının durumunu kontrol etmek için:
systemctl status certbot.timer
8. Log Yönetimi ve İzleme
Üretim ortamındaki bir uygulamanın sağlığını ve performansını anlamak için logları izlemek ve yönetmek çok önemlidir.
8.1. PM2 Logları
PM2, uygulamanızın stdout ve stderr çıktılarını otomatik olarak log dosyalarına yönlendirir.
* Logları görüntülemek: pm2 logs my-node-app
* Belirli bir sayıda son satırı görüntülemek: pm2 logs my-node-app --lines 100
* Log dosyalarının konumunu bulmak: pm2 show my-node-app (bu komut, log dosyalarının yollarını da gösterecektir).
8.2. Nginx Logları
Nginx, erişim loglarını (access.log) ve hata loglarını (error.log) /var/log/nginx/ dizininde tutar.
* Erişim loglarını görüntülemek: tail -f /var/log/nginx/access.log
* Hata loglarını görüntülemek: tail -f /var/log/nginx/error.log
8.3. Logrotate
Log dosyaları zamanla büyüyebilir ve disk alanını tüketebilir. logrotate aracı, log dosyalarını otomatik olarak sıkıştırır, arşivler ve siler. Çoğu Linux dağıtımında varsayılan olarak kuruludur ve Nginx için zaten yapılandırılmıştır. PM2 için de manuel olarak bir logrotate yapılandırması ekleyebilirsiniz.
/etc/logrotate.d/pm2 dosyası oluşturarak:
sudo nano /etc/logrotate.d/pm2
İçeriği aşağıdaki gibi olabilir (PM2 log dosyalarının yollarını kendi sisteminize göre düzenleyin):
/home/kullaniciadi/.pm2/logs/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 kullanıcıadı www-data
sharedscripts
postrotate
/usr/bin/pm2 reloadLogs all > /dev/null
endscript
}
Bu yapılandırma, PM2 loglarını günlük olarak döndürür, 7 gün boyunca saklar ve sıkıştırır.
8.4. İzleme Araçları (Opsiyonel)
Daha gelişmiş izleme ve uyarılar için Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana) gibi araçları düşünebilirsiniz. Bunlar, uygulamanızın ve sunucunuzun performans metriklerini derinlemesine analiz etmenizi sağlar.
9. Ek Güvenlik İpuçları ve En İyi Uygulamalar
Bir Node.js uygulamasını üretimde çalıştırmak sadece kurulumla bitmez; sürekli güvenlik ve bakım gerektirir.
9.1. Sürekli Güncelleme
* İşletim Sistemi: Sunucunuzu düzenli olarak sudo apt update && sudo apt upgrade -y komutlarıyla güncel tutun.
* Node.js: NVM kullanıyorsanız, nvm install latest_lts_version ve nvm use latest_lts_version ile Node.js’yi güncelleyebilirsiniz.
* npm Paketleri: Uygulamanızın bağımlılıklarını düzenli olarak güncelleyin. npm outdated ile eski paketleri görebilir, npm update veya npm audit fix ile güncelleyebilirsiniz. npm audit komutu, bilinen güvenlik açıklarını kontrol eder.
9.2. Minimum Yetki Prensibi
Node.js uygulamanızı asla root kullanıcısı olarak çalıştırmayın. PM2 veya systemd servis dosyasında User direktifi ile uygulamayı www-data gibi düşük yetkili bir kullanıcı altında çalıştırın. Bu, olası bir güvenlik açığının tüm sunucuya yayılmasını engeller.
9.3. Güçlü Parolalar ve SSH Anahtarları
Tüm sunucu kullanıcıları için güçlü ve benzersiz parolalar kullanın. SSH anahtar çiftleri kullanmak, parola tabanlı kimlik doğrulamadan çok daha güvenlidir.
9.4. Yedekleme Stratejisi
Uygulama dosyalarınızın ve eğer varsa veritabanınızın düzenli yedeklerini alın. Felaket kurtarma durumunda bu yedekler hayati önem taşır.
9.5. Güvenlik Başlıkları
Nginx yapılandırmanıza güvenlik başlıkları ekleyerek yaygın web güvenlik açıklarına karşı koruma sağlayabilirsiniz. Örneğin, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options gibi başlıkları ekleyebilirsiniz.
# /etc/nginx/sites-available/my-node-app dosyanıza server bloğu içine ekleyin
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "no-referrer-when-downgrade";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
9.6. Rate Limiting (İstek Sınırlama)
DDoS saldırılarına veya aşırı kaynak tüketimine karşı Nginx üzerinde istek sınırlaması uygulayabilirsiniz:
# /etc/nginx/nginx.conf veya /etc/nginx/conf.d/rate-limit.conf içine ekleyin
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
/etc/nginx/sites-available/my-node-app dosyanıza location bloğu içine ekleyin
location / {
limit_req zone=mylimit burst=10 nodelay;
# ... diğer proxy_pass ayarları
}
Bu örnek, IP başına saniyede 5 istekle sınırlar ve 10 isteğe kadar ani artışlara izin verir.
10. Sonuç
Bu kapsamlı rehberde, Node.js uygulamanızı Ubuntu 18.04 sunucusu üzerinde üretim ortamı için başarıyla kurmak için gereken tüm temel adımları ele aldık. Sunucu hazırlığından başlayarak, Node.js ve bağımlılıkların yönetimi, PM2 ile sürekli çalışma, Nginx ile ters proxy yapılandırması, Let’s Encrypt ile SSL şifrelemesi ve önemli güvenlik ipuçlarına kadar birçok konuyu detaylandırdık.
Bir Node.js uygulamasını üretim ortamında çalıştırmak, performans, güvenlik ve kararlılık arasında bir denge kurmayı gerektirir. Bu adımları dikkatlice takip ederek, uygulamanız için sağlam ve güvenli bir temel oluşturmuş olursunuz. Ancak unutulmamalıdır ki, üretim ortamları sürekli bakım, izleme ve güvenlik güncellemeleri gerektirir. Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) boru hatları kurarak dağıtım süreçlerinizi otomatikleştirmek ve gelişmiş izleme araçları kullanarak uygulamanızın sağlığını sürekli kontrol etmek, uzun vadede uygulamanızın başarısı için kritik öneme sahiptir.
