Trong bài viết này, chúng ta sẽ khám phá quy trình triển khai ứng dụng Node.js một cách hiệu quả thông qua kỹ thuật Blue-Green Deployment, sử dụng Nginx và PM2 để đảm bảo thời gian downtime được giảm thiểu đến mức tối thiểu. Bài viết sẽ hướng dẫn chi tiết từng bước để bạn có thể triển khai thành công trên VPS Ubuntu.
Blue-Green Deployment Là Gì?
Blue-Green Deployment là một phương pháp triển khai ứng dụng nhằm giảm thiểu thời gian chết trong quá trình ra mắt phiên bản mới. Kỹ thuật này bao gồm việc thiết lập hai môi trường song song: môi trường "blue" đang hoạt động và môi trường "green" dùng để triển khai phiên bản mới.
Khi sẵn sàng phát hành, phiên bản mới sẽ được triển khai trên môi trường green. Sau khi kiểm tra thành công, lưu lượng truy cập sẽ được chuyển từ môi trường blue sang môi trường green, giúp cập nhật ứng dụng mà không gây gián đoạn dịch vụ.
Ứng Dụng Kỹ Thuật Blue-Green Deployment Để Triển Khai Ứng Dụng Node.js
Trong phần này, chúng ta sẽ áp dụng kỹ thuật Blue-Green Deployment để triển khai một ứng dụng web Node.js (sử dụng framework Nest.js) trên VPS Ubuntu, với sự hỗ trợ của Nginx và PM2.
1. Chuẩn Bị Hai Môi Trường Blue và Green
Trước tiên, bạn cần tạo hai thư mục trên VPS để chứa mã nguồn cho từng môi trường:
/var/www/html/app/blue
/var/www/html/app/green
2. Cấu Hình Nginx Làm Reverse Proxy
Tiếp theo, chúng ta tạo tệp cấu hình Nginx để sử dụng Nginx làm reverse proxy cho ứng dụng Node.js của bạn. Dưới đây là ví dụ về cách tạo tệp cấu hình tại /etc/nginx/sites-available/main
:
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Địa chỉ URL của ứng dụng Node.js
proxy_pass http://127.0.0.1:3000;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
Sau đó, tạo symbolic link để kích hoạt cấu hình:
sudo ln -s /etc/nginx/sites-available/main /etc/nginx/sites-enabled/
3. Sử Dụng PM2 Làm Quản Lý Quy Trình
Cài đặt và sử dụng PM2 để quản lý các môi trường blue và green của ứng dụng Node.js. Mỗi môi trường sẽ chạy trên các cổng khác nhau, ví dụ 3000 và 3001.
4. Tạo Script Triển Khai
Bước quan trọng tiếp theo là tạo một script bash cho quy trình triển khai. Script này sẽ tự động thực hiện các bước cần thiết để triển khai phiên bản mới của ứng dụng:
- Đọc tệp cấu hình Nginx để xác định cổng và thư mục chứa mã của môi trường đang hoạt động.
- Kéo mã nguồn mới về thư mục còn lại.
- Xây dựng ứng dụng với mã mới.
- Sử dụng PM2 để khởi động ứng dụng mới trên cổng khác với cổng hiện tại.
- Tiến hành kiểm tra sức khỏe cho ứng dụng trên cổng mới.
- Cập nhật cấu hình Nginx để chuyển hướng đến cổng mới và nạp lại Nginx.
- Dừng và xóa ứng dụng cũ sau khi quá trình triển khai hoàn tất.
Dưới đây là một ví dụ cho script triển khai:
#!/bin/bash
# Một số biến cần thiết
BLUE_DIR="/var/www/html/app/blue"
BLUE_PORT="3000"
GREEN_DIR="/var/www/html/app/green"
GREEN_PORT="3001"
NGINX_CONFIG="/etc/nginx/sites-available/main"
# Kiểm tra cổng hiện tại từ thông tin trong cấu hình Nginx
CURRENT_PORT=$(grep -oP 'proxy_pass 127.0.0.1:\K\d+' $NGINX_CONFIG)
# Biến để lưu tên thư mục đang chạy
OLD_NAME=""
NEW_DIR=""
# Xác định môi trường để triển khai
if [ "$CURRENT_PORT" == "$BLUE_PORT" ]; then
NEW_DIR=$GREEN_DIR
NEW_PORT=$GREEN_PORT
OLD_NAME=$(basename $BLUE_DIR)
else
NEW_DIR=$BLUE_DIR
NEW_PORT=$BLUE_PORT
OLD_NAME=$(basename $GREEN_DIR)
fi
# Kéo mã nguồn mới về
echo "Đang kéo mã nguồn mới vào ($NEW_DIR)..."
cd $NEW_DIR
git pull
git show -s --format='%h %s'
echo ""
# Cài đặt cần thiết và xây dựng ứng dụng
echo "Đang xây dựng ứng dụng..."
rm -rf {dist,public}
yarn install
yarn build
echo ""
# Khởi động ứng dụng mới trên cổng mới
echo "Đang khởi động môi trường mới..."
NEW_NAME=$(basename $NEW_DIR)
PORT=$NEW_PORT pm2 start "dist/main.js" -i max --name "$NEW_NAME"
echo ""
# Chờ ứng dụng khởi động
echo "Đang chờ môi trường mới khởi động..."
sleep 5
# Kiểm tra sức khỏe ứng dụng mới
echo "Đang kiểm tra sức khỏe môi trường mới..."
STATUS_CODE=$(curl -o /dev/null -s -w "%{http_code}" http://127.0.0.1:$NEW_PORT/health)
if [ "$STATUS_CODE" -ne 200 ]; then
echo "Kiểm tra sức khỏe môi trường mới thất bại với mã trạng thái: $STATUS_CODE"
exit 1
fi
echo ""
# Cập nhật cấu hình Nginx
echo "Đang chuyển hướng Nginx sang môi trường mới..."
sudo sed -i "s/proxy_pass 127.0.0.1:[0-9]*;/proxy_pass 127.0.0.1:$NEW_PORT;/" $NGINX_CONFIG
sudo nginx -s reload
echo ""
echo "Triển khai hoàn tất. Môi trường ($NEW_NAME) đã hoạt động!"
# Dừng và xóa môi trường cũ
echo "Đang dừng môi trường cũ ($OLD_NAME)..."
pm2 stop $OLD_NAME
pm2 delete $OLD_NAME
pm2 save
5. Tự Động Hóa Triển Khai
Sau khi hoàn thành script, bạn có thể lưu nó với tên như deploy.sh
. Mỗi khi cần phát hành phiên bản mới, chỉ cần SSH vào VPS và chạy script để triển khai. Bạn cũng có thể tích hợp với GitHub Actions để tự động hóa quy trình triển khai mỗi khi có mã mới được đẩy lên nhánh sản xuất.
Kết Luận
Bài viết này đã hướng dẫn bạn cách triển khai ứng dụng Node.js bằng cách áp dụng kỹ thuật Blue-Green Deployment ở mức cơ bản. Bạn có thể điều chỉnh các bước để phù hợp với nhu cầu cụ thể của mình. Việc kiểm tra ứng dụng trước khi chuyển đổi lưu lượng truy cập sang môi trường mới là rất quan trọng để đảm bảo sự ổn định của ứng dụng. Xem thêm thông tin chi tiết trong series bài viết về xây dựng web với các công nghệ đã được kiểm chứng.
Chúc bạn triển khai ứng dụng thành công và có trải nghiệm trực tuyến tốt đẹp!
source: viblo