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 😁