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.
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.
-
01
Express
API dan back end yang kecil dan lugas: sedikit route, middleware yang jelas, tidak ada yang tersembunyi.
API dan back end -
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 -
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 -
04
Socket.IO · WebSockets
Chat, notifikasi, dasbor langsung, dan pelacakan yang diperbarui saat itu juga ketika sesuatu berubah, melalui satu koneksi terbuka.
Real-time -
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.
- Kode Anda berjalan di call stack, satu fungsi dalam satu waktu.
- Pekerjaan lambat meninggalkan thread: file, DNS, dan hashing masuk ke pool libuv, sedangkan socket diawasi oleh sistem operasi.
- Saat pekerjaan selesai, callback-nya menunggu di antrean task.
- Sebelum task berikutnya, semua callback promise di antrean microtask dijalankan.
- 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.
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
-
01
Ambil dan pasang
git pull && npm ciVersi persis dari lockfile, tidak ada versi lebih baru yang datang tiba-tiba.
-
02
Build
npm run buildTypeScript dan aset dikompilasi sebelum apa pun dimulai ulang.
-
03
Jalankan di samping yang lama
pm2 reload appRilis baru menyala di samping rilis yang masih melayani.
-
04
Tunggu sampai siap
wait_ready: trueRilis itu harus lolos health check sebelum menerima pengunjung.
-
05
Ambil alih trafik
cluster → new workersKoneksi baru diarahkan ke rilis baru.
-
06
Kosongkan yang lama
SIGINT → server.close()Worker lama menyelesaikan request yang sedang ditangani, lalu berhenti.
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.confReverse proxy
TLS, kompresi, file statis yang di-cache, dan upgrade WebSocket, di depan setiap proses.
-
/srv/app/ecosystem.config.jsPengelola 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.jsonAudit dependensi
npm audit di setiap rilis; upgrade dibaca dan diuji sebelum sampai ke produksi.
-
/srv/app/.nvmrcUpgrade 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.