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.

Berjalan di dan dibuat dengan
  • Node.js
  • Express
  • npm
  • NGINX
  • MySQL
  • PostgreSQL
  • Redis

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.

Empat angka di balik setiap layanan Node

Setiap angka berasal dari dokumentasi Node.js, libuv, atau WebSocket, bukan dari pengukuran kami sendiri, sehingga Anda bisa memeriksanya langsung di sumbernya.

  • 30bulan

    perbaikan untuk setiap rilis LTS Node.js: 12 bulan dukungan aktif, lalu 18 bulan pemeliharaan.

    Sumber: Node.js Release Working Group

  • 4thread

    di kolam libuv secara bawaan, untuk berkas, DNS, dan hashing. Satu pengaturan dapat menaikkan kolam hingga 1024.

    Sumber: dokumentasi libuv

  • 101kode status

    adalah cara server menjawab permintaan untuk beralih ke WebSocket: Switching Protocols.

    Sumber: RFC 6455

  • 443port

    adalah port tempat WebSocket aman terhubung secara bawaan, sama dengan HTTPS, sehingga satu pintu masuk Nginx membawa keduanya.

    Sumber: RFC 6455

Apa yang bisa dilakukan layanan Node, sekilas

Kemampuannya dalam empat kelompok: apa yang dilayani, apa yang dilimpahkan, di mana datanya disimpan, dan bagaimana layanan tetap hidup.

Membangun dan melayani

  • API HTTP dan REST

    Express saja, atau NestJS yang secara bawaan berjalan di atas Express dan bisa memakai Fastify sebagai gantinya.

  • TypeScript

    Kontrak bertipe antarmodul, diperiksa saat kode dibangun, sebelum apa pun dimulai ulang.

  • Render di server

    Next.js dan Nuxt merender halaman di server, sehingga mesin pencari dan pengunjung pertama sama-sama menerima HTML yang sudah jadi.

  • Real-time

    Socket.IO dimulai lewat HTTP biasa lalu naik ke WebSocket, sehingga tetap tersambung di tempat proxy memblokir WebSocket, dan menyambung ulang dengan sendirinya.

Melimpahkan kerja berat

  • Worker thread

    JavaScript yang berat di prosesor berjalan di thread-nya sendiri dan membiarkan loop permintaan tetap lapang. Membantu untuk perhitungan, bukan untuk menunggu I/O.

  • Antrean di Redis

    Pekerjaan lambat dimasukkan ke antrean dan diselesaikan di latar belakang, jauh dari permintaan pengunjung.

  • Tugas terjadwal

    Pekerjaan yang berjalan pada waktu tertentu, bukan menunggu pengunjung memicunya.

  • Mode cluster

    PM2 menjalankan satu worker per inti, sehingga layanan yang sibuk memakai seluruh mesin, bukan hanya satu thread.

Data tetap dekat

  • MySQL dan PostgreSQL

    Layanan Node dan situs PHP dapat membaca database yang sama.

  • Redis

    Sesi, cache, dan antrean di memori, dipakai bersama oleh kedua runtime.

  • Berkas statis

    Nginx menyajikan CSS, gambar, dan unduhan langsung dari disk, sehingga Node hanya menangani yang membutuhkan kode.

  • Satu rencana cadangan

    Satu rencana cadangan mencakup situs PHP dan layanan Node sekaligus.

Tetap hidup dan mutakhir

  • Mulai ulang saat gagal

    PM2, atau unit systemd bila satu proses sudah cukup, menghidupkan kembali proses yang mati.

  • Muat ulang tanpa jeda

    Rilis baru lolos pemeriksaan kesehatannya sebelum menerima lalu lintas.

  • Log dan peringatan

    Log terstruktur yang dirotasi, dan peringatan saat proses dimulai ulang, memori naik, atau galat meningkat.

  • LTS dan audit

    Rilis Node dengan dukungan jangka panjang, npm audit di setiap rilis, dan rahasia yang disimpan di luar kode.

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.

MickeyMenjawab dalam hitungan detik