Thiết lập monitoring cho ứng dụng Next.js chạy trên VPS để phát hiện lỗi sớm
Ứng dụng Next.js trên VPS thường “chạy ổn” cho đến khi không còn ổn: CPU tăng vọt, RAM đầy, API timeout, SSR lỗi, cron treo, chứng chỉ SSL hết hạn, DB chậm, user báo lỗi trước dev. Vấn đề không nằm ở VPS hay Next.js, mà ở việc thiếu monitoring.
Monitoring tốt → phát hiện sớm. Cảnh báo đúng → xử lý nhanh. Log đủ ngữ cảnh → debug ngắn. Bài này hướng dẫn cách thiết lập monitoring thực tế cho app Next.js chạy trên VPS: từ process, tài nguyên máy chủ, log, uptime, error tracking, metrics, alert.
Monitoring cần theo dõi gì?
1. Uptime
Uptime trả lời câu hỏi: web còn truy cập được không?
Cần monitor:
– Trang chủ: https://domain.com
– Health check: https://domain.com/api/health
– API quan trọng: login, checkout, webhook
– SSL expiry
– DNS
– Response time
Nếu chỉ ping VPS → chưa đủ. VPS sống nhưng Next.js chết vẫn lỗi. Nên kiểm tra HTTP status + nội dung trả về.
Ví dụ endpoint health:
// app/api/health/route.ts
export async function GET() {
return Response.json({
status: "ok",
timestamp: new Date().toISOString(),
});
}Nếu có DB:
export async function GET() {
try {
// await db.user.findFirst()
return Response.json({ status: "ok" });
} catch {
return Response.json({ status: "error" }, { status: 500 });
}
}Lưu ý: health check DB giúp phát hiện lỗi thật, nhưng nếu DB query nặng → tự gây tải. Dùng query nhẹ.
Theo dõi process Next.js bằng PM2
Nếu chạy Next.js qua next start, nên dùng PM2. PM2 giúp restart app khi crash, xem log, giới hạn RAM, auto-start sau reboot.
Cài PM2:
npm install -g pm2Chạy app:
pm2 start npm --name "next-app" -- start
pm2 save
pm2 startupXem trạng thái:
pm2 status
pm2 logs next-app
pm2 monitCấu hình ecosystem:
// ecosystem.config.js
module.exports = {
apps: [
{
name: "next-app",
script: "npm",
args: "start",
instances: 1,
exec_mode: "fork",
max_memory_restart: "500M",
env: {
NODE_ENV: "production",
PORT: 3000,
},
},
],
};Chạy:
pm2 start ecosystem.config.js
pm2 saveĐiểm quan trọng:
– max_memory_restart → tránh app ăn RAM đến chết VPS.
– pm2 startup → reboot xong app tự chạy.
– pm2 logs → debug lỗi runtime.
– pm2 monit → xem CPU/RAM per process.
Nếu app dùng nhiều CPU, cân nhắc instances: "max" + exec_mode: "cluster". Nhưng SSR có state nội bộ → kiểm tra kỹ trước.
Theo dõi tài nguyên VPS
App Next.js có thể lỗi vì server hết tài nguyên. Cần theo dõi:
– CPU usage – RAM usage – Disk usage – Disk I/O – Network – Load average – Swap – Open files – Nginx status – Docker container nếu có
Lệnh nhanh:
htop
free -m
df -h
du -sh /var/log/*
journalctl -xeCài Netdata → nhanh, trực quan:
bash <(curl -Ss https://my-netdata.io/kickstart.sh)Sau đó truy cập:
http://your-server-ip:19999Netdata mạnh vì có alert sẵn: CPU cao, RAM thấp, disk gần đầy, load bất thường. Với VPS public, nên chặn port bằng firewall hoặc reverse proxy + auth.
Ví dụ UFW:
ufw allow OpenSSH
ufw allow 80
ufw allow 443
ufw deny 19999
ufw enableLog: nguồn dữ liệu quan trọng nhất
Không có log → chỉ đoán. Với Next.js production, cần log:
– Request lỗi – API exception – Auth failure – Payment/webhook failure – DB timeout – SSR/render error – Background job error – Deploy event
Log nên có cấu trúc JSON:
console.error(JSON.stringify({
level: "error",
message: "Checkout failed",
userId,
orderId,
error: err instanceof Error ? err.message : String(err),
stack: err instanceof Error ? err.stack : undefined,
timestamp: new Date().toISOString(),
}));Tránh log:
– Password – Token – Cookie – API key – Full credit card – Private user data
PM2 log nằm thường tại:
~/.pm2/logs/Kiểm tra dung lượng log. Log phình to → đầy disk → app chết.
Cài logrotate cho PM2:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress trueNếu dùng Nginx, theo dõi:
/var/log/nginx/access.log
/var/log/nginx/error.logLỗi 502/504 thường do:
– Next.js process chết – Upstream port sai – App timeout – RAM hết – Deploy làm app ngắt – Nginx timeout thấp
Error tracking với Sentry
Uptime biết app chết. Log biết server ghi gì. Sentry biết user gặp lỗi nào, ở route nào, browser nào, stack trace nào.
Cài Sentry cho Next.js:
npm install @sentry/nextjs
npx @sentry/wizard@latest -i nextjsSentry giúp bắt:
– Client-side exception – Server-side exception – API route error – Performance issue – Release/version lỗi – Source map stack trace
Nên cấu hình environment:
SENTRY_DSN=...
SENTRY_ENVIRONMENT=productionKhi capture thủ công:
import * as Sentry from "@sentry/nextjs";
try {
// logic
} catch (err) {
Sentry.captureException(err);
throw err;
}
Best practice:
– Gắn release theo commit SHA.
– Tách production, staging.
– Bật alert khi error rate tăng.
– Ignore lỗi noise như bot, extension browser.
– Không gửi PII nếu không cần.
Sentry đặc biệt hữu ích với Next.js vì lỗi hydration, lỗi client JS, lỗi SSR đôi khi không hiện rõ trong log server.
Uptime monitoring bằng Uptime Kuma
Uptime Kuma phù hợp VPS nhỏ: self-host, UI đẹp, alert Telegram/Slack/Email.
Chạy bằng Docker:
docker run -d
--restart=always
-p 3001:3001
-v uptime-kuma:/app/data
--name uptime-kuma
louislam/uptime-kuma:1Truy cập:
http://your-server-ip:3001Nên monitor:
– https://domain.com
– https://domain.com/api/health
– https://domain.com/login
– SSL certificate
– Internal service nếu có: Redis, DB proxy, queue dashboard
Alert nên gửi Telegram. Nhanh, rẻ, thực tế.
Cấu hình interval:
– Trang chủ: 1 phút – API health: 1 phút – SSL: 12 giờ – Job phụ: 5 phút
Không nên check quá dày vào endpoint nặng. Monitoring cũng là traffic.
Reverse proxy Nginx: thêm log và timeout hợp lý
Cấu hình cơ bản:
server {
server_name domain.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_connect_timeout 10s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
Nếu thấy nhiều 504 → API/SSR chậm. Đừng chỉ tăng timeout. Cần tìm route chậm.
Xem lỗi Nginx:
tail -f /var/log/nginx/error.logTop status code:
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | headTop IP:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | headNếu bot spam → CPU tăng, log phình, app chậm. Cần rate limit, cache, WAF nhẹ.
Metrics ứng dụng: đừng chỉ nhìn server
Server CPU thấp không có nghĩa app ổn. Cần app metrics:
– Request duration – Error rate – Route latency – DB query duration – Cache hit rate – Queue length – Job failure count – Active users – Login failure spike
Có thể dùng Prometheus + Grafana, nhưng setup nặng hơn. Với team nhỏ, bắt đầu bằng:
– Sentry Performance – Nginx access log analysis – Uptime Kuma response time – DB slow query log – PM2 metrics
Nếu cần Prometheus, expose /api/metrics, dùng prom-client. Nhưng bảo vệ endpoint bằng IP allowlist hoặc auth. Metrics lộ ra public → rủi ro bảo mật.
Alert: ít nhưng đúng
Alert quá nhiều → bị bỏ qua. Alert quá ít → phát hiện muộn.
Nên có alert:
– Website down > 1 phút – Health check 500 – SSL hết hạn 80% – RAM usage > 90% – CPU > 90% trong 5 phút – PM2 restart liên tục – Error rate tăng đột biến – Response time > 2s liên tục – DB connection fail
Kênh alert:
– Telegram: sự cố khẩn – Email: báo cáo – Slack/Discord: team – Phone/SMS: hệ thống quan trọng
Mỗi alert nên có runbook ngắn:
– Lỗi gì? – Xem log ở đâu? – Restart thế nào? – Rollback thế nào? – Ai phụ trách?
Ví dụ runbook:
Alert: Next.js health check 500
1. ssh user@server
2. pm2 status
3. pm2 logs next-app --lines 100
4. tail -f /var/log/nginx/error.log
5. df -h
6. free -m
7. rollback nếu lỗi sau deployDeploy cũng cần monitoring
Nhiều lỗi xuất hiện ngay sau deploy. Cần ghi nhận deploy event.
Sau deploy:
pm2 restart next-app
pm2 status
curl -I https://domain.com
curl https://domain.com/api/healthChecklist:
– Build thành công – App restart thành công – Health check OK – Không tăng 500 – Không tăng memory bất thường – Sentry không báo lỗi mới – Nginx không 502
Nếu dùng Sentry, gắn release theo commit. Khi lỗi tăng, biết ngay version nào gây lỗi.
Backup và monitoring liên quan trực tiếp
Monitoring phát hiện lỗi. Backup giúp phục hồi. Nếu DB hỏng mà không backup → alert chỉ báo tin xấu.
Cần monitor backup:
– Backup có chạy không? – File backup có tạo không? – Dung lượng hợp lý không? – Restore test định kỳ chưa? – Backup có copy ra ngoài VPS không?
VPS chết kéo theo backup local chết. Nên lưu thêm S3, Backblaze, R2, server khác.
Kết luận thực tế
Monitoring cho Next.js trên VPS không cần bắt đầu bằng hệ thống phức tạp. Bắt đầu đúng thứ tự:
1. PM2 → giữ process sống, xem log. 2. Health check → biết app thật sự ổn không. 3. Uptime Kuma → cảnh báo khi web down. 4. Netdata → thấy CPU/RAM/disk/network. 5. Sentry → biết lỗi user gặp. 6. Logrotate → tránh log làm đầy disk. 7. Runbook → xử lý nhanh khi alert đến.
Mục tiêu không phải dashboard đẹp. Mục tiêu: lỗi xảy ra → biết sớm, biết nguyên nhân, biết cách xử lý. Với Next.js chạy trên VPS, chỉ cần vài lớp monitoring đúng chỗ, bạn đã giảm mạnh thời gian downtime, giảm phụ thuộc vào báo lỗi từ user, tăng độ tin cậy cho sản phẩm.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!