Categories
NGINX Node JS

Server Web dengan Node JS + NGINX

Salah satu kelebihan Node JS daripada PHP yang menjadi favorit saya adalah sifatnya yang asynchronous, yaitu proses akan tetap dilakukan meski terdapat jeda pada beberapa blok kode. Sifat seperti ini dapat menimbulkan persepsi respon lebih cepat, meski untuk proses yang tertunda tetap akan diselesaikan belakangan. Dan apabila terjadi masalah pada blok kode yang tertunda, maka respon tetap akan terkirim tanpa menunggu proses yang bermasalah selesai.

Pada dasarnya Node JS sudah memiliki built-in server web, sehingga kita dapat membuat banyak server web di dalam sebuah sistem operasi (Windows / Linux / Mac OS), tentunya dengan port yang harus berbeda satu sama lain. Tentunya tergantung dari tujuan kita membuatnya. Kalau saya sendiri karena ingin mudah mengontrol setiap modul berdasarkan peruntukannya, misal modul untuk pelanggan, transaksi, marketing, dan lainnya.

NGINX saya butuhkan untuk menerjemahkan sebuah domain maupun path tertentu untuk diteruskan ke server web yang diproduksi oleh Node JS, sebagai contoh:
http://domain.xyz/ ke server http://localhost:3000/
http://domain.xyz/pathsatu ke server http://localhost:3001/

Untuk membuat server web simpel Node JS, dapat menggunakan contoh yang diberikan oleh dokumentasinya.

const http = require('http');

const hostname = '127.0.0.1';
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}/`);
});

Simpan skrip di atas dengan nama file index.js atau apapun yang kita sukai.

Penjelasan setiap barisnya:

const http = require('http');

Menentukan variabel konstanta http dengan nilai dari modul yang bernama http. Modul http merupakan modul built-in yang berarti kita tidak perlu melakukan pengunduhan maupun instalasi pada modul tersebut. Pada Node JS versi 6 ke atas jika saya tidak keliru penentuan variabel menggunakan const dan let (sebelumnya menggunakan var, meski var masih tetap bisa digunakan). Untuk sintaks let digunakan untuk menginisialisasi sebuah variabel yang akan diubah. Sedangkan const menentukan nilai variabel yang tidak akan diubah.

const hostname = '127.0.0.1';
const port = 3000;

Menentukan konstanta hostname dengan nilai string ‘127.0.0.1’ dan konstanta port dengan nilai number 3000. Keduanya akan digunakan sebagai jalur listening server web yang akan dibuat.

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

Menentukan konstanta server dengan nilai sebuah fungsi callback dari modul dari http yang akan mengeksekusi respon kepada pengakses server dengan kode status 200 yang berarti berhasil, seluruh status kode dapat dilihat di wikipedia. Kemudian kita tentukan header Content-Type dengan nilai ‘text/plain’, dan body yang diberikan adalah ‘Hello, World!’

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

Menentukan modul server dengan callback listen yang membutuhkan parameter port dan hostname. Callback ini untuk mengantifkan proses listening jalur tersebut untuk diakses oleh NGINX.

Setelah selesai, untuk menjalankannya ketik: node [nama file] dari terminal / console / command prompt. Dalam kasus sekarang ketik node index.js [Enter].

Jokos-Mac:~ joko$ node index.js
Server running at http://127.0.0.1:3000/

Biasanya saya lebih suka menggunakan pm2 (https://pm2.keymetrics.io/) untuk menjalankan server Node JS di background. Kita dapat melakukan monitoring dengan perintah pm2 log [nama service].

Dilihat dari Browser

Pada file konfigurasi di NGINX pada blok server bisa menggunakan baris-baris berikut:

server {
    server_name domain.xyz;
    access_log  /var/log/nginx/domain.xyz-access.log;
    error_log  /var/log/nginx/domain-xyz-error.log;

    location / {
        add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
        expires off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_pass http://localhost:3000;
    }

    listen 80;
}

Yang perlu diperhatikan dari file konfigurasi NGINX di atas adalah baris:

proxy_pass http://localhost:3000

Sehingga setiap terdapat pengaksesan pada url http://domain.xyz maka akan diteruskan ke server Node JS yang telah dibuat sebelumnya.

Leave a Reply

Your email address will not be published. Required fields are marked *