Nginx có thể đóng nhiều vai trò trong thiết kế hệ thống của bạn. Nó có thể hoạt động như một máy chủ Web, máy chủ proxy, proxy ngược và cũng như một bộ cân bằng tải. Trong bài viết này, chúng ta sẽ tìm hiểu cách cân bằng tải các máy chủ NodeJs bằng Nginx.
Trong các ứng dụng có lưu lượng truy cập cao, chúng tôi không thể dựa vào việc máy chủ xử lý mọi yêu cầu. Tốt nhất là chúng tôi chạy nhiều máy chủ ứng dụng trên các máy khác nhau và phân phối lưu lượng của chúng tôi giữa các máy chủ đó để giảm thời gian phản hồi và đạt được tính khả dụng cao hơn. Bộ cân bằng tải ở giữa máy khách và máy chủ ứng dụng và quyết định yêu cầu này sẽ đi đến máy chủ nào. Quyết định có thể được cấu hình bằng các thuật toán khác nhau.

Hãy xây dựng một ứng dụng mẫu và dùng thử.
Ví dụ dưới đây:
Đây là ứng dụng Nodejs đơn giản của tôi
const express = require('express');
const router = express.Router();
const app = express();
router.get('/', (req,res) => {
res.send('Hello');
});
app.use('/', router);
app.listen(process.argv[2] || process.env.PORT || 3000, () => {
console.log(`App is listening at ${process.argv[2] || process.env.PORT || 3000}`);
});
Để chạy nhiều phiên bản của Node, chúng ta cần sử dụng trình quản lý quy trình. Tôi thực sự khuyên bạn nên dùng pm2 để xử lý quản lý quy trình cho Node.js. Đầu tiên, hãy cài đặt PM2 dưới dạng gói toàn cầu
npm i --g pm2
Chúng ta sẽ tạo 4 phiên bản máy chủ ứng dụng bằng PM2
pm2 start app.js -f --3000
pm2 start app.js -f --3001
pm2 start app.js -f --3002
pm2 start app.js -f --3003
cấu hình Nginx của chúng tôi để thực hiện cân bằng tải. Để làm như vậy, hãy tạo một tệp cấu hình trong thư mục Nginx /etc/nginx/conf.d
upstream app_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name your-domain.com www.your-domain.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://app_servers;
}
}
Khởi động lại máy chủ Nginx để cập nhật các thay đổi
sudo systemctl nginx restart
Khi Nginx khởi động lại thành công, hãy mở log PM2 bằng lệnh pm2 nhật ký tất cả và thực hiện yêu cầu từ trình duyệt. Bạn sẽ thấy yêu cầu được 4 máy chủ ứng dụng Node nhận và xử lý theo cách thức vòng tròn. Theo mặc định, Nginx sử dụng Round-robin làm phương pháp cân bằng tải
Nginx load balancing methods
You can use the following load balancing methods:
Round-robin (Mặc định)
hash
IP hash
Least connections
Least time
Round-robin
Đó là phương pháp mặc định. Trong đó, Nginx chạy qua danh sách các máy chủ ngược dòng theo trình tự, lần lượt chỉ định yêu cầu kết nối tiếp theo cho từng máy chủ
Hash
Trong phương pháp này, Nginx tính toán một hàm băm dựa trên sự kết hợp của văn bản và các biến Nginx và gán nó cho một trong các máy chủ. Yêu cầu đến khớp với hàm băm sẽ chỉ đến máy chủ cụ thể đó
Example:
upstream app_servers {
hash $scheme$request_uri;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3002;
}
IP Hash
Phương pháp này chỉ có sẵn cho máy chủ HTTP. Trong phương pháp này, hàm băm được tính toán dựa trên địa chỉ IP của máy khách. Phương pháp này đảm bảo nhiều yêu cầu đến từ cùng một máy khách sẽ đến cùng một máy chủ. Phương pháp này là bắt buộc đối với các ứng dụng dựa trên ổ cắm và phiên
Example:
upstream app_servers {
ip_hash;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3002;
}
Least connections
upstream app_servers {
least_conn;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
server 127.0.0.1:3002;
}
Least time
Trong phương pháp này, Nginx tính toán và gán giá trị cho từng máy chủ bằng cách sử dụng số lượng kết nối đang hoạt động hiện tại và thời gian phản hồi trung bình có trọng số cho các yêu cầu trước đây và gửi yêu cầu đến đến máy chủ có giá trị thấp nhất
Đó là một tính năng cao cấp và chỉ có trong Nginx plus
Lựa chọn phương pháp cân bằng tải nào?
Nó hoàn toàn phụ thuộc vào mô hình lưu lượng truy cập và bản chất của ứng dụng của bạn. Đối với một trang web như Codeforgeek, phương thức kết nối ít nhất phù hợp với máy chủ tốt nhất, tức là số lượng kết nối hoạt động thấp nhất sẽ nhận được yêu cầu phân chia tải đồng đều và cải thiện hiệu suất cùng một lúc. Bạn có thể chọn dựa trên kiểu lưu lượng truy cập của mình. Đối với các ứng dụng dựa trên socket, hàm băm IP phù hợp nhất
Kết luận
Trong bài viết này, chúng tôi đã nghiên cứu về cân bằng tải và cách tải các ứng dụng Node cân bằng sử dụng Nginx. Cân bằng tải giúp chúng tôi cải thiện hiệu suất và tính khả dụng và các phương pháp có sẵn của Nginx hoạt động như một sự quyến rũ