Những lỗi thường gặp khi chạy Next.js trên VPS và cách xử lý nhanh
Deploy Next.js lên VPS nghe có vẻ “đơn giản”: build, chạy npm start, trỏ domain, xong. Thực tế khác hẳn. App chạy tốt ở local nhưng lên VPS lại dính đủ lỗi: cổng không mở, 502 Bad Gateway, thiếu biến môi trường, build fail vì thiếu RAM, static file không tải, SSR lỗi âm thầm, reverse proxy cấu hình sai → SEO, hiệu năng, trải nghiệm người dùng cùng bị ảnh hưởng.
Bài này tập trung vào các lỗi phổ biến nhất khi chạy Next.js trên VPS, vì sao chúng xảy ra, dấu hiệu nhận biết, cách xử lý nhanh và cách phòng tránh để hệ thống ổn định hơn.
1. App chạy local ổn, lên VPS lại không truy cập được
Dấu hiệu
– Truy cập domain/IP → timeout.
– curl localhost:3000 trên VPS có phản hồi, nhưng ngoài Internet không vào được.
– Nginx/Apache báo upstream unavailable.
Nguyên nhân thường gặp
– App chỉ bind vào 127.0.0.1, không lắng nghe 0.0.0.0.
– Firewall VPS chặn port.
– Security Group/cloud firewall chưa mở 80, 443, 3000.
– Reverse proxy trỏ sai port.
– Dùng pm2 hoặc systemd để app tự restart khi crash.
– Không chạy app bằng SSH session rồi đóng terminal.
3. Thiếu biến môi trường khi build hoặc runtime
Dấu hiệu
– Build fail: undefined.
– SSR lỗi Cannot read properties of undefined.
– App gọi API sai URL, auth fail, DB fail.
Nguyên nhân
– .env.local ở local có, VPS không có.
– Nhầm giữa env server-side và client-side.
– Quên prefix NEXT_PUBLIC_ cho biến cần dùng ở frontend.
– Update env nhưng chưa restart app.
Cách xử lý nhanh
1. Kiểm tra file env trên VPS.
2. In thử biến quan trọng:
echo $NODE_ENV
3. Với biến dùng trong browser:
– Phải là NEXT_PUBLIC_API_URL
4. Sau khi sửa env:
npm run build
pm2 restart all
Lưu ý quan trọng
– NEXT_PUBLIC_* → đóng gói ra client.
– Biến bí mật như DB password, JWT secret → không dùng prefix này.
Mẹo phòng tránh
– Tạo file checklist env cho từng môi trường: dev, staging, production.
– Deploy xong luôn verify các biến tối quan trọng.
4. Build fail vì thiếu RAM hoặc VPS quá yếu
Dấu hiệu
– next build bị kill giữa chừng.
– Log có Killed.
– VPS treo, swap tăng mạnh, CPU full.
Nguyên nhân
– VPS RAM thấp: 512MB–1GB rất dễ fail.
– App nhiều page, nhiều package nặng.
– Chạy build cùng nhiều service khác.
– VPS production cho Next.js nên có tối thiểu 2GB RAM nếu app SSR trung bình.
– Build ở CI/CD rồi chỉ đưa artifact lên VPS nếu hạ tầng yếu.
– Dọn log, cache, package thừa định kỳ.
5. Static file, ảnh, CSS không tải đúng
Dấu hiệu
– Giao diện vỡ.
– File trong /_next/static/... trả 404.
– Ảnh từ next/image không hiện.
Nguyên nhân
– Nginx cấu hình sai path/proxy.
– Deploy thiếu thư mục .next.
– Sai basePath hoặc assetPrefix.
– Domain ảnh ngoài chưa khai báo trong next.config.js.
Cách xử lý nhanh
1. Kiểm tra file build tồn tại:
ls -la .next
2. Nếu dùng next/image, khai báo domain:
images: {
domains: ['example.com']
}
3. Nếu app nằm sau subpath như /app, kiểm tra:
– basePath
– assetPrefix
4. Nếu Nginx có rule rewrite custom, test kỹ để không chặn /_next/static.
Mẹo phòng tránh
– Không tự tối ưu Nginx quá sớm nếu chưa hiểu flow static của Next.js.
– Sau mỗi deploy, test ngay:
– trang chủ
– 1 trang SSR
– 1 ảnh
– 1 file CSS/JS
6. Lỗi permission: app không đọc/ghi được file
Dấu hiệu
– Upload fail.
– Log fail.
– PM2/systemd không đọc được thư mục dự án.
– Build fail do quyền sở hữu sai.
Nguyên nhân
– Copy file bằng root, chạy app bằng user khác.
– Thư mục dự án, log, upload không cùng owner.
– Test login/logout sau khi bật HTTPS.
– Kiểm tra cookie secure trong production.
9. Hiệu năng kém: CPU cao, phản hồi chậm
Dấu hiệu
– TTFB cao.
– VPS CPU spike khi nhiều request.
– Trang SSR chậm rõ rệt.
Nguyên nhân
– Quá nhiều SSR nặng.
– Query DB/API chậm.
– Không cache.
– VPS cấu hình yếu so với traffic.
Cách xử lý nhanh
– Dùng next build chuẩn production.
– Ưu tiên SSG/ISR cho trang ít thay đổi.
– Cache ở Nginx/CDN khi phù hợp.
– Giảm log debug.
– Profile các API/server component chậm.
Mẹo phòng tránh
– Không dùng SSR cho mọi trang.
– Theo dõi tài nguyên:
htop
pm2 monit
Checklist xử lý nhanh khi Next.js lỗi trên VPS
Khi web “sập”, đi theo thứ tự này:
1. App còn chạy không?
pm2 status
ss -tulpn | grep 3000
2. Build có thành công không?
ls .next
3. Env đủ chưa?
4. Nginx đúng config chưa?
nginx -t
5. Log báo gì?
pm2 logs
tail -f /var/log/nginx/error.log
6. RAM/CPU/Disk ổn không?
free -h
df -h
top
Kết luận
Phần lớn lỗi khi chạy Next.js trên VPS không nằm ở framework, mà ở “vùng tiếp giáp” giữa app và hạ tầng: reverse proxy, port, env, RAM, quyền file, SSL, process manager. Hiểu đúng các điểm này → thời gian xử lý sự cố giảm rất mạnh.
Cách tiếp cận thực tế nhất: chuẩn hóa quy trình deploy, luôn dùng pm2 hoặc systemd, kiểm tra log theo lớp app → port → proxy → domain, và giữ một checklist debug ngắn cho production. Làm được vậy, Next.js trên VPS hoàn toàn có thể ổn định, nhanh, dễ vận hành, kể cả với đội nhỏ hoặc dự án tự quản trị.
Nếu muốn, tôi có thể viết tiếp một bài companion: “Quy trình deploy Next.js lên VPS với Nginx + PM2 + SSL từ A-Z” dạng thực chiến.