Ubuntu Üzerinde Bir Node.js Uygulamasını Prodüksiyona Hazırlama


Giriş

Bir Node.js uygulamasını yerel olarak çalıştırmak sadece ilk adımdır. Üretime hazır hale getirmek için, uygulamanızı kararlılık, güvenlik ve performans gerektiren gerçek dünya koşullarına uygun şekilde yapılandırmanız gerekir. Doğru yapılandırılmış bir üretim ortamı, uygulamanızın çökme durumlarından kurtulmasını, trafiği güvenli bir şekilde sunmasını ve kesinti olmadan artan talebi karşılamasını sağlar.

Bu rehberde, Ubuntu üzerinde Node.js, PM2, Nginx, Let’s Encrypt ve UFW kullanarak eksiksiz bir üretim ortamı kuracaksınız. Node.js uygulamayı çalıştırır, PM2 süreçleri yönetir ve otomatik olarak yeniden başlatır, Nginx gelen istekleri yönlendirir ve trafiği HTTPS üzerinden sunar, Let’s Encrypt ücretsiz SSL sertifikaları sağlar ve UFW sunucuyu ağ erişimini kontrol ederek güvence altına alır. Bu araçlar bir araya geldiğinde, güvenilir, verimli ve güvenli uygulamaların dağıtımı için sağlam bir temel oluşturur.

Node uygulamalarınızı GitHub üzerinden Linux-Console.net Uygulama Platformu ile dağıtın. Linux-Console.net, uygulamanızın ölçeklenmesine odaklansın.

Öne Çıkan Noktalar:

  • PM2 gibi bir süreç yöneticisi kullanın, Node.js uygulamalarının sürekli çalışmasını sağlamak, çökmelerde otomatik olarak yeniden başlatmak ve pm2 startup ve pm2 save kullanarak yeniden başlatmada başlamasını sağlamak için.
  • Nginx'in arkasında uygulamaları ters proxy olarak çalıştırın, Node.js'i doğrudan açığa çıkarmayın. Nginx SSL, statik dosyalar ve yük dengelemesini verimli bir şekilde yönetir.
  • Üretimde Node.js’i her zaman localhost’a (127.0.0.1) bağlı tutun, böylece doğrudan halka açık erişimi önleyebilir ve dış trafik için Nginx’e güvenebilirsiniz.
  • Let’s Encrypt ve Certbot ile HTTPS’i Etkinleştirin. Nginx’in SSL sonlandırmayı ve sertifika yenilemelerini otomatik olarak yönetmesine sudo certbot renew --dry-run komutuyla izin verin.
  • Sunucuyu UFW ile güvence altına alın. Sadece SSH ve “Nginx Full” (HTTP/HTTPS) trafiğine izin verin, diğer her şeyi engelleyin.
  • Gizli bilgileri ortam değişkenleri veya dotenv tarafından yüklenen .env dosyaları aracılığıyla yönetin ve bunları sürüm kontrolünden uzak tutun.
  • Nginx'te sıkıştırma ve önbellekleme etkinleştirin (gzip ve Brotli) böylece yükleme hızını artırabilir ve bant genişliği kullanımını azaltabilirsiniz.
  • PM2 ve sistem araçlarıyla izleme (pm2 monit, htop veya Grafana/Prometheus gibi araçlarla entegrasyon) performans sorunlarını erken tespit etmek için.
  • Güncellemeleri ve denetimleri düzenli olarak uygulayın (sudo apt update && sudo apt upgrade, npm audit) sistem ve bağımlılık güvenliğini korumak için.
  • En iyi uygulamaları takip edin: Kararlı ve güvenli bir dağıtım için root olmayan bir kullanıcı altında çalıştırmak, yedeklemeleri otomatikleştirmek, log dönüşümünü sağlamak ve her yerde HTTPS kullanmak gibi.

Önkoşullar

Bu kılavuz, aşağıdakilere sahip olduğunuzu varsayar:

  • İlk Ubuntu sunucu kurulumu sırasında tarif edildiği şekilde bir Ubuntu sunucu kurulumu. Sudo ayrıcalıklarına sahip bir root olmayan kullanıcıya ve aktif bir güvenlik duvarına sahip olmalısınız.
  • Sunucunuzun genel IP adresine yönlendirilmiş bir alan adı. Bu öğreticide alan adı olarak example.com kullanılacaktır.
  • Nginx yüklendi, Ubuntu Üzerinde Nginx Nasıl Kurulur ve Yapılandırılır rehberinde anlatıldığı şekilde.
  • Nginx, Let’s Encrypt sertifikaları kullanılarak SSL ile yapılandırıldı. Ubuntu üzerinde Nginx’i Let’s Encrypt ile nasıl güvenceye alacağınızı gösteren rehber size süreci adım adım anlatacak.

Önkoşulları tamamladığınızda, https://example.com/ adresinde alan adınızın varsayılan yer tutucu sayfasını sunan bir sunucunuz olacak.

Node.js'i Kur ve Doğrula

Bu adımda, NodeSource PPA kullanarak Node.js'i kuracak ve kurulumun başarılı olduğunu doğrulayacaksınız. Bu yöntem, Node.js'in en son Uzun Süreli Destek (LTS) sürümüne ve ilişkili paket yöneticisi npm'ye erişiminiz olmasını sağlar.

Node.js'i NodeSource PPA üzerinden yükleyin

Öncelikle, NodeSource PPA'sını yükleyerek onun deposuna erişim sağlayın. Ev dizininde olduğunuzdan emin olun ve en son LTS sürümü için setup betiğini indirmek için curl kullanın.

cd ~

curl -sL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh

Scripti çalıştırmadan önce içeriğini nano ile gözden geçirebilirsiniz:

nano nodesource_setup.sh

Hazır olduğunuzda, betiği sudo ile çalıştırın:

sudo bash nodesource_setup.sh

Bu, PPA'yı yapılandırmanıza ekleyecek ve yerel paket önbelleğinizi otomatik olarak güncelleyecektir.

Şimdi Node.js’i kurabilirsiniz:

sudo apt install nodejs

Kurulumu doğrulamak ve Node.js sürümünü kontrol etmek için şunu çalıştırın:

node -v

Bunun gibi bir çıktı görmelisiniz:

v24.11.1

npm ve build-essential paketlerini kur

nodejs paketi ayrıca Node.js paket yöneticisi npm'yi de kurar. Kurulduğunu doğrulamak ve yapılandırma dosyasını başlatmak için şunu çalıştırın:

npm -v

Benzer bir çıktı görmelisiniz:

11.6.2

Bazı npm paketlerinin çalışabilmesi için (örneğin kaynak koddan derleme gerektirenler), build-essential paketini kurmanız gerekecek:

sudo apt install build-essential

Node.js ve npm başarıyla yüklendikten sonra, artık uygulamanızın bağımlılıklarını geliştirmek ve yönetmek için gerekli araçlara sahipsiniz. Bir sonraki bölümde, çalışma zamanı ortamını test etmek için basit bir Node.js uygulaması oluşturacaksınız.

Örnek Bir Node.js Uygulaması Oluştur

Herhangi bir HTTP isteğine "Hello World" yanıtı veren basit bir Node.js uygulaması yazalım. Bu örnek uygulama, Node.js'in doğru şekilde kurulup kurulmadığını doğrulayacak ve uygulamaların üretim ortamında localhost üzerinde güvenli bir şekilde nasıl dinleme yapacak şekilde yapılandırılması gerektiğini gösterecektir.

Basit bir Node.js sunucusu oluştur

Ev dizininizde hello.js adında yeni bir dosya oluşturun:

cd ~

nano hello.js

Dosyaya aşağıdaki kodu ekleyin:

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Bitirdiğinizde dosyayı kaydedip kapatın.

Bu betik, 3000 portunda dinleyen basit bir HTTP sunucusu oluşturur ve gelen tüm isteklere Merhaba Dünya! yanıtını verir. localhost ile bağlı olduğu için, sadece aynı makinadan gelen bağlantıları kabul eder.

Uygulamayı test et

Uygulamanızı Node.js ile çalıştırın:

node hello.js

Aşağıdakine benzer bir çıktı görmelisiniz:

Server running at http://localhost:3000/

Başka bir terminal oturumunda, uygulamanızı curl ile test edin:

curl http://localhost:3000

Aşağıdaki çıktıyı görmelisiniz:

Hello World!

Beklenen çıktıyı alamıyorsanız, Node.js uygulamanızın çalıştığından ve doğru adres ve portu dinleyecek şekilde yapılandırıldığından emin olun.

Çalıştığından emin olduktan sonra, sunucuyu durdurmak için orijinal terminalde CTRL+C tuşlarına basarak uygulamayı kapatın.

Uygulamaların üretimde localhost'a bağlanması neden gereklidir

Üretim ortamlarında, Node.js uygulamaları genellikle Nginx gibi bir ters proxy'nin arkasında çalışır. Node.js uygulaması dahili bir adeste (örneğin localhost:3000) dinler ve Nginx gelen web trafiğini, TLS sonlandırmasını ve yönlendirmeyi yönetir.

Uygulamanızı localhost adresine bağlamak, çeşitli güvenlik ve güvenilirlik avantajları sağlar:

  • Dışa maruziyeti önler: Node.js işlemine yalnızca Nginx doğrudan erişebilir.
  • HTTPS yükünü kaldırmayı sağlar: Nginx, SSL sertifikalarını ve şifrelemeyi yönetir, bu işi Node.js'den alır.
  • Güvenlik duvarı kurallarını basitleştirir: Güvenlik duvarı, HTTP/HTTPS izin verirken tüm dahili uygulama portlarına erişimi engelleyebilir.

Bu kurulum, Node.js uygulamanızın izole, güvenli olmasını ve yalnızca Nginx ters proxy üzerinden erişilebilir olmasını sağlar.

PM2 Süreç Yöneticisini Kur ve Yapılandır

Bu bölümde, Node.js uygulamaları için bir üretim süreç yöneticisi olan PM2'yi kuracaksınız. PM2, uygulamalarınızı sürekli çalışır durumda tutmanıza, çökme sonrası otomatik olarak yeniden başlatmanıza ve sistem açılışında başlamalarını ayarlamanıza olanak tanır.

PM2 Kurulumu

PM2'yi global olarak kurmak için npm kullanın:

sudo npm install -g pm2

-g bayrağı PM2’yi sistem genelinde kurar, böylece tüm kullanıcılar ve uygulamalar için kullanılabilir hale gelir.

Kurulduktan sonra, örnek uygulamanızı PM2 kullanarak başlatın:

pm2 start hello.js

PM2'nin uygulamanızı yönetmeye başladığını gösteren bir çıktı tablosu göreceksiniz:

[PM2] Spawning PM2 daemon with pm2_home=/home/user/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /root/nodeapp/hello.js in fork_mode (1 instance)
[PM2] Done.
┌────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0  │ hello    │ default     │ N/A     │ fork    │ 3826     │ 0s     │ 0    │ online    │ 0%       │ 33.3mb   │ root     │ disabled │
└────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

Yukarıda belirtildiği gibi, PM2 otomatik olarak bir Uygulama adı (dosya adına göre, .js uzantısı olmadan) ve bir PM2 id atar. PM2 ayrıca sürecin PID’si, geçerli durumu ve bellek kullanımı gibi başka bilgileri de tutar.

Çökme ve Yeniden Başlatmada Otomatik Yeniden Başlatmayı Etkinleştirme

PM2, uygulamanız çöker veya kapatılırsa otomatik olarak yeniden başlatır. Sunucu yeniden başlatıldığında PM2'nin kendisinin de otomatik olarak başlamasını sağlamak için şunu çalıştırın:

pm2 startup systemd

PM2, şöyle bir komut oluşturacaktır (kendi kullanıcı adınızla sammy'yi değiştirin):

[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/home/sammy/.nvm/versions/node/v24.11.1/bin /home/sammy/.nvm/versions/node/v24.11.1/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Not: Yolunuz, Node.js sürümünüze ve kullanıcı adınıza bağlı olarak değişecektir.

O komutu çalıştırın, ardından çalışan uygulamalarınızı kaydedin ki PM2 onları bir sonraki yeniden başlatmada hatırlasın:

pm2 save

Her şeyin düzgün bir şekilde kurulmuş olduğunu doğrulamak için, servis durumunu kontrol edin:

systemctl status pm2-sammy

Not: systemd hakkında ayrıntılı bir genel bakış için lütfen Systemd Essentials: Servisler, Birimler ve Günlük ile Çalışma bölümünü inceleyin.

Sorun yaşarsanız, sunucunuzu yeniden başlatın ve uygulamanızın otomatik olarak başladığından emin olun.

PM2 Ekosistem Dosyası Kullanımı

Birden fazla uygulama çalıştırmaya veya farklı ortamları yönetmeye hazır olduğunuzda, PM2’nin ekosistem dosyası büyük bir yardımcıdır. Bu, ortam değişkenlerini, portları ve dağıtım ayarlarını tek bir yerde tanımlamanıza olanak tanıyan basit bir yapılandırma dosyasıdır.

Aşağıdaki komutu çalıştırarak bir başlangıç dosyası oluşturun:

pm2 ecosystem

Ardından oluşturulan ecosystem.config.js dosyasını düzenleyin:

module.exports = {
  apps: [
    {
      name: 'hello',
      script: 'hello.js',
      env: {
        NODE_ENV: 'development',
        PORT: 3001
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000
      }
    }
  ]
};

Uygulamanızı üretim modunda başlatmak için şunu kullanın:

pm2 start ecosystem.config.js --env production

Ecosystem dosyası, birden fazla ortamı yönetmeyi ve ortam değişkenlerini kaynak kodunuzun dışında güvenli bir şekilde saklamayı kolaylaştırır. PM2 kurulu olduğunda, uygulamanız arka planda sessizce çalışırken çökme, yeniden başlatma ve güncellemelerden etkilenmeden çalışmaya devam eder.

Ek PM2 komutları

Ele aldıklarımızın yanı sıra, PM2, uygulamalarınızı yönetmenize veya hakkında bilgi edinmenize olanak tanıyan birçok alt komut sunar.

Bu komutla bir uygulamayı durdurun (PM2 Uygulama adı veya id'yi belirtin):

pm2 stop app_name_or_id

Bir uygulamayı yeniden başlat:

pm2 restart app_name_or_id

Şu anda PM2 tarafından yönetilen uygulamaları listeleyin:

pm2 list

Belirli bir uygulama hakkında bilgi almak için Uygulama adı kullanın:

pm2 info app_name

Uygulamanız için canlı günlükleri görüntülemek için:

pm2 logs

PM2 işlem monitörü, monit alt komutu ile açılabilir. Bu, uygulama durumu, CPU ve bellek kullanımını gösterir:

pm2 monit

Herhangi bir argüman olmadan pm2 komutunu çalıştırdığınızda, kullanım örnekleri ile birlikte bir yardım sayfası da görüntüleneceğini unutmayın.

Artık Node.js uygulamanız çalışıyor ve PM2 tarafından yönetiliyorsa, ters proxy'yi kurmaya başlayalım.

Nginx’i Ters Vekil Sunucu Olarak Kurma

Node.js uygulamanız PM2 altında çalışırken, bir sonraki adım onu kullanıcıların web üzerinden erişebilmesini sağlamaktır. Uygulamayı doğrudan 3000 portunda açmak yerine, bir ters proxy olarak Nginx kullanacaksınız. Nginx, gelen tüm HTTP ve HTTPS isteklerini yönetecek ve bunları localhost üzerinde çalışan Node.js uygulamanıza iletecektir.

Temel Ters Vekil Sunucu Yapılandırması

Sitesinin Nginx yapılandırma dosyasını açın. Ön koşullar bölümündeki kurulum adımlarını takip ettiyseniz, bu dosya /etc/nginx/sites-available/example.com konumunda bulunmalıdır:

sudo nano /etc/nginx/sites-available/example.com

server bloğu içinde, location / bölümünü bulun (veya oluşturun) ve içeriğini aşağıdaki yapılandırma ile değiştirin. Node.js uygulamanız farklı bir portta dinliyorsa, vurgulanan değeri buna göre güncelleyin.

server {
...
    listen 80;
    server_name example.com www.example.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;
    }
...
}

Bu, Nginx'e 80 numaralı portta (HTTP) dinlemesini ve tüm gelen trafiği 3000 numaralı portta çalışan Node.js uygulamanıza yönlendirmesini söyler.

Birden fazla uygulamayı test etmek için ek location blokları tanımlayabilirsiniz. Örneğin, 3001 numaralı portta çalışan başka bir Node.js uygulamanız varsa, bunu aynı sunucu bloğuna ekleyin:

server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        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;
    }
...
}

Dosyayı kaydedin, ardından sözdizimi hatalarını kontrol etmek için yapılandırmayı çalıştırarak test edin:

sudo nginx -t

Her şey uygun görünüyorsa, Nginx'i yeniden yükleyin:

sudo systemctl reload nginx

Bu noktada, sunucunuzun alan adını ziyaret etmek (örneğin, http://example.com) Nginx proxy üzerinden çalışan Node.js uygulamasını yüklemelidir.

HTTPS (SSL) Yapılandırması Ekleme

Uygulamanızı güvence altına almak için Nginx'i HTTPS trafiğini işlemek üzere yapılandırın. Eğer halihazırda Let’s Encrypt'ten SSL sertifikalarınız varsa, bunların Nginx yapılandırmanızda tanımlı olduğundan emin olun. İşte güncellenmiş sunucu bloğunun nasıl görünebileceğine dair bir örnek:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    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;
    }
}

İlk sunucu bloğu tüm HTTP isteklerini otomatik olarak HTTPS'ye yönlendirir, ikinci blok ise 443 numaralı portta güvenli trafiği yönetir.

Çoklu Uygulama Yönlendirme (İsteğe Bağlı)

Eğer sunucunuz birden fazla uygulamaya ev sahipliği yapıyorsa, Nginx bunların hepsini farklı yollar veya alt alan adları tanımlayarak yönetebilir. Örneğin, şu durum olabilir:

  • https://example.com/ 3000 portuna yönlendiriyor
  • https://example.com/app2 3001 numaralı porta yönlendiriyor
  • https://api.example.com/ 4000 numaralı porta yönlendiriyor

Her uygulama kendi PM2 süreci tarafından yönetilebilir ve Nginx üzerinden sunulabilir.

Her şeyin çalıştığını doğruladıktan sonra, Node.js uygulamanız artık Nginx üzerinden güvenli bir şekilde erişilebilir olmalıdır.

Üretim İçin UFW Güvenlik Duvarını Yapılandır

Artık Node.js uygulamanız Nginx arkasında çalıştığına göre, ağ güvenliğinin son katmanını ekleyelim. Ubuntu, UFW (Uncomplicated Firewall/Basit Güvenlik Duvarı) adlı yerleşik bir güvenlik duvarı ile birlikte gelir. Hafif, yapılandırması kolaydır ve sunucunuza istenmeyen erişimleri engellemek için mükemmeldir.

Güvenlik Duvarı Durumunu Kontrol Etme

Herhangi bir değişiklik yapmadan önce, UFW'nin zaten etkin olup olmadığını kontrol edin:

sudo ufw status

Eğer etkin değil yazıyorsa, endişelenmeyin, kısa süre içinde etkinleştireceğiz. Ama önce hangi tür trafiğe izin verileceğini belirleyeceğiz. Açmadan önce kuralları ayarlamak her zaman en iyisidir.

Temel Trafiğe İzin Ver

En azından, sunucunuza hala bağlanabilmek için SSH'yi ve Nginx'in web trafiğini sunabilmesi için HTTP/HTTPS'i izin vermeniz gerekecek. Bunu yapmak için aşağıdaki komutları çalıştırın:

sudo ufw allow OpenSSH

sudo ufw allow 'Nginx Full'

Şimdi güvenlik duvarını etkinleştirebiliriz:

sudo ufw enable

Onaylamanız istenecek: y yazın ve Enter tuşuna basın.

Kurallarınızın aktif olduğundan emin olmak için güvenlik duvarını tekrar kontrol edin:

sudo ufw status

Şuna benzer bir şey görmelisin:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Hepsi bu! Artık sadece SSH ve web trafiğine izin veriliyor; diğer her şey engellendi.

Üretimde Güvenlik Duvarının Önemi

Güvenlik duvarları, sisteminize hangi ağ trafiğinin ulaşabileceği üzerinde sıkı kontrol sağladıkları için sunucu güvenliği açısından temel öneme sahiptir. Gereksiz portlar açık bırakılırsa, iyi yapılandırılmış uygulamalar ve web sunucuları bile savunmasız olabilir.

İşte güvenlik duvarlarının üretimde kritik olmasının birkaç temel nedeni:

  • Maruziyeti en aza indirin: Yalnızca açıkça izin verilen portlara erişilebilir, bu da potansiyel saldırı yollarının sayısını azaltır.
  • İzole Etme: Bir ihlal veya yanlış yapılandırma durumunda, bir güvenlik duvarı saldırganın sisteminiz veya ağınız içinde ne kadar ilerleyebileceğini sınırlar.
  • Uyumluluk ve denetim: Birçok güvenlik standardı, denetlenebilir erişim kurallarıyla aktif güvenlik duvarı koruması gerektirir.
  • Derin savunma: Güvenlik duvarları, TLS, kimlik doğrulama ve uygulama güçlendirme gibi diğer güvenlik katmanlarını tamamlar.

Çoğu üretim sunucusu için, yalnızca gerekli portları açık tutarak bir güvenlik duvarını etkin durumda bırakmak, erişilebilirlik ve koruma arasında doğru dengeyi sağlar. Bu, ek bir kontrol katmanı sağlayan ve yetkisiz ağ erişimini önlemeye yardımcı olan düşük bakım gerektiren bir güvenlik önlemidir.

UFW yapılandırıldıktan sonra, sisteminiz artık ağ seviyesinde daha güvenli.

Let’s Encrypt ile SSL’i etkinleştir

Artık uygulamanız Nginx üzerinden herkes tarafından erişilebilir olduğuna göre, güvenli iletişim için HTTPS ekleme zamanı geldi. SSL, sunucunuz ile kullanıcılar arasındaki tüm trafiği şifreleyerek gizlilik ve veri bütünlüğünü sağlar. Sitenize SSL eklemenin en kolay yolu, ücretsiz ve otomatik bir sertifika otoritesi olan Let’s Encrypti kullanmaktır.

Certbot ve Nginx Eklentisini Yükleyin

Let’s Encrypt, sertifikaların talep edilmesi, yüklenmesi ve yenilenmesi sürecinin tamamını yöneten Certbot adlı bir araç aracılığıyla çalışır. Ubuntu üzerinde, Certbot'u ve Nginx eklentisini tek bir adımda kurabilirsiniz:

sudo apt update

sudo apt install certbot python3-certbot-nginx -y

Bu, hem Certbot istemcisini hem de Nginx entegrasyon eklentisini kurar; bu eklenti mevcut Nginx sunucu bloğunuzda HTTPS’i otomatik olarak yapılandıracaktır.

SSL Sertifikaları Edinin

Certbot yüklendikten sonra, alan adınız için yeni bir SSL sertifikası talep etmek için kullanabilirsiniz. example.com ve www.example.com yerine gerçek alan adlarınızı yazın:

sudo certbot --nginx -d example.com -d www.example.com

Süreç boyunca Certbot şunları yapacaktır:

  • Alan adınızın bu sunucuya yönlendirildiğini doğrulayın (HTTP doğrulaması kullanarak)
  • Let’s Encrypt'ten bir SSL sertifikası edinin
  • HTTPS'i etkinleştirmek için Nginx yapılandırmanızı otomatik olarak düzenleyin
  • Yeni ayarların geçerli olması için Nginx'i yeniden yükleyin

Yenileme bildirimleri için kullanılacak bir e-posta adresi girmeniz ve hizmet şartlarını kabul etmeniz istenecektir. Kurulum tamamlandığında, sertifikanızın başarıyla yüklendiğini belirten bir onay mesajı görmelisiniz.

Sertifika bilgilerinizi şu adresle tekrar kontrol edebilirsiniz:

sudo certbot certificates

Sonra sitenin artık güvenli bir şekilde sunulduğunu doğrulamak için alan adınızı ziyaret edin.

Otomatik Yenileme

Let’s Encrypt sertifikaları sadece 90 gün geçerlidir, ancak manuel yenilemeler konusunda endişelenmeye gerek yoktur. Certbot, son kullanma tarihi yaklaşan sertifikaları kontrol etmek ve otomatik olarak yenilemek için günde iki kez çalışan bir sistem zamanlayıcısı kurar.

Bu yenileme sürecini istediğiniz zaman şu şekilde test edebilirsiniz:

sudo certbot renew --dry-run

Eğer prova çalışması hatasız tamamlanırsa, sertifikalarınız arka planda otomatik olarak yenilenecek ve Nginx yeni sertifikaları uygulamak için yeniden yüklenecektir.

HTTPS Neden Önemlidir

Uygulamanızı HTTPS üzerinden çalıştırmak artık isteğe bağlı değildir, herhangi bir üretim sistemini çalıştırmanın önemli bir parçasıdır. SSL/TLS, sunucunuz ile istemcileriniz arasındaki tüm iletişimin şifreli ve değiştirilemez olmasını sağlar, böylece dinlemeye ve veri manipülasyonuna karşı koruma sağlar.

Güvenliğin ötesinde, HTTPS birkaç ek avantaj da sunar:

  • Güven ve itibar: Tarayıcılar, HTTPS olmayan siteleri “Güvenli Değil” olarak işaretler, bu da kullanıcı güvenini sarsabilir.
  • Geliştirilmiş arama sıralaması: Önde gelen arama motorları, sıralama sinyali olarak HTTPS kullanır.
  • Modern web özelliklerine erişim: HTTP/2, QUIC ve diğer performans geliştirmeleri TLS gerektirir.
  • Uyumluluk: Birçok gizlilik yönetmeliği ve sektör standardı, iletilen verilerin şifrelenmesini zorunlu kılar.

Let’s Encrypt’i kullanarak, çok az kurulumla ve hiçbir maliyet olmadan bu avantajları elde edersiniz. Sertifikalar otomatik olarak yenilenir, bu da güvenli dağıtımlar için kolay ve uzun vadeli bir çözüm sağlar.

HTTPS etkinleştirildiğinde, sunucunuz artık şifrelenmiş ve güvenilir trafik sağlıyor.

Ortam Değişkenlerini Güvenli Bir Şekilde Yönetin

Her üretim uygulamasının API anahtarları, veritabanı kimlik bilgileri veya gizli tokenlar gibi yapılandırma verilerini güvenilir bir şekilde yönetme yöntemine ihtiyacı vardır. Bu değerleri doğrudan kaynak kodunuzda saklamak, onları sürüm kontrolü, loglar veya hatta istemci tarafı sızıntıları aracılığıyla açığa çıkarabilir. Daha güvenli bir yaklaşım, hassas bilgileri kod tabanınızdan ayrı tutan çevresel değişkenleri kullanmaktır.

dotenv ile .env Dosyalarını Kullanma

Node.js'te ortam değişkenlerini yönetmenin yaygın ve basit bir yöntemi, bir .env dosyası ile dotenv paketini birlikte kullanmaktır. Bu yapılandırma, uygulamanızın çalışma zamanında yapılandırma değerlerini okumasını sağlarken, bu değerleri kaynak koddan uzak tutar.

Aşağıdakini çalıştırarak dotenv paketini kurun:

npm install dotenv

Sonraki adım olarak, proje dizininizde bir .env dosyası oluşturun:

nano .env

Yapılandırma değerlerinizi, şu şekilde anahtar-değer çiftleri olarak ekleyin:

PORT=3000
NODE_ENV=production
DB_HOST=localhost
DB_USER=myuser
DB_PASS=securepassword
JWT_SECRET=myjwtsecretkey

Şimdi, ana uygulama dosyanızı (örneğin, app.js) başlatılırken ortam değişkenlerini yükleyecek şekilde değiştirin:

require('dotenv').config();

const express = require('express');
const app = express();

app.listen(process.env.PORT, () => {
  console.log(`Server running in ${process.env.NODE_ENV} mode on port ${process.env.PORT}`);
});

Uygulamanız çalıştığında, .env dosyasında tanımlanan değişkenleri okur ve bunları çalışma zamanı ortamını yapılandırmak için kullanır.

PM2 ile Çevresel Değişkenler

Uygulamanızı PM2 ile çalıştırıyorsanız, ortam değişkenlerini doğrudan PM2 komutlarında veya yapılandırma dosyalarında tanımlayabilirsiniz. Bu, geliştirme, test ve üretim gibi farklı ortamlarda yapılandırmaların tutarlı olmasına yardımcı olur.

Bir uygulamayı başlatırken değişkenleri satır içinde ayarlayabilirsiniz:

pm2 start app.js --name "myapp" --env production

Daha temiz ve daha ölçeklenebilir bir çözüm için PM2 ekosistem yapılandırma dosyasını kullanın. Bunu şu şekilde oluşturabilirsiniz:

pm2 ecosystem

Ardından ortam değişkenlerinizi eklemek için ecosystem.config.js dosyasını düzenleyin:

module.exports = {
  apps: [
    {
      name: 'myapp',
      script: 'app.js',
      env: {
        NODE_ENV: 'development',
        PORT: 3001
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000,
        DB_HOST: 'localhost',
        DB_USER: 'myuser',
        DB_PASS: 'securepassword'
      }
    }
  ]
};

Uygulamayı üretim modunda başlatın:

pm2 start ecosystem.config.js --env production

Bu, uygulama her yeniden başlatıldığında doğru değişkenlerin otomatik olarak yüklenmesini sağlar.

Gizli Bilgilerin Yönetiminde En İyi Uygulamalar

Gizli bilgileri ve ortam değişkenlerini güvenli bir şekilde yönetmek, altyapınızın bütünlüğünü korumak için kritik öneme sahiptir. Aşağıdaki en iyi uygulamalar risklerin en aza indirilmesine yardımcı olacaktır:

  • Sırları kaynak kontrolünden uzak tutun: .env dosyalarını Git deposuna asla eklemeyin. Kazara açığa çıkmalarını önlemek için bunları .gitignore dosyasına ekleyin.

  • Erişimi sınırlayın: Yalnızca güvenilen kullanıcılar ve otomatik sistemler ortam yapılandırma dosyalarını okumak veya değiştirmek için izin sahibi olmalıdır.

  • Ortam spesifik dosyalar kullanın: Geliştirme, test, hazırlık ve üretim için ayrı yapılandırmaları koruyun. Örneğin, .env.development ve .env.production.

  • Gizli bilgileri düzenli olarak değiştirin: Olası sızıntıların etkisini azaltmak için API anahtarlarını, tokenları ve parolaları belirli bir takvimle değiştirin.

  • Daha büyük sistemler için bir gizli bilgi yöneticisi kullanın: Karmaşık uygulamalar veya ekipler için, yerel .env dosyaları yerine HashiCorp Vault gibi servisleri kullanmayı düşünün.

  • Hassas verileri kaydetmekten kaçının: Uygulamanızda veya dağıtım günlüklerinizde gizli bilgileri yazdırmamaya veya kaydetmemeye dikkat edin.

  • Başlatmada ortam değişkenlerini doğrulayın: Uygulama çalışmadan önce tüm gerekli değişkenlerin ayarlandığından emin olmak için joi veya env-schema gibi kütüphaneleri kullanın.

  • Dosya izinlerini sınırlayın: .env dosyalarına erişimi sınırlamak için chmod komutunu kullanın. Örneğin:

    chmod 600 .env

Bu uygulamaları takip etmek, hassas bilgilerin korunmasına yardımcı olur, kazara ifşa edilmesini önler ve birden fazla ortamda yapılandırmayı yönetmeyi kolaylaştırır.

Üretim Optimizasyon Teknikleri

Uygulamanız kararlı bir üretim ortamında çalışır hale geldikten sonra, performans ve verimliliğe odaklanmak önemlidir. Optimizasyon sadece kullanıcı deneyimini iyileştirmekle kalmaz, aynı zamanda sunucu maliyetlerini azaltır ve sorunsuz ölçeklenmeyi sağlar. Bu bölümde, Node.js ve Nginx kurulumunuzu daha iyi hız, güvenilirlik ve kaynak kullanımı için ince ayarlamanıza yardımcı olacak çeşitli teknikleri öğreneceksiniz.

Sıkıştırmayı Etkinleştir (gzip veya Brotli)

Sıkıştırma, performansı artırmanın en basit yollarından biridir. Sunucudan istemciye gönderilen dosyaların boyutunu küçültür, bu da sayfa yüklemelerini hızlandırır ve bant genişliği tüketimini azaltır. Nginx, iki popüler sıkıştırma yöntemini destekler: gzip ve Brotli.

Gzip kullanımı

Gzip sıkıştırmayı etkinleştirmek için ana Nginx yapılandırma dosyasını açın:

sudo nano /etc/nginx/nginx.conf

http bloğunun içinde, aşağıdaki yönergeleri ekleyin veya yorum işaretlerini kaldırın:

gzip on;
gzip_types text/plain text/css application/javascript application/json application/xml;
gzip_min_length 256;
gzip_comp_level 5;

Bu ayarlar, yaygın dosya türleri için gzip'i etkinleştirir, 256 bayttan büyük dosyaları sıkıştırır ve CPU yükü ile performans arasında denge sağlamak için orta düzeyde sıkıştırma uygular.

Brotli Kullanımı

Eğer Brotli modülünü kurduysanız, onu çok daha iyi sıkıştırma oranları için kullanabilirsiniz:

brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/javascript application/json application/xml;

Brotli, CSS ve JavaScript gibi metin tabanlı varlıklar için özellikle etkilidir. Bu değişiklikleri yaptıktan sonra, uygulamak için Nginx'i yeniden yükleyin:

sudo systemctl reload nginx

Sıkıştırma etkinleştirildiğinde, kullanıcılar varlıkları daha hızlı indirir, bu da daha hızlı yükleme süreleri ve hem masaüstü hem de mobil cihazlarda iyileştirilmiş performans sağlar.

Nginx'te Önbellekleme Yapılandırma

Önbellekleme, sunucunuzun daha önce oluşturulmuş yanıtları yeniden kullanmasına olanak tanır ve her istekte bunları yeniden oluşturmak zorunda kalmaz. Bu, Node.js uygulamanız üzerindeki yükü önemli ölçüde azaltır ve son kullanıcılar için yanıt sürelerini hızlandırır.

Görüntüler, stil dosyaları ve betikler gibi statik varlıkları önbelleğe almak için, bu yapılandırmayı Nginx server bloğunuza ekleyin:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 7d;
    add_header Cache-Control "public, no-transform";
}

Bu yapılandırma, tarayıcılara statik varlıkları yedi gün boyunca önbelleğe almasını söyler. Statik dosyalarınızın ne sıklıkla değiştiğine bağlı olarak bu süreyi ayarlayabilirsiniz.

API'ler veya dinamik içerik için, önbellekleme daha seçici şekilde uygulanabilir. Örneğin, sık erişilen uç noktaların yanıtlarını önbelleğe alabilir, kullanıcıya özel veri döndüren uç noktaları hariç tutabilirsiniz. Nginx ayrıca yüksek trafikli API'ler için mikro önbellekleme (saniyeler bazında kısa süreli önbellekleme) desteği de sağlar.

Kayıt Tutma En İyi Uygulamaları

Kayıtlar, izleme, sorun giderme ve performans ayarlamaları için çok önemlidir. Hem PM2 hem de Nginx, sisteminizde neler olduğunu takip etmenize yardımcı olan kapsamlı kayıt araçları sunar.

PM2 Kayıtları

PM2 uygulama günlüklerinizi otomatik olarak yönetir. Bunları gerçek zamanlı olarak görmek için şunu kullanın:

pm2 logs

Zamanla, günlükler büyüyebilir ve disk alanını tüketebilir. Bunu önlemek için, PM2 günlük döndürme modülünü yükleyin:

pm2 install pm2-logrotate

Sonra döndürme politikasını yapılandırın:

pm2 set pm2-logrotate:max_size 10M

pm2 set pm2-logrotate:retain 7

Bu yapılandırma, her bir günlük dosyasını 10 MB'ın altında tutar ve yedi günlük logları saklar. Bu değerleri depolama kapasitenize ve loglama ihtiyaçlarınıza göre ayarlayabilirsiniz.

Nginx Günlükleri

Nginx, hem erişim günlüklerini (her isteğin kaydı) hem de hata günlüklerini (sorunlar ve hatalar hakkında bilgiler) tutar. Bu günlükler genellikle /var/log/nginx/ dizininde saklanır.

Erişim günlüklerini manuel olarak gözden geçirebilir veya goaccess gibi araçları kullanarak ayrıntılı bir trafik raporu oluşturabilirsiniz:

sudo apt install goaccess

sudo goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED

Bu komut, ziyaretçi konumları, trafik hacmi ve yanıt süreleri hakkında metrikler içeren etkileşimli bir HTML raporu oluşturur.

İyi yönetilen günlükler, kullanıcıları etkilemeden önce performans darboğazlarını, başarısız istekleri veya güvenlik anormalliklerini tespit etmek için kritik öneme sahiptir.

Kaynak Yönetimi ve Node.js Optimizasyonu

Node.js uygulamaları varsayılan olarak tek bir iş parçacığında çalışır. Tüm kullanılabilir CPU çekirdeklerinden faydalanmak ve eşzamanlılığı artırmak için kümeleme ve diğer işlem yönetim tekniklerini kullanabilirsiniz.

Kümeleme Kullan

PM2, çok çekirdekli CPU'lardan yararlanmak için birden fazla Node.js sürecini otomatik olarak başlatabilir:

pm2 start app.js -i max

Bu komut, sunucunuzdaki CPU çekirdekleri kadar uygulama örneğini başlatır. PM2, yük dengelemesini yönetir ve işlemler başarısız olursa yeniden başlatır.

Bellek ve CPU Kullanımını İzle

Bellek sızıntılarını veya aşırı CPU kullanımı durumlarını önlemek için uygulamanızın kaynak kullanımını düzenli olarak izleyin:

pm2 monit

Bu, her bir işlem için canlı bellek ve CPU metriklerini gösteren etkileşimli bir gösterge paneli açar.

Statik Varlıkları Nginx'e Taşı

Statik dosyaların Node.js üzerinden yönlendirilmesi yerine doğrudan Nginx tarafından sunulmasına izin verin. Bu, Node.js tarafındaki CPU kullanımını önemli ölçüde azaltır ve önbelleğe alınmış varlıkların daha hızlı teslim edilmesini sağlar.

Çevre Yapılandırması

Performans ayarlarını, örneğin log ayrıntı seviyesi, API hız sınırları veya önbellek süreleri gibi, ince ayarlamak için ortam değişkenlerini kullanın. Yapılandırmayı ortam değişkenleri aracılığıyla yönetmek, uygulamanızı esnek ve ölçeklenebilir hale getirir.

İzleme ve Metrikler

Üretim ortamınızı optimize ettikten sonra, bir sonraki önemli adım etkili izleme ve metrik toplama sistemlerini kurmaktır. İzleme, uygulamanızın performansı, kaynak kullanımı ve sistem sağlığı hakkında görünürlük sağlar. Sorunları erken tespit etmenize, uzun vadeli trendleri takip etmenize ve veri odaklı iyileştirmeler yapmanıza yardımcı olur.

Yerleşik araçlar ve harici hizmetleri kullanarak Node.js uygulamanızı, Nginx web sunucunuzu ve sistem kaynaklarınızı nasıl izleyebileceğinize bakalım.

Neden İzleme Önemlidir

Prodüksiyonda her saniye önemlidir. İzleme yapılmazsa, performans sorunları veya hizmet kesintileri kullanıcıları etkilemeden fark edilmez. İzleme, size yardımcı olur:

  • Arızaları hızlı bir şekilde tespit edin ve meydana geldiklerinde otomatik olarak sizi uyarın.
  • Farklı trafik yükleri altında sistem performansını analiz edin.
  • Yavaş uç noktaları, darboğazları veya bellek sızıntılarını tespit edin.
  • Bilgiye dayalı ölçeklendirme ve optimizasyon kararları alın.
  • Dağıtımlar arasında çalışma süresini ve güvenilirliği koruyun.

İyi tasarlanmış bir izleme düzeni, hem anlık uyarılar için gerçek zamanlı izlemeyi hem de zaman içindeki performans analizi için tarihsel metrikleri içerir.

PM2 ile Node.js Uygulamalarını İzleme

PM2, Node.js uygulamanızı çalıştırmak için kullanılan süreç yöneticisi, güçlü izleme özellikleri içerir.

Gerçek Zamanlı İzleme

Çalışan işlemlerin genel görünümünü almak için şunu kullanın:

pm2 list

Bu, tüm aktif uygulamaları durumları, çalışma süreleri, CPU ve bellek kullanımlarıyla birlikte gösterir. Daha ayrıntılı ve canlı bir görüntü için şunu kullanın:

pm2 monit

Bu, her işlem için CPU ve bellek kullanımı gibi temel performans göstergelerini gösteren etkileşimli bir kontrol paneli açar. Bu göstergeleri izlemek, kaynak tükenmesini, kontrolsüz çalışan işlemleri veya bellek sızıntılarını tespit etmenize yardımcı olur.

Günlük İzleme

PM2 ayrıca merkezi log yönetimi sağlar. Uygulama loglarınızı incelemek için şunu çalıştırın:

pm2 logs

Belirli bir uygulama için günlükleri şu şekilde görüntüleyebilirsiniz:

pm2 logs myapp

Sık sık yeniden başlatmalar fark ederseniz, PM2’nin işlem listesine şunla bakın:

pm2 status

Her bir sürecin kaç kez yeniden başlatıldığını gösterecek, bu da hata veya çökmelerin bir göstergesi olabilir.

Gelişmiş İzleme (PM2 Plus)

Daha büyük dağıtımlar için PM2, tüm sunuculardaki CPU kullanımı, bellek tüketimi ve uygulama çalışma süresi gibi metrikleri takip eden web tabanlı bir gösterge paneli olan PM2 Plus'ı sunar. Eşik değerlerinin aşılması durumunda uyarılar ayarlayabilir ve performans trendlerini zaman içinde görüntüleyebilirsiniz.

PM2, birleşik görünürlük için Datadog, New Relic ve Prometheus gibi popüler üçüncü taraf izleme sistemleriyle de entegre olabilir.

Nginx'i İzleme

Nginx, üretim yığınınızın önünde yer alır, HTTP isteklerini ve SSL sonlandırmayı yönetir. Nginx'i izlemek, kullanıcıların sisteminizle nasıl etkileşime girdiğini ve isteklerin ne kadar verimli işlendiğini anlamak için önemlidir.

Erişim ve Hata Kayıtları

Nginx, işlediği her isteği genellikle şu konumda bulunan erişim günlüğüne kaydeder:

/var/log/nginx/access.log

Hatalar ayrı olarak kaydedilir:

/var/log/nginx/error.log

Bu günlükleri gerçek zamanlı olarak inceleyebilirsiniz:

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

Erişim logları, istemci IP'leri, yanıt süreleri, durum kodları ve kullanıcı aracısı gibi değerli bilgiler gösterir. Bu loglar, yüksek gecikme, sık 404 hatası veya anormal istek hacimleri gibi kalıpları tespit etmek için faydalıdır.

Özetlenmiş ve görsel bir rapor için goaccess kullanabilirsiniz. Bu araç, trafik kaynaklarını, popüler uç noktaları ve yanıt dağılımını öne çıkaran etkileşimli bir kontrol paneli oluşturur.

Nginx Durum Sayfasını Etkinleştir

Nginx, mevcut bağlantılar ve istek sayılarını gibi canlı sunucu metriklerini gösteren hafif bir stub_status modülü içerir. Nginx yapılandırmanıza aşağıdaki bloğu ekleyin:

location /nginx_status {
    stub_status;
    allow 127.0.0.1;
    deny all;
}

Nginx'i yeniden yükledikten sonra, metrikleri görmek için şurayı ziyaret edebilirsiniz:

http://localhost/nginx_status

Bu metrikler, izleme panolarına entegre edilebilir veya otomatik uyarılar için kullanılabilir.

Node.js'ten Uygulama Metriklerini Toplama

Daha ayrıntılı uygulama düzeyinde izleme için özel metrikleri doğrudan Node.js uygulamanızdan toplayabilirsiniz. Bu metrikler API yanıt sürelerini, istek oranlarını veya veritabanı sorgu sürelerini takip edebilir.

Prometheus istemci kütüphanesini yüklemek için aşağıdaki komutu çalıştırın:

npm install prom-client express

Uygulamanıza bir /metrics uç noktası ekleyin:

const express = require('express');
const client = require('prom-client');
const app = express();

client.collectDefaultMetrics({ timeout: 5000 });

app.get('/metrics', async (req, res) => {
  res.set('Content-Type', client.register.contentType);
  res.end(await client.register.metrics());
});

app.listen(3000, () => {
  console.log('Metrics available at /metrics');
});

Bu uç noktayı, istek gecikmesi, bellek kullanımı ve çöp toplama performansı gibi metrikleri görselleştirmek için Prometheus veya Grafana'ya bağlayabilirsiniz.

Sistem Düzeyi İzleme

Uygulama izlemeye ek olarak, genel sunucu performansını da takip edin. Linux bu amaç için birkaç araç sağlar:

  • htop veya top: Gerçek zamanlı CPU ve bellek kullanımını gösterir.
  • iostat: Disk giriş/çıkış işlemlerini izler.
  • netstat veya ss: Açık ağ bağlantılarını gösterir.
  • vmstat: İşlemleri, belleği ve G/Ç istatistiklerini izler.

Altyapınız genelinde metrikleri toplayıp bunları panolarda görselleştiren Netdata, Glances veya Grafana Agent gibi araçları kullanarak sistem izlemeyi otomatikleştirebilirsiniz.

Yaygın Hatalar, Sorun Giderme ve En İyi Uygulamalar

İyi yapılandırılmış bir üretim ortamı bile zaman zaman sorunlarla karşılaşabilir. Bu sorunları tanımlamayı, teşhis etmeyi ve çözmeyi bilmek, güvenilirliği sürdürmek ve kesinti sürelerini en aza indirmek için önemlidir. Bu bölüm, yaygın hatalar için ayrıntılı sorun giderme adımlarını sağlar ve Node.js ortamınızı uzun vadede istikrarlı, güvenli ve sürdürülebilir tutmanıza yardımcı olacak en iyi uygulamaları özetler.

Yaygın Hatalar ve Çözümleri

1. Uygulama PM2 ile başlatılamıyor

  • Neden: Yanlış dosya yolları, eksik bağımlılıklar veya yanlış yapılandırılmış ortam değişkenleri.

  • Çözüm: Günlükleri şu şekilde kontrol edin:

    pm2 logs

    PM2 yapılandırmanızda doğru dosya yolunun kullanıldığını onaylayın. Gerekirse bağımlılıkları yeniden yükleyin:

    npm install --production

    Ayrıca, gerekli ortam değişkenlerinin .env dosyasından veya ekosistem dosyanızdan doğru şekilde yüklendiğini doğrulayın.

2. Bağlantı noktası zaten kullanımda hatası

  • Neden: Aynı portta başka bir süreç zaten dinliyor.

  • Çözüm: Çakışan işlemi tespit edin ve durdurun:

    sudo lsof -i :3000
    
    sudo kill -9 <PID>

    Alternatif olarak, .env dosyasındaki veya ekosistem yapılandırmasındaki uygulama portunuzu değiştirin.

3. Nginx 502 Bad Gateway

  • Neden: Nginx, Node.js uygulamasına ulaşamıyor; genellikle uygulama çöktüğü, durduğu veya farklı bir porta bağlı olduğu için.

  • Çözüm: Node.js uygulamasını yeniden başlatın ve Nginx'i yeniden yükleyin:

    pm2 restart all
    
    sudo systemctl reload nginx

    Nginx proxy_pass değerinin Node.js uygulamanızın dinleme adresiyle eşleştiğinden emin olun (örneğin, http://localhost:3000).

4. İzin reddedildi hataları

  • Neden: Uygulama kullanıcısının bazı dosya veya dizinleri okuma veya yazma izni yok.

  • Çözüm: Doğru sahipliği ve izinleri ayarlayın:

    sudo chown -R $USER:$USER /var/www/myapp
    
    sudo chmod -R 755 /var/www/myapp

    Node.js veya PM2'yi root kullanıcısı olarak çalıştırmaktan kaçının.

5. Certbot yenileme hatası

  • Neden: DNS sorunları, süresi dolmuş sertifikalar veya yanlış Nginx yapılandırması.

  • Çözüm: DNS kayıtlarının sunucunuza yönlendiğini doğrulayın ve yenilemeyi test edin:

    sudo certbot renew --dry-run

    Yenileme başarısız olursa, Nginx yapılandırmasını sözdizimi hataları için gözden geçirin:

    sudo nginx -t

    Ayrıntılı hatalar için /var/log/letsencrypt/ dizinindeki Certbot günlüklerini de kontrol edebilirsiniz.

6. Erişimi engelleyen güvenlik duvarı

  • Neden: UFW kuralları gelen HTTP veya HTTPS bağlantılarını engelliyor.

  • Çözüm: Nginx trafiğinin izinli olduğundan ve güvenlik duvarının aktif olduğundan emin olun:

    sudo ufw allow 'Nginx Full'
    
    sudo ufw enable
    
    sudo ufw status

Sorun Giderme İş Akışı

Sorunlar ortaya çıktığında, yapılandırılmış bir süreci izleyin:

  1. Günlükleri Kontrol Edin: Çoğu sorun burada hata izleri bıraktığı için önce PM2, Nginx ve sistem günlüklerini gözden geçirin.

  2. Hizmetleri Doğrula: Node.js, PM2 ve Nginx'in çalıştığını ve başlatmada etkin olduğunu doğrulayın:

    pm2 status
    
    systemctl status nginx
  3. Yapılandırma Dosyalarını Doğrulayın: Servisleri yeniden başlatmadan önce sözdizimi kontrolleri yapın:

    sudo nginx -t

    PM2 ekosistem dosyaları için JSON veya JavaScript formatını kontrol edin.

  4. Bağlantı Noktası Bağlamasını Kontrol Edin: Uygulamanızın beklenen bağlantı noktasında dinlediğinden emin olun:

    sudo netstat -tulnp | grep node
  5. Sistem Kaynaklarını İzleyin: CPU, bellek ve disk kullanımını kontrol etmek için htop veya pm2 monit gibi araçları kullanın. Aşırı yüklü sunucular yavaş yanıtlar veya çökme sorunlarına yol açabilir.

  6. Bağlantıyı Test Et: İstekleri simüle etmek ve uç noktalarınızın doğru yanıt verip vermediğini doğrulamak için curl kullanın:

    curl http://localhost:3000

Stabilite, Güvenlik ve Bakım İçin En İyi Uygulamalar

En iyi uygulamaları takip etmek, uygulamanızın büyüdükçe güvenilir, güvenli ve bakımı kolay kalmasını sağlar.

Güvenlik En İyi Uygulamaları

  • Sistemi güncel tutun: Node.js, PM2, Nginx ve Ubuntu paketlerini düzenli olarak şu şekilde güncelleyin:

    sudo apt update && sudo apt upgrade -y

    Bu, güvenlik yamalarının ve performans iyileştirmelerinin uygulanmasını sağlar.

  • Her yerde HTTPS kullanın: Her zaman Nginx yönlendirmeleri ve Certbot ile otomatik sertifika yenileme yoluyla HTTPS'i zorunlu kılın.

  • SSH erişimini kısıtlayın: Anahtara dayalı kimlik doğrulama kullanın, root girişlerini devre dışı bırakın ve SSH erişimini bilinen IP adresleriyle sınırlayın.

  • Root olmayan bir kullanıcı olarak çalıştırın: Bir güvenlik ihlali durumunda ayrıcalıkları sınırlamak için özel bir uygulama kullanıcısı kullanın.

  • Yığın izlerini ve hata detaylarını gizleyin: Kullanıcılara asla detaylı hata mesajları göstermeyin. Express veya diğer framework’leri hataları düzgün bir şekilde yönetmek için yapılandırın.

  • Bağımlılıkları düzenli olarak denetleyin: Şunu çalıştırın:

    npm audit

    ve savunmasız paketleri güncelleyin veya değiştirin.

Performans ve Kaynak Yönetimi

  • Kümelemeyi etkinleştir: Kullanılabilir CPU çekirdeklerinde birden fazla Node.js örneği çalıştırmak için PM2 kullanın:

    pm2 start app.js -i max
  • Önbelleği etkili bir şekilde kullanın: Sık erişilen veriler için önbellek katmanları (Redis veya bellek içi önbellekleme gibi) uygulayın.

  • Düzenli olarak izleyin: Performans trendlerini takip etmek için PM2 Plus, Grafana veya Prometheus ile panolar oluşturun.

  • Günlükleri optimize edin: Aşırı disk kullanımını önlemek ve yalnızca ilgili verileri tutmak için günlük döndürmeyi etkinleştirin.

  • Yanıtları sıkıştır: Daha hızlı teslimat için Nginx'te gzip veya Brotli sıkıştırmayı etkin tut.

Bakım ve İşletme

  • Yedeklemeleri otomatikleştirin: Uygulama verileriniz, yapılandırma dosyalarınız ve SSL sertifikalarınız için yedeklemeleri planlayın.
  • Versiyon kontrolü kullanın: Değişiklikleri zamanla takip edebilmek için yapılandırmaları ve betikleri bir Git deposunda saklayın.
  • Ortamınızı belgeleyin: Kurulumunuz, portlar, ortam değişkenleri ve dağıtım adımlarınız hakkında ayrıntılı dokümantasyon tutun.
  • Test ortamları kullanın: Güncellemeleri ve yapılandırma değişikliklerini üretim ortamına aktarmadan önce bir test sunucusunda deneyin.
  • Monitör çalışma süresi: Kesintileri hızlı bir şekilde tespit etmek için UptimeRobot, Pingdom veya StatusCake gibi dış çalışma süresi izleme araçlarını kullanın.
  • Ölçeklendirme planı: Trafik arttıkça, yük dengeleyiciler veya Docker ve Kubernetes gibi konteyner orkestrasyon araçlarıyla yatay ölçeklendirmeyi düşünün.
  • Düzenli denetimler planlayın: Güvenlik ayarlarını, performans metriklerini ve ortamlar arasındaki yapılandırma tutarlılığını periyodik olarak gözden geçirin.

Proaktif bir bakım stratejisi, sürekli izleme ve güvenlik ilkelerine sıkı uyum ile birleştirildiğinde, Node.js uygulamanızın üretimde yüksek performanslı, güvenilir ve dayanıklı kalmasını sağlar.

SSS

1. Ubuntu üzerinde bir Node.js uygulamasını üretim ortamına nasıl dağıtabilirim?

Üretime hazır bir uygulamayı dağıtmak için bu standart iş akışını takip edin. Uygulamayı doğrudan bir terminal oturumunda node index.js ile çalıştırmaktan kaçının, çünkü oturum kapandığında uygulama duracaktır.

İşte genel bir iş akışı:

  1. Sistemi Güncelle: sudo apt update && sudo apt upgrade komutunu çalıştırın.

  2. Root Olmayan Bir Kullanıcı Oluşturun: Uygulamanızı root olarak çalıştırmayın. Özel bir kullanıcı oluşturun (ör. deploy).

  3. Node.js'i Yükleyin: En son LTS sürümü için NodeSource ikili dağıtımlarını kullanın (varsayılan Ubuntu apt sürümünü kullanmayın çünkü genellikle güncel değildir).

    curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
    
    sudo apt-get install -y nodejs
  4. Klonla ve Kur: Node.js uygulamanızı içeren depoyu klonlayın, dizine gidin ve tam bağımlılık sürümlerini sağlamak için npm install yerine npm ci (temiz kurulum) çalıştırın.

  5. Ortam Değişkenleri: Gizli bilgiler (DB dizeleri, API anahtarları) için bir .env dosyası oluşturun.

  6. Bir İşlem Yöneticisi ile Başlayın: Terminali kapattığınızda duran node index.js komutunu çalıştırmak yerine, uygulamayı daemon olarak çalıştırmak için PM2'yi kullanın:

    sudo npm install -g pm2
    
    pm2 start app.js --name "my-production-app"
  7. Başlangıçta Kalıcılığı Sağlayın: Sunucu yeniden başlatılırsa bu uygulamayı tekrar başlatması için sunucuya bildirin:

    • Başlangıç Betiğini Oluştur: Öncelikle, PM2'den belirli işletim sisteminiz için başlangıç komutunu oluşturmasını isteyin (Ubuntu systemd kullanır).
    pm2 startup
    • Oluşturulan Komutu Çalıştırın: PM2'nin verdiği komutu kopyalayıp terminalinize yapıştırın. Şöyle bir şeye benzeyecektir: sudo env PATH=` PATH:/home/sammy/.nvm/versions/node/v24.11.1/bin /home/sammy/.nvm/versions/node/v24.11.1/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

    • İşlem Listesini Dondur: Başlatma sistemi aktif olduğuna göre, PM2’nin yeniden başlatmada hatırlaması için şu anda çalışan süreçlerinizi kaydedin.

    pm2 save

2. VPS üzerinde Node.js süreçlerini yönetmenin en iyi yolu nedir?

Bir Sanal Özel Sunucu (VPS) üzerinde Node.js süreçlerini yönetmek için endüstri standardı PM2'dir.

Doğrudan systemd kullanabilmenize rağmen, PM2 standart servis yöneticilerinde bulunmayan ve Node.js için özel olarak tasarlanmış özellikler sunar, örneğin:

  • Otomatik Yeniden Başlatma: Uygulama çökerse yeniden başlatır.
  • Küme Modu: Kodunuzu değiştirmeden tüm CPU çekirdeklerini kullanır.
  • İzleme: RAM/CPU kullanımını kontrol etmek için yerleşik komutlar (pm2 monit).
  • Günlük Yönetimi: Disk şişmesini önlemek için günlükleri otomatik olarak döndürür.

3. Node.js'i üretimde kullanırken PM2 mi yoksa systemd mi kullanmalıyım?

En iyi uygulama her ikisini de kullanmaktır.

Uygulamayı yönetmek için PM2'yi, PM2'yi yönetmek için ise Systemd'yi kullanmalısınız. Sadece PM2 kullanırsanız, sunucu yeniden başlatıldığında uygulamanız kaybolur.

Onları birleştirmenin yolları:

  1. Uygulamanızı PM2 ile başlatın: pm2 start app.js
  2. Systemd başlatma betiğini oluşturun: pm2 startup
  3. PM2'nin çıktısını çalıştırın (bu, Ubuntu’nun systemd’sine PM2’yi başlatmada talimat verir).
  4. İşlem listesini kaydet: pm2 save

4. Node.js için ters proxy olarak Nginx'i nasıl kullanabilirim?

Node.js uygulama mantığını yönetmede mükemmeldir, ancak SSL, statik dosyalar ve yük dengeleme konusunda Nginx’e kıyasla zayıftır.

Kurulum:

  1. Nginx'i yükleyin: sudo apt install nginx.
  2. Nginx'i 80 numaralı portta dinleyecek şekilde yapılandırın ve trafiği Node uygulamanıza iletin (genellikle localhost:3000 üzerinde çalışır).

Örnek Yapılandırma (/etc/nginx/sites-available/default):

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://localhost:3000; # Forward to Node
        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;
    }
}

Kaydettikten sonra, yapılandırmayı sudo nginx -t ile test edin ve Nginx'i yeniden başlatın.

5. Node.js için Nginx ile HTTPS'i nasıl etkinleştirebilirim?

HTTPS işlemlerini Node.js uygulama mantığınızın içinde yapmayın. Şifreleme/şifre çözmeyi (SSL Sonlandırma) Nginx'e bırakın.

En Kolay Yöntem (Certbot):

  1. Certbot'u yükleyin: sudo apt install certbot python3-certbot-nginx

  2. Otomatik üreticiyi çalıştır:

    sudo certbot --nginx -d your_domain.com
  3. Certbot, HTTPS'yi etkinleştirmek ve sertifikayı otomatik olarak yenilemek için bir cron işi ayarlamak amacıyla Nginx yapılandırma dosyanızı otomatik olarak düzenleyecektir.

6. Node.js uygulamamı Ubuntu üzerinde nasıl güvence altına alabilirim?

Güvenlik, katmanlı bir yaklaşım gerektirir.

  • İşletim Sistemi Seviyesi:

    • UFW Güvenlik Duvarı: Güvenlik duvarını etkinleştirin ve yalnızca gerekli olan portlara izin verin.

      sudo ufw allow ssh
      
      sudo ufw allow 'Nginx Full'
      
      sudo ufw enable
    • SSH Sertleştirme: Şifre ile girişleri devre dışı bırakın ve yalnızca SSH anahtarlarını kullanın.

  • Uygulama Seviyesi:

    • Root Olmayan Kullanıcı Olarak Çalıştır: Soru 1'de belirtildiği gibi, eğer bir saldırgan bir root sürecini ele geçirirse, sunucunun kontrolü onlara geçer.
    • Helmet.js: Bu ara yazılımı uygulamanıza yükleyin (npm install helmet) ve güvenli HTTP başlıklarını otomatik olarak ayarlayın.
    • Portları açmayın: Node uygulamanızın direkt internetten erişilememesi için localhost (127.0.0.1) üzerinde çalışmasını sağlayın ve trafiğin Nginx üzerinden gitmesini zorunlu kılın.

Özet

Artık Ubuntu üzerinde Node.js uygulamanız için eksiksiz bir üretim ortamı kurdunuz. Node.js PM2 altında çalışırken, Nginx web trafiğini yönetirken, Let’s Encrypt ile SSL şifrelemesi sağlanırken ve UFW ağınızı korurken, sunucunuz istikrarlı, güvenli ve gerçek dünya kullanımı için hazırdır. Önbellekleme, sıkıştırma ve uygun izleme ekleyerek, iyi performans gösteren ve bakımı kolay bir sistem kurmuş oldunuz. Bu kurulum, uygulamanızı büyütmek için sağlam bir temel sunar; bu, sunucular arasında ölçeklendirme yapmak, dağıtımları otomatikleştirmek veya ilerleyen aşamalarda daha gelişmiş araçlar eklemek anlamına gelebilir.

Node.js ile ilgili daha fazla eğitim için aşağıdaki makalelere göz atın:

  • Ubuntu'ya Node.js Nasıl Kurulur (Adım Adım Rehber)
  • Ubuntu 20.04 Üzerinde Node.js ile PostgreSQL Nasıl Kullanılır

Linux-Console.net Topluluğu ile öğrenme sürecine katıldığınız için teşekkürler.