Nur Hamim
Nur Hamim Anak desa yang gemar berkomunitas, suka menulis dan mencari hal baru seputar Unix/Linux dan Cloud. Saat ini sedang menempuh pendidikan S1 TI di Unindra dan kebetulan bekerja di PT Biznet GIO Nusantara

Cara Menggunakan Nginx Reverse Proxy Untuk Server Node.js


Cara Menggunakan Nginx Reverse Proxy Untuk Server Node.js

Belajar Linux ID - Pada tutorial sebelumnya kita sudah belajar bagaimana cara melakukan instalasi Node.js di Ubuntu 22.04 LTS dan pada tutorial kali kami akan mencoba bagaimana menggunakan nginx reverse proxy untuk node.js server.

Pengenalan

Mungkin kita semua sudah tahu apa itu Nginx. Yaaaaa. Nginx adalah salah satu web server yang powerfull dan berbasis open source (bebas dan Free). Nginx digunakan untuk berbagai tugas yang berkontribusi untuk meningkatkan kinerja Node.js.

Fitur utama meliputi:

  • Reverse proxy server : Saat lalu lintas ke aplikasi Anda meningkat, pendekatan terbaik untuk meningkatkan kinerja adalah dengan menggunakan Nginx sebagai reverse proxy di depan server Node.js untuk memuat keseimbangan lalu lintas di seluruh server. Salah satu use case penggunaan Nginx sebagai core di dalam aplikasi Node.js

  • Stateless load balancing : Meningkatkan kinerja sekaligus mengurangi beban pada layanan backend dengan mengirimkan permintaan klien untuk dipenuhi oleh server mana pun yang memiliki akses ke file yang diminta.

  • Cache static contents : Menyajikan konten statis dalam aplikasi Node.js dan menggunakan Nginx sebagai server reverse proxy dan menggandakan kinerja aplikasi hingga maksimum 1.600 permintaan per detik

  • Implement SSL/TLS and HTTP/2 : Mengingat perubahan baru-baru ini dari penggunaan SSL/TLS untuk mengamankan interaksi pengguna di aplikasi Node.js, Nginx juga mendukung koneksi HTTP/2

  • Performance tracking : Anda dapat memonitoring secara real-time kinerja keseluruhan aplikasi Node.js Anda menggunakan statistik yang telah di sediakan Nginx berikut Live Activity Monitoring

  • Scalability : Bergantung pada aset yang Anda layani, Anda dapat memanfaatkan fitur HTTP, TCP, dan UDP di Nginx untuk meningkatkan skala aplikasi Node.js Anda.

Nginx saat ini mendukung tujuh bahasa scripting: Go, Node.js, Perl, PHP, Python, Ruby, dan Java Servlet Containers (yang terakhir adalah modul eksperimental). Yang memungkinkan Anda untuk menjalankan aplikasi yang ditulis dalam bahasa yang berbeda di server yang sama.

Membuat Aplikasi Node.js

Untuk aplikasi Node.js sederhana ini, kita akan membangun server Node.js dengan modul HTTP yang disediakan oleh Node.js. Mari kita mulai dengan membuat folder dan menginisialisasi proyek Node.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ cd /var/www/html/
$ mkdir nginx_server_project
$ cd nginx_server_project
$
$ pwd
/var/www/html/nginx_server_project
$
$ npm init -y
Wrote to /var/www/html/nginx_server_project/package.json:

{
  "name": "nginx_server_project",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
$

Langkah selanjutnya membuat file server.js yang berisi source code untuk aplikasi kita. Buka dengan IDE atau editor teks pilihan Anda, disini kami menggunakan vim:

1
$ vim server.js

Code Example :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const http = require("http");

const server = http.createServer((req, res) => {
  const urlPath = req.url;
  if (urlPath === "/overview") {
    res.end('Welcome to the "overview page" of the nginX project');
  } else if (urlPath === "/api") {
    res.writeHead(200, { "Content-Type": "application/json" });
    res.end(
      JSON.stringify({
        product_id: "xyz12u3",
        product_name: "NginX injector",
      })
    );
  } else {
    res.end("Successfully started a server");
  }
});

server.listen(3000, "localhost", () => {
  console.log("Listening for request");
});

Kami membuat server dengan modul HTTP Node.js yang kami impor menggunakan fungsi require dalam kode di atas. Di dalam server kami, kami akan membuat dua respons berbeda, tergantung pada route kami saat ini. Kedua routes tersebut adalah /overview dan /api.

Instalasi dan Konfigurasi Nginx Reverse Proxy

Selanjutnya kita perlu melakukan instalasi Nginx disini kami menggunakan Ubuntu 22.04 LTS Anda hanya perlu menjalankan satu baris perintah berikut:

1
$ apt install nginx -y

Jika sudah silakan enable dan start nginx

1
2
3
4
5
$ systemctl enable nginx
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
$
$ systemctl start nginx

Selanjutnya melakukan konfigurasi Nginx reverse Proxy

1
$ vim /etc/nginx/sites-available/nginx_server_project.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#The Nginx server instance qApp
server{
    listen 80;
    server_name nodejstest.id www.nodejstest.id;

    access_log /var/log/nginx/nodejstest.id_access.log;
    error_log /var/log/nginx/nodejstest.id_error.log;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        # location /overview {
        #     proxy_pass http://127.0.0.1:3000$request_uri;
        #     proxy_redirect off;
        # }
    }
}

KETERANGAN :

  • proxy_set_header : Menetapkan header host menjadi server Nginx
  • proxy_pass http : Menginstruksikan Nginx untuk mem-proxy semua permintaan yang cocok dengan pola lokasi ke server upstream (backend)
  • proxy_http_version : Mengubah koneksi masuk ke HTTP 1.1
  • proxy_set_header Upgrade : Mengubah koneksi proxy menjadi tipe Upgrade karena WebSockets hanya berkomunikasi pada koneksi yang ditingkatkan
  • proxy_set_header Connection : Memastikan nilai header koneksi adalah upgrade

Simpan dan silakan membuat symbolic untuk konfigurasi Nginx

1
$ ln -s /etc/nginx/sites-available/nginx_server_project.conf /etc/nginx/sites-enabled/

Kemudian, verifikasi konfigurasi Nginx dan silakan restart Nginx

1
2
3
4
5
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$
$ systemctl restart nginx

Jalankan aplikasi Node.js menggunakan perintah node seperti berikut ini:

1
2
3
4
$ cd /var/www/html/nginx_server_project/
$ node server.js
Listening for request

Silakan akses domain yang sudah di define di server block Nginx Anda, seperti gambar berikut ini:

Tampilan Awal

Tampilan Overview

Tampilan API

[Tahapan Opsional] Install PM2

PM2 adalah production process manager untuk aplikasi Node.js dengan penyeimbang beban bawaan, yang emungkinkan Anda untuk menjaga aplikasi tetap hidup selamanya, untuk memuat ulang tanpa downtime dan untuk memfasilitasi tugas-tugas system admin secara umum.

Untuk instalasi PM2 gunakan perintah berikut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ npm install pm2 -g
npm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.

added 183 packages, and audited 184 packages in 32s

12 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice
npm notice New minor version of npm available! 8.15.0 -> 8.18.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.18.0
npm notice Run npm install -g npm@8.18.0 to update!
npm notice
$

Dasar Perintah PM2

Untuk start aplikasi Node.js gunakan perintah

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$ pm2 start server.js
                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
 _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /var/www/html/nginx_server_project/server.js in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ server    │ default     │ 1.0.0   │ fork    │ 27564    │ 0s     │ 0    │ online    │ 0%       │ 31.1mb   │ root     │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
$
$

Untuk melihat semua list aplikasi node.js yang sedang berjalan gunakan perintah

1
$ pm2 list

Untuk management aplikasi node.js gunakan perintah

1
2
3
$ pm2 stop     <app_name|namespace|id|'all'|json_conf>
$ pm2 restart  <app_name|namespace|id|'all'|json_conf>
$ pm2 delete   <app_name|namespace|id|'all'|json_conf>

Untuk melihat detail informasi dari aplikasi node.js gunakan perintah

1
$ pm2 describe <id|app_name>

Untuk monitor logs, custom metrics, informasi aplikasi node.js gunakan perintah

1
$ pm2 monit

Sampai disini kita sudah berhasil mencoba menggunakan nginx sebagai reverse proxy server node.js dan basic management aplikasi Node.js menggunakan PM2.

Selamat mencoba 😁

comments powered by Disqus