Đừng để ‘python main.py’ làm khó bạn trên production
Nếu bạn từng thắc mắc tại sao app chạy mượt ở máy mình nhưng lên server lại ‘sập’ khi có vài chục người truy cập, thì đây là bài viết dành cho bạn. Thói quen chạy ứng dụng bằng lệnh python app.py ngay trên server là một cái bẫy. Ở môi trường local, nó giúp bạn debug nhanh nhờ tính năng auto-reload. Tuy nhiên, đưa nguyên si cách làm này lên môi trường thực tế sẽ khiến hệ thống cực kỳ mong manh.
Server tích hợp của Flask hay Django thường chỉ có một luồng (single-threaded). Nếu gặp 10 request nặng cùng lúc, ứng dụng rất dễ ‘nghẹt thở’ và treo cứng. Sau 2 năm sử dụng Fedora làm workstation chính, mình nhận thấy tốc độ cập nhật package ở đây rất tuyệt vời. Nhưng cũng vì package luôn mới, việc cấu hình cần sự tỉ mỉ. Để app chịu tải tốt, chúng ta cần mô hình chuẩn: App Python <—> Gunicorn (WSGI) <—> Nginx (Reverse Proxy).
Bước 1: Chuẩn bị môi trường trên Fedora Server
Hãy bắt đầu bằng việc cập nhật hệ thống. Fedora ra bản vá rất nhanh, đừng bỏ lỡ chúng.
sudo dnf update -y
sudo dnf install python3-pip python3-devel nginx -y
Một quy tắc bất biến: Luôn dùng môi trường ảo (Virtual Environment). Việc cài thư viện trực tiếp vào Python hệ thống rất dễ làm hỏng các công cụ quản trị của Fedora như DNF vốn cũng chạy trên nền Python.
mkdir ~/my_app && cd ~/my_app
python3 -m venv venv
source venv/bin/activate
pip install gunicorn flask
Bước 2: Để Systemd quản lý Gunicorn
Gunicorn sẽ tạo ra các “worker” (tiến trình con) để xử lý yêu cầu. Thay vì chạy lệnh thủ công, chúng ta sẽ giao phó việc này cho systemd. Nó sẽ giúp ứng dụng tự khởi động lại sau khi crash hoặc reboot server.
Tạo file: /etc/systemd/system/my_app.service
[Unit]
Description=Gunicorn instance serving my_app
After=network.target
[Service]
User=fedora
Group=fedora
WorkingDirectory=/home/fedora/my_app
Environment="PATH=/home/fedora/my_app/venv/bin"
ExecStart=/home/fedora/my_app/venv/bin/gunicorn --workers 3 --bind unix:my_app.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target
Con số thực tế: Với --workers 3, mình áp dụng công thức (2 x số core CPU) + 1. Ví dụ, nếu bạn dùng gói VPS 1 CPU, 3 worker là con số lý tưởng. Mỗi worker Gunicorn thường ngốn từ 50MB đến 100MB RAM tùy vào độ nặng của ứng dụng, nên hãy cân đối với tài nguyên bạn có.
Bước 3: Nginx – Chốt chặn bảo mật ở tiền tuyến
Tại sao không để người dùng kết nối thẳng vào Gunicorn? Vì Nginx xử lý file tĩnh (ảnh, CSS) nhanh hơn gấp nhiều lần. Nó còn hỗ trợ nén Gzip, giới hạn request và bảo vệ app khỏi các kiểu tấn công HTTP cơ bản.
Cấu hình file tại: /etc/nginx/conf.d/my_app.conf
server {
listen 80;
server_name domain_cua_ban.com;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://unix:/home/fedora/my_app/my_app.sock;
}
location /static/ {
alias /home/fedora/my_app/static/;
}
}
Lưu ý: Trên Fedora, Nginx không có sẵn file proxy_params như Ubuntu, nên mình đã thêm trực tiếp các header quan trọng vào block trên.
sudo nginx -t && sudo systemctl restart nginx
Bước 4: Đặc sản Fedora – “Trị” lỗi 502 do SELinux
Nếu bạn thấy lỗi 502 Bad Gateway dù mọi thứ trông có vẻ ổn, thủ phạm chính là SELinux. Fedora mặc định bật chế độ bảo mật nghiêm ngặt, ngăn Nginx đọc file socket trong thư mục home của user.
Thay vì tắt hẳn SELinux (rất mất an toàn), hãy cấp quyền cho nó một cách chính quy:
# Cho phép Nginx kết nối mạng
sudo setsebool -P httpd_can_network_connect 1
# Cấp quyền cho Nginx truy cập vào socket
sudo chcon -t httpd_sys_rw_content_t /home/fedora/my_app/my_app.sock
Để ổn định lâu dài, mình khuyên bạn nên di chuyển socket vào /run/my_app/. Đây là nơi các dịch vụ hệ thống thường đặt file giao tiếp, giúp tránh được các rắc rối về quyền hạn của thư mục người dùng.
Kiểm tra và Giám sát
Khi mọi thứ đã vận hành, việc quan sát log là bắt buộc. Mình thường dùng lệnh sau để theo dõi lỗi phát sinh theo thời gian thực:
sudo journalctl -u my_app -f
Nếu thấy CPU tăng vọt, hãy dùng htop. Fedora hiển thị các thread rất rõ ràng, giúp bạn biết chính xác worker nào đang bị treo do lỗi logic trong code. Triển khai ứng dụng không khó, quan trọng là sự phối hợp nhịp nhàng giữa code và hạ tầng. Chúc anh em setup thành công!

