Node.js uygulamaları

Node.js, PHP'nizin yanında geliştirilir ve çalıştırılır.

Node ile API'ler, sunucuda işlenen siteler, gerçek zamanlı servisler ve worker'lar geliştiriyor, bunları PHP sitelerinizle aynı sunucularda, tek bir Nginx arkasında çalıştırıyoruz.

Üzerinde çalışır ve şununla geliştirilir
  • Node.js
  • Express
  • npm
  • NGINX
  • MySQL
  • PostgreSQL
  • Redis

Node ile neler geliştiriyoruz

Beş tür iş; her biri burada, çünkü Node ona uygun.

  1. 01

    Express

    Küçük ve doğrudan API'ler ve arka uçlar: birkaç rota, açık ara katmanlar, gizli hiçbir şey yok.

    API'ler ve arka uçlar
  2. 02

    NestJS

    Modüller, bağımlılık enjeksiyonu ve TypeScript'te tipli sözleşmelerle daha büyük servisler; bir ekibin yıllarca büyüteceği kod için.

    Yapılandırılmış servisler
  3. 03

    Next.js · Nuxt

    React ve Vue için sunucu tarafında işleme: sayfalar arama motorlarına ve hızlı bir ilk görünüme hazır gelir, ardından bir uygulama gibi davranır.

    Sunucuda işlenen siteler
  4. 04

    Socket.IO · WebSockets

    Bir şey değiştiği anda güncellenen sohbet, bildirimler, canlı paneller ve takip; tek bir açık bağlantı üzerinden.

    Gerçek zamanlı
  5. 05

    Worker'lar ve kuyruklar

    Yavaş işi isteğin dışında tutan arka plan işleri, zamanlanmış görevler ve Redis üzerinde kuyruk tüketicileri.

    Arka plan işleri

Node beklemede neden iyidir

Bir Node süreci JavaScript kodunuzu tek bir iş parçacığında çalıştırır ve beklemeyi - disk, ağ, veritabanı - sisteme bırakır. Tek bir süreç bu sayede aynı anda çok sayıda bağlantıyı açık tutar.

Node.js olay döngüsü, sadeleştirilmiş hâliyle
  1. Kodunuz çağrı yığınında, her seferinde tek bir fonksiyon olarak çalışır.
  2. Yavaş iş iş parçacığından çıkar: dosyalar, DNS ve özetleme libuv havuzuna gider, soketleri ise işletim sistemi izler.
  3. İş bittiğinde geri çağrısı görev kuyruğunda bekler.
  4. Bir sonraki görevden önce mikro görev kuyruğundaki tüm promise geri çağrıları çalışır.
  5. Döngü aşamalarından geçer ve bir sonraki görevi alır.

Tek sunucuda PHP ve Node

Nginx her isteği karşılar ve her yolu ona sahip olan sürece gönderir. PHP siteniz ve Node servisiniz makineyi, veritabanını ve sertifikayı paylaşır - birbirlerinin belleğini değil.

İkisini birlikte çalıştıran bir sunucu örneği

Hangi iş için hangisi

İkisiyle de geliştiriyoruz; bu yüzden cevap alışkanlıktan değil, işin kendisinden gelir.

PHP'yi seçin, eğer

  • Site çoğunlukla sayfalar, formlar ve bir yönetim panelinden oluşuyorsa: mağazalar, içerik siteleri, iş sistemleri.
  • WordPress, WooCommerce ya da Laravel'i ve onlar için hazırlanmış her şeyi istiyorsanız.
  • Her istek kendi başına duruyor ve hızla bitiyorsa.
  • Bakımını yapacak kişiler PHP'yi zaten biliyorsa.

Node'u seçin, eğer

  • Bağlantılar açık kalıyorsa: sohbet, canlı paneller, bildirimler, takip.
  • React ya da Vue sayfaları Next.js veya Nuxt ile sunucuda işleniyorsa.
  • Servis çoğunlukla başka API'leri bekliyor ve veriyi akış hâlinde aktarıyorsa.
  • Tarayıcıda ve sunucuda tek bir dil ekibinizin işine yarıyorsa.

Çoğu zaman cevap: ikisi birden

Siteyi, mağazayı ve yönetim panelini PHP üstlenir; yanında küçük bir Node servisi canlı kısmı alır. İkisi de aynı veritabanını okur ve aynı Nginx'in arkasında durur.

Boşluksuz sürümler

Yeni sürüm eskisinin yanında başlar, sağlıklı olduğunu kanıtlar ve ancak ondan sonra trafiği devralır. Eski worker'lar durmadan önce ellerindeki istekleri bitirir.

  • Hizmet verilen ziyaretçiler
  • Mevcut sürüm
  • Yeni sürüm
  1. 01

    Çek ve kur

    git pull && npm ci

    Kilit dosyasındaki sürümlerin tam kendisi; sürpriz bir yeni sürüm yok.

  2. 02

    Derle

    npm run build

    Hiçbir şey yeniden başlamadan önce TypeScript ve varlıklar derlenir.

  3. 03

    Eskinin yanında başlat

    pm2 reload app

    Yeni sürüm, hâlâ hizmet veren sürümün yanında açılır.

  4. 04

    Hazır olana kadar bekle

    wait_ready: true

    Bir ziyaretçi almadan önce sağlık kontrolüne yanıt vermesi gerekir.

  5. 05

    Trafiği devral

    cluster → new workers

    Yeni bağlantılar yeni sürüme gider.

  6. 06

    Eskiyi boşalt

    SIGINT → server.close()

    Eski worker'lar ellerindeki istekleri bitirir, sonra kapanır.

Yeni sürüm sağlık kontrolünü geçemezse hiç trafik almaz: eski sürüm hizmet vermeye devam eder.

Kodun etrafındaki sunucu

Bir Node servisini ayakta tutan her şey sunucuda, bakımını yaptığımız ve sizin de okuyabileceğiniz dosyalarda yazılıdır.

  • /etc/nginx/sites-enabled/app.conf

    Ters vekil sunucu

    Her sürecin önünde TLS, sıkıştırma, önbelleğe alınmış statik dosyalar ve WebSocket yükseltmeleri.

  • /srv/app/ecosystem.config.js

    Süreç yöneticisi

    PM2 süreci ayakta tutar, çökerse yeniden başlatır ve küme modunda her çekirdeği kullanır. Tek bir sürecin yettiği yerde aynı işi bir systemd birimi görür.

  • /srv/app/.env (0600)

    Ortam ve gizli bilgiler

    Anahtarlar ve parolalar kodun ve git'in dışında durur; yalnızca uygulamanın kendi kullanıcısı okuyabilir.

  • /srv/app/package-lock.json

    Bağımlılık denetimi

    Her sürümde npm audit; yükseltmeler canlıya ulaşmadan önce okunur ve test edilir.

  • /srv/app/.nvmrc

    Node LTS sürüm yükseltmeleri

    Uygulama Uzun Süreli Destek sürümünde çalışır ve eski sürümün desteği bitmeden onu bir sonrakine taşırız.

  • /var/log/app/

    Günlükler ve izleme

    Döndürülen yapılandırılmış günlükler; süreç yeniden başladığında, bellek tırmandığında ya da hatalar arttığında bir uyarı.

Her Node hizmetinin arkasındaki dört sayı

Her sayı, kendi ölçümlerimizden değil Node.js, libuv veya WebSocket belgelerinden gelir; kaynağında kontrol edebilirsiniz.

  • 30ay

    her Node.js LTS sürümü için düzeltme: 12 ay etkin destek, ardından 18 ay bakım.

    Kaynak: Node.js Release Working Group

  • 4iş parçacığı

    libuv havuzunda varsayılan olarak bulunur; dosyalar, DNS ve karma işlemleri içindir. Bir ayar havuzu 1024'e kadar çıkarabilir.

    Kaynak: libuv belgeleri

  • 101durum kodu

    bir sunucunun, isteğin WebSocket'e geçirilmesine verdiği yanıttır: Switching Protocols.

    Kaynak: RFC 6455

  • 443bağlantı noktası

    güvenli bir WebSocket'in varsayılan olarak bağlandığı noktadır, HTTPS ile aynıdır; bu yüzden tek Nginx girişi ikisini de taşır.

    Kaynak: RFC 6455

Bir Node hizmeti neler yapabilir, tek bakışta

Yetenekler dört grupta: neyi sunar, neyi devreder, verisini nerede tutar ve nasıl ayakta kalır.

Kur ve sun

  • HTTP ve REST API'leri

    Tek başına Express ya da varsayılan olarak Express üzerinde çalışan ve isterseniz Fastify kullanabilen NestJS.

  • TypeScript

    Modüller arasında tür denetimli sözleşmeler; kod derlenirken, herhangi bir şey yeniden başlamadan önce denetlenir.

  • Sunucuda oluşturma

    Next.js ve Nuxt sayfaları sunucuda oluşturur; arama motoru da ilk kez gelen ziyaretçi de hazır HTML alır.

  • Gerçek zamanlı

    Socket.IO düz HTTP ile başlar ve WebSocket'e yükselir; bir vekil sunucunun WebSocket'i engellediği yerde de bağlanır ve kendiliğinden yeniden bağlanır.

Ağır işi devret

  • Worker thread'ler

    İşlemciyi yoran JavaScript kendi iş parçacıklarında çalışır ve istek döngüsünü serbest bırakır. Hesaplamaya yardım eder, G/Ç beklemeye değil.

  • Redis üzerinde kuyruklar

    Yavaş işler kuyruğa alınır ve ziyaretçinin isteğinden uzakta, arka planda tamamlanır.

  • Zamanlanmış görevler

    Bir ziyaretçinin tetiklemesini beklemek yerine belirli saatlerde çalışan işler.

  • Cluster kipi

    PM2 her çekirdek için bir işçi çalıştırır; yoğun bir hizmet makinenin yalnızca bir iş parçacığını değil tamamını kullanır.

Veriyi yakın tut

  • MySQL ve PostgreSQL

    Node hizmeti ve PHP sitesi aynı veritabanını okuyabilir.

  • Redis

    Oturumlar, önbellek ve kuyruklar bellekte; iki çalışma ortamı tarafından ortak kullanılır.

  • Statik dosyalar

    Nginx CSS, görsel ve indirmeleri doğrudan diskten sunar; Node yalnızca kod gerektiren işi üstlenir.

  • Tek yedekleme planı

    Tek bir yedekleme planı PHP sitesini ve Node hizmetini birlikte kapsar.

Ayakta kal, güncel kal

  • Çökünce yeniden başlatma

    PM2, ya da tek işlemin yettiği yerde bir systemd birimi, çöken işlemi geri getirir.

  • Kesintisiz yeniden yükleme

    Yeni sürüm, trafiği almadan önce sağlık denetiminden geçer.

  • Günlükler ve uyarılar

    Yapılandırılmış, döndürülen günlükler ve işlem yeniden başladığında, bellek yükseldiğinde ya da hatalar arttığında bir uyarı.

  • LTS ve denetimler

    Uzun süreli destekli bir Node sürümü, her sürümde npm audit ve kodun dışında tutulan gizli anahtarlar.

Node uygulamanızın ne yapması gerektiğini bize anlatın

Yeni bir servis, bir Next.js sitesi ya da bir yerde zaten çalışan ve düzgün bir yuvaya ihtiyaç duyan bir uygulama. İnceleyip kısa bir görüşmenin ardından teklif veriyoruz.

MickeySaniyeler içinde yanıtlar