Aplikasi Node.js

Node.js, dibangun dan dijalankan di samping PHP Anda.

Kami membangun API, situs yang dirender di server, layanan real-time, dan worker dengan Node, lalu menjalankannya di server yang sama dengan situs PHP Anda, di belakang satu Nginx.

Yang kami bangun dengan Node

Lima jenis pekerjaan, masing-masing ada di sini karena cocok untuk Node.

  1. 01

    Express

    API dan back end yang kecil dan lugas: sedikit route, middleware yang jelas, tidak ada yang tersembunyi.

    API dan back end
  2. 02

    NestJS

    Layanan yang lebih besar dengan modul, dependency injection, dan kontrak bertipe di TypeScript, untuk kode yang akan dikembangkan sebuah tim selama bertahun-tahun.

    Layanan terstruktur
  3. 03

    Next.js · Nuxt

    Rendering sisi server untuk React dan Vue: halaman tiba dalam keadaan siap untuk mesin pencari dan tampilan pertama yang cepat, lalu berperilaku seperti aplikasi.

    Situs yang dirender di server
  4. 04

    Socket.IO · WebSockets

    Chat, notifikasi, dasbor langsung, dan pelacakan yang diperbarui saat itu juga ketika sesuatu berubah, melalui satu koneksi terbuka.

    Real-time
  5. 05

    Worker dan antrean

    Pekerjaan latar belakang, tugas terjadwal, dan konsumen antrean di Redis yang menjauhkan pekerjaan lambat dari request.

    Pekerjaan latar belakang

Mengapa Node pandai menunggu

Proses Node menjalankan JavaScript Anda di satu thread dan menyerahkan urusan menunggu - disk, jaringan, database - kepada sistem. Dengan cara itulah satu proses menjaga banyak koneksi tetap terbuka sekaligus.

Event loop Node.js, disederhanakan
  1. Kode Anda berjalan di call stack, satu fungsi dalam satu waktu.
  2. Pekerjaan lambat meninggalkan thread: file, DNS, dan hashing masuk ke pool libuv, sedangkan socket diawasi oleh sistem operasi.
  3. Saat pekerjaan selesai, callback-nya menunggu di antrean task.
  4. Sebelum task berikutnya, semua callback promise di antrean microtask dijalankan.
  5. Loop berputar melewati fase-fasenya dan mengambil task berikutnya.

PHP dan Node di satu server

Nginx menjawab setiap request dan mengirim setiap path ke proses yang menanganinya. Situs PHP dan layanan Node Anda berbagi mesin, database, dan sertifikat - bukan memori satu sama lain.

Contoh satu server yang menjalankan keduanya

Mana untuk pekerjaan apa

Kami membangun dengan keduanya, jadi jawabannya datang dari pekerjaannya, bukan dari kebiasaan.

Pilih PHP jika

  • Situs sebagian besar berisi halaman, formulir, dan panel admin: toko, situs konten, sistem bisnis.
  • Anda menginginkan WordPress, WooCommerce, atau Laravel beserta semua yang sudah dibuat untuknya.
  • Setiap request berdiri sendiri dan selesai dengan cepat.
  • Orang yang akan merawatnya sudah menguasai PHP.

Pilih Node jika

  • Koneksi tetap terbuka: chat, dasbor langsung, notifikasi, pelacakan.
  • Halaman React atau Vue dirender di server dengan Next.js atau Nuxt.
  • Layanan lebih banyak menunggu API lain dan mengalirkan data.
  • Satu bahasa di browser dan di server membantu tim Anda.

Sering kali jawabannya: keduanya

PHP memegang situs, toko, dan panel admin; layanan Node kecil di sampingnya menangani bagian real-time. Keduanya membaca database yang sama dan berada di belakang Nginx yang sama.

Rilis tanpa jeda

Rilis baru dimulai di samping yang lama, membuktikan dirinya sehat, dan baru kemudian mengambil alih trafik. Worker lama menyelesaikan request yang sudah mereka tangani sebelum berhenti.

  • Pengunjung dilayani
  • Rilis saat ini
  • Rilis baru
  1. 01

    Ambil dan pasang

    git pull && npm ci

    Versi persis dari lockfile, tidak ada versi lebih baru yang datang tiba-tiba.

  2. 02

    Build

    npm run build

    TypeScript dan aset dikompilasi sebelum apa pun dimulai ulang.

  3. 03

    Jalankan di samping yang lama

    pm2 reload app

    Rilis baru menyala di samping rilis yang masih melayani.

  4. 04

    Tunggu sampai siap

    wait_ready: true

    Rilis itu harus lolos health check sebelum menerima pengunjung.

  5. 05

    Ambil alih trafik

    cluster → new workers

    Koneksi baru diarahkan ke rilis baru.

  6. 06

    Kosongkan yang lama

    SIGINT → server.close()

    Worker lama menyelesaikan request yang sedang ditangani, lalu berhenti.

Jika rilis baru gagal dalam health check, rilis itu tidak pernah menerima trafik: rilis lama tetap melayani seperti biasa.

Server di sekitar kode

Segala yang menjaga layanan Node tetap berjalan tertulis di server, dalam file yang kami rawat dan dapat Anda baca.

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

    Reverse proxy

    TLS, kompresi, file statis yang di-cache, dan upgrade WebSocket, di depan setiap proses.

  • /srv/app/ecosystem.config.js

    Pengelola proses

    PM2 menjaga proses tetap hidup, memulai ulang jika crash, dan memakai setiap core dalam mode cluster. Bila satu proses sudah cukup, unit systemd melakukan pekerjaan yang sama.

  • /srv/app/.env (0600)

    Environment dan rahasia

    Kunci dan kata sandi disimpan di luar kode dan di luar git, hanya dapat dibaca oleh pengguna milik aplikasi itu sendiri.

  • /srv/app/package-lock.json

    Audit dependensi

    npm audit di setiap rilis; upgrade dibaca dan diuji sebelum sampai ke produksi.

  • /srv/app/.nvmrc

    Upgrade antarversi Node LTS

    Aplikasi berjalan di rilis Long Term Support, dan kami memindahkannya ke rilis berikutnya sebelum dukungan rilis lama berakhir.

  • /var/log/app/

    Log dan pemantauan

    Log terstruktur yang dirotasi, dengan peringatan saat proses dimulai ulang, memori naik, atau error bertambah.

Ceritakan apa yang harus dikerjakan aplikasi Node Anda

Layanan baru, situs Next.js, atau aplikasi yang sudah berjalan di suatu tempat dan membutuhkan rumah yang layak. Kami meninjaunya dan memberikan penawaran setelah percakapan singkat.