Chạy ứng dụng Node.js 24/7 trên VPS với PM2 và Nginx reverse proxy
Chạy Node.js 24/7 trên VPS cần ba thứ: cài đúng phiên bản Node.js, một trình quản lý tiến trình để ứng dụng tự chạy lại khi lỗi hoặc khi khởi động lại máy, và Nginx đứng trước để nhận tên miền và HTTPS. Bài viết hướng dẫn đầy đủ với PM2 và Nginx trên Ubuntu.
Bước 1: Cài Node.js bản LTS
Dùng kho NodeSource để có bản Node.js LTS mới (ví dụ bản 20):
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install nodejs -y
node -v
npm -v
Nếu cần nhiều phiên bản Node.js trên cùng VPS, có thể dùng công cụ quản lý phiên bản như nvm thay cho cách trên.
Bước 2: Đưa mã nguồn lên VPS
mkdir -p /var/www/app && cd /var/www/app
git clone https://github.com/ten-ban/du-an.git .
npm ci --omit=dev
Ứng dụng nên đọc cổng từ biến môi trường và chỉ lắng nghe ở 127.0.0.1, ví dụ cổng 3000. Biến môi trường bí mật (khoá API, mật khẩu cơ sở dữ liệu) để trong file .env, không đưa lên Git.
Bước 3: Chạy bằng PM2
npm install -g pm2
pm2 start server.js --name myapp
pm2 status
pm2 logs myapp
Cho ứng dụng tự chạy lại khi VPS khởi động lại:
pm2 startup # in ra một lệnh, sao chép và chạy lệnh đó
pm2 save
Các lệnh hay dùng: pm2 restart myapp sau khi cập nhật mã nguồn, pm2 reload myapp để khởi động lại không gián đoạn (khi chạy nhiều tiến trình), pm2 monit để theo dõi CPU, RAM.
Bước 4: Nginx làm reverse proxy
apt install nginx -y
nano /etc/nginx/sites-available/app.tenmien.com
server {
listen 80;
server_name app.tenmien.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
ln -s /etc/nginx/sites-available/app.tenmien.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Hai dòng Upgrade / Connection cần cho ứng dụng dùng WebSocket (chat, thông báo thời gian thực).
Bước 5: Bật HTTPS
apt install certbot python3-certbot-nginx -y
certbot --nginx -d app.tenmien.com
Tên miền phải trỏ bản ghi A về IP VPS trước, xem cách trỏ tên miền.
Cập nhật phiên bản mới
cd /var/www/app
git pull
npm ci --omit=dev
pm2 restart myapp
Câu hỏi thường gặp
Tại sao không chạy thẳng node server.js?
Khi bạn thoát SSH, tiến trình có thể dừng theo; ứng dụng lỗi cũng không tự chạy lại. PM2 lo cả hai việc và lưu log giúp bạn.
Có cần mở cổng 3000 trên tường lửa không?
Không. Nginx nhận yêu cầu ở cổng 80/443 rồi chuyển vào cổng 3000 trong máy, nên chỉ cần mở 80 và 443.
Kết luận
Node.js + PM2 + Nginx là bộ ba ổn định để chạy API, bot, website Node.js trên VPS. Xem thêm 10 bước bảo mật VPS Linux và các gói Cloud VPS phù hợp.
Bạn thấy bài viết này hữu ích?
Chia sẻ lên Facebook