Chuyện gì xảy ra khi ứng dụng bỗng dưng “lăn đùng” ra chết?
Chắc hẳn anh em Developer nào cũng từng nếm trải cảm giác này: Code chạy ở local mượt mà, nhưng cứ quăng lên server Linux được vài tiếng là lại “oẳng” không rõ lý do. Có thể do lỗi logic gây tràn RAM, hoặc đơn giản là server tự reboot sau khi update.
Cảnh tượng 2 giờ sáng khách hàng gọi cháy máy vì web sập thực sự là một cơn ác mộng. Lúc này, việc cuống cuồng SSH vào server rồi gõ lệnh chạy lại script thủ công chỉ là giải pháp tình thế. Dù systemd rất mạnh mẽ, nhưng hôm nay mình sẽ giới thiệu một công cụ “mềm” hơn, thân thiện hơn cho anh em: Supervisord. Đây chính là trợ thủ đắc lực giúp ứng dụng của bạn tự đứng dậy sau mỗi lần vấp ngã.
Supervisord là gì và tại sao Developer lại mê nó?
Nói đơn giản, Supervisord là một hệ thống quản lý tiến trình (Process Control System) viết bằng Python. Nó đóng vai trò như một quản gia tận tụy, luôn mắt theo dõi các chương trình bạn giao phó. Nếu một script bị chết, Supervisord sẽ ngay lập tức khởi động lại nó trong tích tắc.
Tại sao không dùng systemd cho rảnh nợ? Thực tế, systemd thiên về quản lý hệ thống cấp thấp của Root. Trong khi đó, Supervisord lại ghi điểm tuyệt đối với Developer nhờ các thế mạnh sau:
- Cấu hình cực dễ: Chỉ cần một file
.confvài dòng là xong, không cần học cú pháp phức tạp của System Unit. - Log không bao giờ đầy ổ cứng: Tự động gom log từ
stdout/stderrvà hỗ trợ xoay vòng (log rotation). Bạn có thể giới hạn mỗi file log chỉ tối đa 50MB. - Trao quyền cho User: Developer có thể tự quản lý tiến trình mà không cần xin quyền sudo/root của sysadmin.
- Quản lý nhóm (Group): Bạn có thể bật/tắt cả một dàn 20-30 worker chỉ bằng một câu lệnh duy nhất.
Kinh nghiệm thực chiến: Bài học từ dàn crawler 50 script
Hồi còn quản lý dàn script crawl dữ liệu cho một dự án thương mại điện tử, mình từng khốn đốn vì log phình to. Trên con server CentOS 7 cũ kỹ với ổ SSD chỉ 20GB, việc script chạy lỗi và ghi log vô tội vạ đã khiến server treo cứng chỉ sau một đêm.
Sau khi chuyển sang Supervisord, mọi thứ thay đổi hoàn toàn. Mình cấu hình mỗi script chỉ được giữ tối đa 5 file log cũ, mỗi file 10MB. Kết quả là ổ cứng luôn dư dả, các bạn Junior trong team cũng tự tin sửa config rồi gõ supervisorctl update mà không sợ làm hỏng hệ thống. Workflow của team mượt mà hơn hẳn 3-4 lần so với trước.
Cài đặt Supervisord chỉ trong 1 phút
Hầu hết các distro Linux hiện nay đều có sẵn Supervisord trong kho ứng dụng chính thức.
Dành cho Ubuntu/Debian
sudo apt update
sudo apt install supervisor
Dành cho CentOS/AlmaLinux/Fedora
sudo yum install epel-release
sudo yum install supervisor
Cài xong, hãy kích hoạt để nó tự chạy mỗi khi khởi động server:
sudo systemctl start supervisord
sudo systemctl enable supervisord
Bí thuật nằm ở file cấu hình
Supervisord quét các file cấu hình tại /etc/supervisor/conf.d/. Đừng viết chung tất cả vào một chỗ, hãy tạo mỗi app một file riêng cho dễ quản lý.
Ví dụ, mình có script Python tại /var/www/myapp/app.py. File cấu hình myapp.conf sẽ trông như thế này:
[program:myapp]
command=/usr/bin/python3 /var/www/myapp/app.py
directory=/var/www/myapp
user=deployuser
autostart=true
autorestart=true
startsecs=10
stderr_logfile=/var/log/myapp/myapp.err.log
stdout_logfile=/var/log/myapp/myapp.out.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=5
Giải thích nhanh các thông số “sống còn”:
- autorestart: Chỉ cần app chết (exit code khác 0), Supervisord sẽ bật lại ngay.
- startsecs=10: App phải chạy ổn định ít nhất 10 giây mới được coi là thành công. Tránh trường hợp app crash liên tục tạo vòng lặp vô tận.
- stdout_logfile_maxbytes=20MB: File log cứ đầy 20MB là tự động nén và tạo file mới. Cực kỳ an toàn!
Vận hành chuyên nghiệp với supervisorctl
Đây là công cụ CLI giúp bạn điều khiển các tiến trình mà không cần động vào file hệ thống. Sau khi sửa file config, bạn chỉ cần báo cho Supervisord biết bằng hai lệnh:
sudo supervisorctl reread
sudo supervisorctl update
Để xem các app đang “sống” hay “chết”, hãy dùng:
sudo supervisorctl status
Mẹo nhỏ: Bạn có thể xem log thời gian thực của app mà không cần tìm file bằng lệnh tail:
sudo supervisorctl tail -f myapp
Xử lý hàng đợi (Queue) với số lượng lớn
Nếu bạn làm Laravel hoặc Node.js và cần chạy khoảng 10-20 Worker xử lý job cùng lúc, đừng copy config ra nhiều file. Hãy dùng numprocs:
[program:laravel-worker]
command=php /var/www/project/artisan queue:work
process_name=%(program_name)s_%(process_num)02d
numprocs=10
autostart=true
autorestart=true
user=www-data
Với cấu hình trên, Supervisord sẽ tự động tạo ra 10 tiến trình worker chạy song song. Nếu một cái bị treo, 9 cái còn lại vẫn hoạt động bình thường, đảm bảo hệ thống không bao giờ bị nghẽn cổ chai.
Tạm kết
Sử dụng Supervisord không chỉ giúp server ổn định hơn mà còn giúp bạn ngủ ngon hơn mỗi đêm. Nó giải quyết triệt để vấn đề ứng dụng “chết yểu” và quản lý log bừa bãi mà không yêu cầu kỹ năng sysadmin quá sâu.
Anh em hãy thử áp dụng ngay vào dự án sắp tới. Nếu gặp lỗi gì khi cấu hình các ứng dụng phức tạp như Docker hay Go, cứ để lại comment phía dưới mình sẽ hỗ trợ. Chúc anh em quản lý server thật nhàn hạ!

