Site logo
Authors
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Published on
Published on

Hướng dẫn Deploy Node.js và Express App trên AWS EC2

Node.js và Express là một bộ công cụ phổ biến và mạnh mẽ được sử dụng rộng rãi trong phát triển Backend. Trong bài viết này, chúng ta sẽ cùng thực hiện từng bước để deploy một ứng dụng Node.js trên AWS EC2 đồng thời sử dụng PM2, Nginx để giải quyết 1 số vấn đề.

Yêu Cầu

Trước khi bắt đầu, bạn cần:

  • Tài khoản AWS.
  • Một ứng dụng Node.js với Express sẵn sàng để triển khai.

Chuẩn Bị AWS EC2 Instance

1. Tạo EC2 Instance

Xem hướng dẫn tạo tại đây: Hướng dẫn tạo AWS EC2

Nhớ mở port 443, 80, và 22 cho IP của bạn.

ExpressJS on EC2

2. Kết Nối EC2 Instance

Sử dụng SSH để kết nối với instance:

ssh -i /path/to/key.pem ec2-user@<EC2_PUBLIC_IP>

# Ví dụ:
ssh -i ~/.ssh/xinhnd-demo.pem ec2-user@35.77.47.31

Cài Đặt Node.js trên EC2

1. Cập Nhật Hệ Thống

# Đối với AL2023
sudo dnf update -y

# Đối với Ubuntu
sudo apt update -y

2. Cài Đặt Node.js

# Đối với AL2023
sudo dnf install -y nodejs

# Đối với Ubuntu
sudo apt install nodejs npm -y

Kiểm tra phiên bản:

node -v
npm -v

Xem đầy đủ cách cài đặt NodeJS trên Linux tại đây: Hướng Dẫn Cài Đặt NodeJS và NPM trên MacOS, Window, Linux

Triển Khai Ứng Dụng Node.js

Ở phần này mình sẽ sử dụng Git để deploy code lên Server AWS EC2. Ở đây mình có chuẩn bị sẵn 1 app Express example trên GitHub: https://github.com/ducxinh/express-example-app

1. Cài đặt Git

Để cài đặt Git, chạy lệnh sau:

# Đối với AL2023
sudo dnf install -y git

# Đối với Ubuntu
sudo apt install -y git

Kiểm tra phiên bản

git --version
# git version 2.43.0

2. Triển khai code lên Server

Kết nối vào server và chạy lệnh sau:

cd $HOME
git clone https://github.com/ducxinh/express-example-app.git expressjs-app

3. Cài Đặt Dependencies

Truy cập vào thư mục ứng dụng trên EC2:

cd $HOME/expressjs-app
npm install

4. Chạy Ứng Dụng

npm run start

Mở trình duyệt và truy cập http://<EC2_PUBLIC_IP>:3000 để kiểm tra. Bạn sẽ không truy cập được đúng không? Điều này do mình chưa mở port 3000. Ok. bây giờ hãy mở port 3000 ra như sau:

ExpressJS on EC2

Bây giờ hãy reload và xem kết quả thử nhé

ExpressJS on EC2

Tuyệt vời. Ta đã chạy được app Express trên server của mình tôi. Tuy nhiên có 1 vấn đề đó là nếu thoát khỏi SSH thì sẽ không thể truy cập được app Express được nữa.

ExpressJS on EC2

Để đảm bảo ứng dụng không bị dừng khi thoát khỏi SSH, ta sẽ sử dụng pm2:

Cài đặt và cấu hình PM2 với NodeJS

PM2 là một Process Manager dành cho các ứng dụng Node.js, được sử dụng để quản lý và giám sát các ứng dụng chạy NodeJS PM2 đảm bảo ứng dụng Node.js luôn chạy, ngay cả khi xảy ra sự cố như lỗi không mong muốn hoặc máy chủ khởi động lại.

1. Cài Đặt pm2

npm install -g pm2

2. Chạy Ứng Dụng với pm2

cd $HOME/expressjs-app
pm2 start npm --name "express-demo" -- run start

# Hoặc pm2 start app.js

3. Lưu tiến trình để khởi động lại sau reboot

Để đảm bảo ứng dụng tự động chạy lại khi server EC2 khởi động, cấu hình PM2 với các lệnh sau:

pm2 save
pm2 startup
# [PM2] Init System found: systemd
# [PM2] To setup the Startup Script, copy/paste the following command:
# sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

Sau khi chạy thì bạn run command từ output như sau:

sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u ubuntu --hp /home/ubuntu

4. Khi thay đổi code hoặc cần khởi động lại ứng dụng thì lệnh sau:

pm2 restart express-demo

Để tìm hiểu kỹ hơn về pm2, hãy xem ở các bài tiếp theo.

5. Kiểm tra PM2

Ok. Bây giờ thử reboot EC2 để kiểm tra kết quả

sudo reboot

Chờ 1 chút rồi cho server reboot xong thì truy cập lại http://<EC2_PUBLIC_IP>:3000 để kiểm tra.

ExpressJS on EC2

Lúc này chắc chắn màn sẽ thấy App Express đang chạy.

Xong bài toán đảm bảo app Express JS luôn luôn chạy. Tuy nhiên còn 1 vấn đề khác. Mỗi lần truy cập app phải nhập kèm theo port 3000 như vậy thì nhìn hơi bất tiện, đúng không? Để giải quyết vấn đề này thì mình có thể custom port cho Express JS sang port 80. Tuy nhiên có cách khác tốt hơn đó là sử dụng Nginx Proxy.

Cài Đặt Reverse Proxy với Nginx

Để chạy ứng dụng qua HTTP (port 80) và đảm bảo khả năng mở rộng, chúng ta sử dụng Nginx làm reverse proxy.

1. Cài Đặt Nginx

# Với AL 2023
sudo dnf install nginx -y

# Với Ubuntu
sudo apt install -y nginx

2. Enable Nginx

sudo systemctl enable nginx

3. Cấu Hình Nginx

Mở file cấu hình Nginx:

sudo vi /etc/nginx/conf.d/express_js.example.conf

Thêm block sau vào phần server:

server {
    listen 80;
    server_name 35.77.47.31;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Kiểm tra cấu hình và Khởi động lại Nginx:

sudo nginx -t
sudo systemctl restart nginx

Kiểm Tra Kết Quả

  1. Truy cập http://<EC2_PUBLIC_IP> để xem ứng dụng Node.js chạy qua Nginx.

AWS EC2 ExpressJS Nginx

  1. Kiểm tra log ứng dụng
pm2 logs

Kết Luận

Với bài hướng dẫn này, bạn đã triển khai thành công một ứng dụng Node.js và Express trên AWS EC2, tích hợp Nginx để tối ưu hóa truy cập. Đây là bước khởi đầu để bạn tiếp tục triển khai ứng dụng quy mô lớn trên nền tảng cloud.

Mở Rộng

  • Container: Sử dụng Docker để container hoá ứng dụng Express của bạn. Có thể kết hợp thêm Elastic Beanstalk, ECS,..
  • SSL: Sử dụng AWS Certificate Manager hoặc Let’s Encrypt để cài đặt HTTPS.
  • Scaling: Kết hợp Auto Scaling và Load Balancer để đảm bảo khả năng mở rộng ứng dụng.
  • Monitoring: Dùng CloudWatch để theo dõi hiệu năng và log ứng dụng.