Làm thế nào để phát triển một ứng dụng máy chủ TCP Node.js bằng PM2 và Nginx trên Ubuntu 16.04
_Tác giả được chọn OSMI để nhận khoản đóng góp như một phần của Viết cho DOnations chương trình._ Giới thiệu Node.js là môi trường chạy JavaScript nguồn mở phổ biến được xây dựng trên công cụ Javascript V8 của Chrome. Node.js được sử dụng để xây dựng các ứng dụng mạng và phía máy chủ. TCP (Giao ...
_Tác giả được chọn OSMI để nhận khoản đóng góp như một phần của Viết cho DOnations chương trình._
Giới thiệu
Node.js là môi trường chạy JavaScript nguồn mở phổ biến được xây dựng trên công cụ Javascript V8 của Chrome. Node.js được sử dụng để xây dựng các ứng dụng mạng và phía máy chủ.TCP (Giao thức điều khiển truyền) là một giao thức mạng cung cấp phân phối đáng tin cậy, đặt hàng và kiểm tra lỗi luồng dữ liệu giữa các ứng dụng. Một máy chủ TCP có thể chấp nhận yêu cầu kết nối TCP và khi kết nối được thiết lập, cả hai bên có thể trao đổi luồng dữ liệu.
Trong hướng dẫn này, bạn sẽ xây dựng một máy chủ TCP cơ bản Node.js, cùng với một máy khách để kiểm tra máy chủ. Bạn sẽ chạy máy chủ của mình dưới dạng một quá trình nền bằng cách sử dụng trình quản lý quy trình Node.js mạnh mẽ được gọi là PM2. Sau đó, bạn sẽ định cấu hình Nginx như một proxy ngược cho ứng dụng TCP và kiểm tra kết nối máy khách-máy chủ từ máy cục bộ của bạn.
Điều kiện tiên quyết
Để hoàn thành hướng dẫn này, bạn sẽ cần:
- Một máy chủ Ubuntu 16.04 được thiết lập bằng cách làm theo hướng dẫn cài đặt máy chủ ban đầu của Ubuntu 16.04, bao gồm người dùng không phải root sudo và tường lửa.
- Nginx được cài đặt trên máy chủ của bạn, như được hiển thị trong Làm thế nào để cài đặt Nginx trên Ubuntu 16.04. Nginx phải được biên dịch với --with-stream tùy chọn, là mặc định khi cài đặt Nginx mới thông qua apt quản lý gói trên Ubuntu 16.04.
- Node.js được cài đặt bằng PPA chính thức, như được giải thích trong Làm thế nào để cài đặt Node.js trên Ubuntu 16.04.
Bước 1 - Tạo một ứng dụng TCP Node.js
Chúng tôi sẽ viết một ứng dụng Node.js bằng cách sử dụng TCP Sockets. Đây là một ứng dụng mẫu sẽ giúp bạn hiểu Mạng lưới thư viện trong Node.js cho phép chúng ta tạo ra các ứng dụng máy chủ TCP và ứng dụng khách.
Để bắt đầu, hãy tạo một thư mục trên máy chủ mà bạn muốn đặt ứng dụng Node.js của mình. Đối với hướng dẫn này, chúng tôi sẽ tạo ứng dụng của chúng tôi trong ~/tcp-nodejs-app danh mục:
mkdir ~/tcp-nodejs-app
Sau đó chuyển sang thư mục mới:
cd ~/tcp-nodejs-app
Tạo tệp mới có tên package.json cho dự án của bạn. Tệp này liệt kê các gói mà ứng dụng phụ thuộc vào. Tạo tệp này sẽ làm cho bản dựng có thể tái tạo vì sẽ dễ dàng hơn khi chia sẻ danh sách phụ thuộc này với các nhà phát triển khác:
nano package.json
Bạn cũng có thể tạo package.json sử dụng npm init lệnh, sẽ nhắc bạn về các chi tiết của ứng dụng, nhưng chúng tôi vẫn phải tự thay đổi tệp để thêm các phần bổ sung, bao gồm cả lệnh khởi động. Vì vậy, chúng tôi sẽ tự tạo tệp trong hướng dẫn này.
Thêm JSON sau vào tệp, chỉ định tên, phiên bản, tệp chính của ứng dụng, lệnh để khởi động ứng dụng và giấy phép phần mềm:
package.json
{ "name": "tcp-nodejs-app", "version": "1.0.0", "main": "server.js", "scripts": { "start": "node server.js" }, "license": "MIT" }
Các scripts cho phép bạn xác định các lệnh cho ứng dụng của bạn. Cài đặt bạn chỉ định ở đây cho phép bạn chạy ứng dụng bằng cách chạy npm start thay vì chạy node server.js.
Các package.json tệp cũng có thể chứa danh sách các phụ thuộc thời gian chạy và phát triển, nhưng chúng tôi sẽ không có bất kỳ phụ thuộc bên thứ ba nào cho ứng dụng này.
Bây giờ bạn có thư mục dự án và package.json thiết lập, hãy tạo máy chủ.
Trong thư mục ứng dụng của bạn, tạo một server.js tập tin:
nano server.js
Node.js cung cấp một mô-đun được gọi là net cho phép giao tiếp máy chủ TCP và máy khách. Tải net module với require(), sau đó xác định các biến để giữ cổng và máy chủ cho máy chủ:
server.js
const net = require('net'); const port = 7070; const host = '127.0.0.1';
Chúng tôi sẽ sử dụng cổng 7070 cho ứng dụng này, nhưng bạn có thể sử dụng bất kỳ cổng có sẵn nào bạn muốn. Đang sử dụng 127.0.0.1 cho HOST đảm bảo rằng máy chủ của chúng tôi chỉ nghe trên giao diện mạng cục bộ của chúng tôi. Sau đó chúng tôi sẽ đặt Nginx ở phía trước của ứng dụng này như một proxy ngược lại. Nginx là thành thạo trong việc xử lý nhiều kết nối và mở rộng theo chiều ngang.
Sau đó, thêm mã này để sinh ra một máy chủ TCP bằng cách sử dụng createServer() chức năng từ net mô-đun. Sau đó bắt đầu nghe các kết nối trên cổng và máy chủ mà bạn đã xác định bằng cách sử dụng listen() chức năng của net module:
server.js
... const server = net.createServer(); server.listen(port, host, () => { console.log('TCP Server is running on port ' + port +'.'); });
Tiết kiệm server.js và khởi động máy chủ:
npm start
Bạn sẽ thấy kết quả này:
OutputTCP Server is running on port 7070
Máy chủ TCP đang chạy trên cổng 7070. nhấn CTRL+C để dừng máy chủ.
Bây giờ chúng ta biết máy chủ đang lắng nghe, hãy viết mã để xử lý các kết nối máy khách.
Khi khách hàng kết nối với máy chủ, máy chủ sẽ kích hoạt connection sự kiện mà chúng tôi sẽ quan sát. Chúng tôi sẽ xác định một loạt các khách hàng được kết nối, mà chúng tôi sẽ gọi socketsvà thêm từng cá thể máy khách vào mảng này khi máy khách kết nối.
Chúng tôi sẽ sử dụng data sự kiện để xử lý luồng dữ liệu từ các máy khách được kết nối, bằng cách sử dụng sockets mảng để truyền dữ liệu đến tất cả các máy khách được kết nối.
Thêm mã này vào server.js tệp để triển khai các tính năng này:
server.js
... let sockets = []; server.on('connection', function(sock) { console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort); sockets.push(sock); sock.on('data', function(data) { console.log('DATA ' + sock.remoteAddress + ': ' + data); // Write the data back to all the connected, the client will receive it as data from the server sockets.forEach(function(sock, index, array) { sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + ' '); }); }); });
Điều này yêu cầu máy chủ lắng nghe data sự kiện được gửi bởi khách hàng được kết nối. Khi khách hàng được kết nối gửi bất kỳ dữ liệu nào đến máy chủ, chúng tôi sẽ phản hồi lại tất cả các máy khách được kết nối bằng cách lặp lại thông qua sockets mảng.
Sau đó thêm trình xử lý cho close các sự kiện sẽ được trigerred khi một khách hàng kết nối chấm dứt kết nối. Bất cứ khi nào một khách hàng ngắt kết nối, chúng tôi muốn xóa khách hàng khỏi sockets mảng để chúng tôi không còn phát nữa. Thêm mã này vào cuối khối kết nối:
server.js
let sockets = []; server.on('connection', function(sock) { ... // Add a 'close' event handler to this instance of socket sock.on('close', function(data) { let index = sockets.findIndex(function(o) { return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort; }) if (index !== -1) sockets.splice(index, 1); console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort); }); });
Đây là mã hoàn chỉnh cho server.js:
server.js
const net = require('net'); const port = 7070; const host = '127.0.0.1'; const server = net.createServer(); server.listen(port, host, () => { console.log('TCP Server is running on port ' + port + '.'); }); let sockets = []; server.on('connection', function(sock) { console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort); sockets.push(sock); sock.on('data', function(data) { console.log('DATA ' + sock.remoteAddress + ': ' + data); // Write the data back to all the connected, the client will receive it as data from the server sockets.forEach(function(sock, index, array) { sock.write(sock.remoteAddress + ':' + sock.remotePort + " said " + data + ' '); }); }); // Add a 'close' event handler to this instance of socket sock.on('close', function(data) { let index = sockets.findIndex(function(o) { return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort; }) if (index !== -1) sockets.splice(index, 1); console.log('CLOSED: ' + sock.remoteAddress + ' ' + sock.remotePort); }); });
Lưu tệp và sau đó khởi động lại máy chủ:
npm start
Chúng tôi có một TCP Server đầy đủ chức năng chạy trên máy tính của chúng tôi. Tiếp theo, chúng tôi sẽ viết một máy khách để kết nối với máy chủ của chúng tôi.
Bước 2 - Tạo một máy khách TCP Node.js
Máy chủ Node.js của chúng tôi đang chạy, vì vậy hãy tạo một Máy khách TCP để kết nối với máy chủ và kiểm tra máy chủ.
Máy chủ Node.js bạn vừa viết vẫn đang chạy, chặn phiên đầu cuối hiện tại của bạn. Chúng tôi muốn tiếp tục chạy khi chúng tôi phát triển ứng dụng khách, vì vậy hãy mở một cửa sổ hoặc tab Thiết bị đầu cuối mới. Sau đó, kết nối lại vào máy chủ từ tab mới.
ssh sammy@your_server_ip
Khi đã kết nối, hãy điều hướng đến tcp-nodejs-app danh mục:
cd tcp-nodejs-app
Trong cùng một thư mục, tạo một tệp mới có tên client.js:
nano client.js
Khách hàng sẽ sử dụng cùng một net thư viện được sử dụng trong server.js tệp để kết nối với máy chủ TCP. Thêm mã này vào tệp để kết nối với máy chủ bằng địa chỉ IP 127.0.0.1 trên cổng 7070:
client.js
const net = require('net'); const client = new net.Socket(); const port = 7070; const host = '127.0.0.1'; client.connect(port, host, function() { console.log('Connected'); client.write("Hello From Client " + client.address().address); });
Trước tiên, mã này sẽ cố gắng kết nối với máy chủ TCP để đảm bảo rằng máy chủ mà chúng tôi đã tạo đang chạy. Khi kết nối được thiết lập, khách hàng sẽ gửi "Hello From Client " + client.address().address đến máy chủ bằng cách sử dụng client.write chức năng. Máy chủ của chúng tôi sẽ nhận dữ liệu này và gửi lại cho khách hàng.
Khi máy khách nhận được dữ liệu từ máy chủ, chúng tôi muốn nó in phản hồi của máy chủ. Thêm mã này để bắt data sự kiện và in phản hồi của máy chủ cho dòng lệnh:
client.js
client.on('data', function(data) { console.log('Server Says : ' + data); });
Cuối cùng, xử lý ngắt kết nối khỏi máy chủ một cách duyên dáng bằng cách thêm mã này:
client.js
client.on('close', function() { console.log('Connection closed'); });
Lưu client.js tập tin.
Chạy lệnh sau để khởi động máy khách:
node client.js
Kết nối sẽ thiết lập và máy chủ sẽ nhận dữ liệu, lặp lại dữ liệu cho máy khách:
client.js OutputConnected Server Says : 127.0.0.1:34548 said Hello From Client 127.0.0.1
Chuyển về thiết bị đầu cuối nơi máy chủ đang chạy và bạn sẽ thấy kết quả sau:
server.js OutputCONNECTED: 127.0.0.1:34550 DATA 127.0.0.1: Hello From Client 127.0.0.1
Bạn đã xác minh rằng bạn có thể thiết lập kết nối TCP giữa ứng dụng máy chủ và ứng dụng khách của bạn.
nhấn CTRL+C để dừng máy chủ. Sau đó chuyển sang phiên thiết bị đầu cuối khác và nhấn CTRL+C để ngăn chặn khách hàng. Bây giờ bạn có thể ngắt kết nối phiên đầu cuối này khỏi máy chủ của bạn và quay lại phiên đầu cuối ban đầu của bạn.
Trong bước tiếp theo, chúng tôi sẽ khởi động máy chủ với PM2 và chạy nó trong nền.
Bước 3 - Chạy máy chủ với PM2
Bạn có một máy chủ làm việc chấp nhận các kết nối máy khách, nhưng nó chạy ở nền trước. Hãy chạy máy chủ bằng PM2 để nó chạy trong backgrand và có thể khởi động lại một cách duyên dáng.
Đầu tiên, cài đặt PM2 trên máy chủ của bạn trên toàn cầu sử dụng npm:
sudo npm install pm2 -g
Khi PM2 được cài đặt, hãy sử dụng nó để chạy máy chủ của bạn. Thay vì chạy npm start để khởi động máy chủ, bạn sẽ sử dụng pm2 chỉ huy. Khởi động máy chủ:
pm2 start server.js
Bạn sẽ thấy đầu ra như thế này:
[secondary_label Output [PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/sammy/tcp-nodejs-app/server.js in fork_mode (1 instance) [PM2] Done. ââââââââââ¬âââââââ¬âââââââââ¬ââââ¬ââââââ¬ââââââââââââ â Name â mode â status â ⺠â cpu â memory â ââââââââââ¼âââââââ¼âââââââââ¼ââââ¼ââââââ¼âââââââââââ⤠â server â fork â online â 0 â 5% â 24.8 MB â ââââââââââ´âââââââ´âââââââââ´ââââ´ââââââ´ââââââââââââ Use `pm2 show <id|name>` to get more details about an app
Máy chủ hiện đang chạy ở chế độ nền. Tuy nhiên, nếu chúng ta khởi động lại máy, nó sẽ không chạy nữa, vì vậy hãy tạo một dịch vụ systemd cho nó.
Chạy lệnh sau để tạo và cài đặt các kịch bản khởi động systemd của PM2. Hãy chắc chắn để chạy điều này với sudo để các tệp systemd cài đặt tự động.
sudo pm2 startup
Bạn sẽ thấy kết quả này:
Output[PM2] Init System found: systemd Platform systemd ... [PM2] Writing init configuration in /etc/systemd/system/pm2-root.service [PM2] Making script booting at startup... [PM2] [-] Executing: systemctl enable pm2-root... Created symlink from /etc/systemd/system/multi-user.target.wants/pm2-root.service to /etc/systemd/system/pm2-root.service. [PM2] [v] Command successfully executed. +---------------------------------------+ [PM2] Freeze a process list on reboot via: $ pm2 save [PM2] Remove init script via: $ pm2 unstartup systemd
PM2 hiện đang chạy dưới dạng dịch vụ systemd.
Bạn có thể liệt kê tất cả các tiến trình PM2 đang quản lý với pm2 list chỉ huy:
pm2 list
Bạn sẽ thấy ứng dụng của mình trong danh sách, với ID của 0:
Outputââââââââââââ¬âââââ¬âââââââ¬âââââââ¬âââââââââ¬ââââââââââ¬âââââââââ¬ââââââ¬ââââââââââââ¬ââââââââ¬âââââââââââ â App name â id â mode â pid â status â restart â uptime â cpu â mem â user â watching â ââââââââââââ¼âââââ¼âââââââ¼âââââââ¼âââââââââ¼ââââââââââ¼âââââââââ¼ââââââ¼ââââââââââââ¼ââââââââ¼ââââââââââ⤠â server â 0 â fork â 9075 â online â 0 â 4m â 0% â 30.5 MB â sammy â disabled â ââââââââââââ´âââââ´âââââââ´âââââââ´âââââââââ´ââââââââââ´âââââââââ´ââââââ´ââââââââââââ´ââââââââ´âââââââââââ
Trong đầu ra trước đó, bạn sẽ nhận thấy rằng watching bị vô hiệu hóa. Đây là một tính năng tải lại máy chủ khi bạn thực hiện thay đổi đối với bất kỳ tệp ứng dụng nào. Nó rất hữu ích trong phát triển, nhưng chúng tôi không cần tính năng đó trong sản xuất.
Để biết thêm thông tin về bất kỳ quy trình đang chạy nào, hãy sử dụng pm2 show lệnh, theo sau là ID của nó. Trong trường hợp này, ID là 0:
pm2 show 0
Đầu ra này hiển thị đường dẫn tệp thời gian hoạt động, trạng thái, tệp nhật ký và thông tin khác về ứng dụng đang chạy:
OutputDescribing process with id 0 - name server âââââââââââââââââââââ¬âââââââââââââââââââââââââââââââââââââââââââ â status â online â â name â server â â restarts â 0 â â uptime â 7m â â script path â /home/sammy/tcp-nodejs-app/server.js â â script args â N/A â â error log path â /home/sammy/.pm2/logs/server-error-0.log â â out log path â /home/sammy/.pm2/logs/server-out-0.log â â pid path â /home/sammy/.pm2/pids/server-0.pid â â interpreter â node â â interpreter args â N/A â â script id â 0 â â exec cwd â /home/sammy/tcp-nodejs-app â â exec mode â fork_mode â â node.js version â 8.11.2 â â watch & reload â â â â unstable restarts â 0 â â created at â 2018-05-30T19:29:45.765Z â âââââââââââââââââââââ´âââââââââââââââââââââââââââââââââââââââââââ Code metrics value âââââââââââââââââââ¬âââââââââ â Loop delay â 1.12ms â â Active requests â 0 â â Active handles â 3 â âââââââââââââââââââ´âââââââââ Add your own code metrics: http://bit.ly/code-metrics Use `pm2 logs server [--lines 1000]` to display logs Use `pm2 monit` to monitor CPU and Memory usage server
Nếu trạng thái ứng dụng hiển thị lỗi, bạn có thể sử dụng đường dẫn đăng nhập lỗi để mở và xem lại nhật ký lỗi để gỡ lỗi:
cat /home/tcp/.pm2/logs/server-error-0.log
Nếu bạn thực hiện thay đổi đối với mã máy chủ, bạn sẽ cần phải khởi động lại quá trình của ứng dụng để áp dụng các thay đổi, như sau:
pm2 restart 0
PM2 hiện đang quản lý ứng dụng. Bây giờ chúng ta sẽ sử dụng Nginx để yêu cầu proxy đến máy chủ.
Bước 4 - Thiết lập Nginx làm máy chủ proxy ngược
Ứng dụng của bạn đang chạy và nghe 127.0.0.1, có nghĩa là nó sẽ chỉ chấp nhận các kết nối từ máy cục bộ. Chúng tôi sẽ thiết lập Nginx như một proxy ngược mà sẽ xử lý lưu lượng truy cập đến và chuyển nó đến máy chủ của chúng tôi.
Để thực hiện điều này, chúng tôi sẽ sửa đổi cấu hình Nginx để sử dụng stream {} và stream_proxy các tính năng của Nginx để chuyển tiếp các kết nối TCP tới máy chủ Node.js của chúng ta.
Chúng ta phải chỉnh sửa tệp cấu hình Nginx chính stream khối cấu hình chuyển tiếp kết nối TCP chỉ hoạt động như một khối cấp cao nhất. Cấu hình Nginx mặc định trên Ubuntu tải các khối máy chủ trong http khối của tệp và stream không thể đặt khối trong khối đó.
Mở tập tin /etc/nginx/nginx.conf trong trình chỉnh sửa của bạn:
sudo nano /etc/nginx/nginx.conf
Thêm các dòng sau vào cuối tệp cấu hình của bạn:
/etc/nginx/nginx.conf
... stream { server { listen 3000; proxy_pass 127.0.0.1:7070; proxy_protocol on; } }
Điều này nghe cho các kết nối TCP trên cổng 3000 và ủy quyền các yêu cầu tới máy chủ Node.js của bạn đang chạy trên cổng 7070. Nếu ứng dụng của bạn được đặt để nghe trên một cổng khác, hãy cập nhật cổng URL truyền proxy thành đúng số cổng. Các proxy_protocol chỉ thị cho Nginx sử dụng Giao thức PROXY để gửi thông tin khách hàng đến máy chủ phụ trợ, sau đó có thể xử lý thông tin đó khi cần.
Lưu tệp và thoát khỏi trình chỉnh sửa.
Kiểm tra cấu hình Nginx của bạn để đảm bảo bạn không giới thiệu bất kỳ lỗi cú pháp nào:
sudo nginx -t
Tiếp theo, khởi động lại Nginx để kích hoạt chức năng proxy TCP và UDP:
sudo systemctl restart nginx
Tiếp theo, cho phép kết nối TCP đến máy chủ của chúng tôi trên cổng đó. Sử dụng ufw để cho phép kết nối trên cổng 3000:
sudo sudo ufw allow 3000
Giả sử rằng ứng dụng Node.js của bạn đang chạy, và cấu hình ứng dụng và Nginx của bạn là chính xác, bây giờ bạn có thể truy cập ứng dụng của bạn thông qua proxy đảo ngược Nginx.
Bước 5 - Kiểm tra kết nối máy khách-máy chủ
Hãy kiểm tra máy chủ bằng cách kết nối với máy chủ TCP từ máy cục bộ của chúng tôi bằng cách sử dụng client.js kịch bản. Để làm như vậy, bạn cần phải tải xuống client.js tệp bạn đã phát triển cho máy cục bộ của mình và thay đổi địa chỉ cổng và địa chỉ IP trong tập lệnh.
Đầu tiên, trên máy cục bộ của bạn, tải xuống client.js tập tin sử dụng scp:
[environment local scp sammy@your_server_ip:~/tcp-nodejs-app/client.js client.js
Mở client.js trong trình chỉnh sửa của bạn:
[environment local nano client.js
Thay đổi port đến 3000 và thay đổi host đến địa chỉ IP của máy chủ của bạn:
client.js
// A Client Example to connect to the Node.js TCP Server const net = require('net'); const client = new net.Socket(); const port = 3000; const host = 'your_server_ip'; ...
Lưu tệp, thoát trình chỉnh sửa và kiểm tra mọi thứ bằng cách chạy ứng dụng khách:
node client.js
Bạn sẽ thấy cùng một đầu ra mà bạn đã thấy khi bạn chạy nó trước đó, chỉ ra rằng máy khách của bạn đã kết nối thông qua Nginx và đến máy chủ của bạn:
client.js OutputConnected Server Says : 127.0.0.1:34584 said PROXY TCP4 your_local_ip_address your_server_ip 52920 3000 Hello From Client your_local_ip_address
Vì Nginx đang ủy nhiệm các kết nối máy khách đến máy chủ của bạn, máy chủ Node.js của bạn sẽ không thấy địa chỉ IP thực của các máy khách; nó sẽ chỉ thấy địa chỉ IP của Nginx. Nginx không hỗ trợ gửi địa chỉ IP thực sự đến backend trực tiếp mà không thực hiện một số thay đổi đối với hệ thống của bạn có thể ảnh hưởng đến bảo mật, nhưng vì chúng tôi đã bật giao thức PROXY trong Nginx, máy chủ Node.js hiện đang nhận thêm PROXY thư chứa IP thực. Nếu bạn cần địa chỉ IP đó, bạn có thể điều chỉnh máy chủ của mình để xử lý PROXY yêu cầu và phân tích dữ liệu bạn cần.
Bây giờ bạn có ứng dụng TCP Node.js của bạn chạy phía sau một proxy đảo ngược Nginx và có thể tiếp tục phát triển máy chủ của bạn hơn nữa.
Phần kết luận
Trong hướng dẫn này, bạn đã tạo một ứng dụng TCP với Node.js, chạy nó với PM2 và phục vụ nó sau Nginx. Bạn cũng đã tạo một ứng dụng khách để kết nối với nó từ các máy khác. Bạn có thể sử dụng ứng dụng này để xử lý các luồng dữ liệu lớn hoặc để tạo các ứng dụng nhắn tin theo thời gian thực.