Deploy Ứng Dụng Python Flask Lên VPS TrumVPS - Production-Ready Với Gunicorn & Nginx
Bạn đã viết xong API Flask hay Django app, chạy python app.py trên local ngon lành. Nhưng làm sao để deploy lên production, chạy 24/7, chịu được hàng nghìn request? Cùng deploy ứng dụng Python lên VPS TrumVPS với stack Gunicorn + Nginx + systemd — chuẩn production, không lo crash!
Tại Sao Cần Gunicorn & Nginx?
Flask dev server (app.run()) chỉ dành cho development, không chịu được production load. Để ứng dụng Python chạy ổn định:
- Gunicorn: WSGI server, quản lý multiple worker processes, auto restart khi crash
- Nginx: Reverse proxy, xử lý static files, SSL termination, rate limiting
- systemd: Quản lý Gunicorn như system service, auto-start khi reboot
Yêu Cầu
- VPS TrumVPS với Ubuntu 22.04 (khuyến nghị 1GB RAM+)
- Python 3.8+ đã cài đặt
- Domain đã trỏ DNS về VPS (nếu cần HTTPS)
- Code Flask app đã sẵn sàng
Bước 1: Chuẩn Bị Môi Trường Python
Cập nhật hệ thống và cài dependencies:
apt update && apt install -y python3 python3-pip python3-venv python3-dev build-essential nginx
Tạo thư mục app và virtual environment:
mkdir -p /var/www/myapp && cd /var/www/myapp
python3 -m venv venv && source venv/bin/activate
pip install flask gunicorn
Bước 2: Tạo Flask App Mẫu
Tạo file app.py:
nano /var/www/myapp/app.py
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/')
def home():
return jsonify({"status":"ok","message":"Flask API on VPS TrumVPS 🚀"})
@app.route('/api/hello')
def hello():
name = request.args.get('name', 'World')
return jsonify({"hello": name, "server": "TrumVPS"})
if __name__ == '__main__':
app.run()
Test nhanh:
python3 app.py
Mở browser hoặc curl http://your-ip:5000 — nếu thấy JSON response là OK!
Bước 3: Chạy Với Gunicorn
Test Gunicorn (vẫn trong môi trường ảo):
gunicorn --bind 0.0.0.0:8000 app:app
Truy cập http://your-ip:8000 để kiểm tra. Ctrl+C để dừng.
Cấu Hình Gunicorn Worker
Số worker khuyến nghị: (2 × số CPU core) + 1
Ví dụ VPS 2 core: dùng 5 workers.
gunicorn --bind 0.0.0.0:8000 --workers 5 --timeout 120 app:app
Bước 4: Tạo systemd Service
Để Gunicorn chạy vĩnh viễn và tự restart:
nano /etc/systemd/system/myapp.service
Dán nội dung:
[Unit]
Description=Gunicorn instance to serve myapp
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/var/www/myapp
Environment="PATH=/var/www/myapp/venv/bin"
ExecStart=/var/www/myapp/venv/bin/gunicorn --workers 5 --bind 127.0.0.1:8000 --timeout 120 --access-logfile /var/log/myapp-access.log --error-logfile /var/log/myapp-error.log app:app
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
⚠️ Quan trọng: Bind vào 127.0.0.1:8000 (local only), không phải 0.0.0.0. Chỉ Nginx mới expose ra ngoài!
Kích hoạt service:
systemctl daemon-reload
systemctl enable myapp && systemctl start myapp
systemctl status myapp
Bước 5: Cấu Hình Nginx Reverse Proxy
Tạo file cấu hình Nginx:
nano /etc/nginx/sites-available/myapp
Dán nội dung:
server {
listen 80;
server_name yourdomain.com;
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:8000;
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_read_timeout 120s;
}
location /static/ {
alias /var/www/myapp/static/;
expires 30d;
}
}
Kích hoạt site:
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Truy cập http://yourdomain.com — Flask app đã chạy qua Nginx!
Bước 6: Thêm SSL Với Let's Encrypt
apt install -y certbot python3-certbot-nginx
certbot --nginx -d yourdomain.com
Chọn redirect HTTP → HTTPS (option 2). Xong!
Deploy Django App (Tương Tự)
Với Django, thay Gunicorn command thành:
ExecStart=/var/www/myapp/venv/bin/gunicorn --workers 5 --bind 127.0.0.1:8000 myproject.wsgi:application
Nhớ cài dependencies: pip install django gunicorn và chạy python manage.py collectstatic trước khi deploy.
Auto Deploy Với Git
Mỗi lần update code, chỉ cần:
cd /var/www/myapp
git pull origin main
source venv/bin/activate && pip install -r requirements.txt
systemctl restart myapp
Hoặc tạo script update.sh tự động hóa 4 bước trên. Kết hợp với GitHub Actions để auto deploy khi push code (xem bài CI/CD).
Monitoring & Log
- Xem log Gunicorn:
journalctl -u myapp -f - Xem log truy cập:
tail -f /var/log/myapp-access.log - Monitor resource: Dùng Netdata hoặc Uptime Kuma để theo dõi CPU/RAM app
- Graceful restart:
systemctl reload myapp(không drop connection)
Xử Lý Lỗi Thường Gặp
- 502 Bad Gateway: Gunicorn không chạy →
systemctl status myappkiểm tra lỗi - Permission denied: Folder app không có quyền www-data →
chown -R root:www-data /var/www/myapp - ModuleNotFoundError: Thiếu dependency → kích hoạt venv rồi
pip install -r requirements.txt - Static files 404: Sai path trong Nginx config → kiểm tra alias path
Cần VPS ổn định deploy Flask/Django app 24/7?
TrumVPS - NVMe SSD, uptime 99.9%, hỗ trợ đầy đủ Python/Node.js - Từ 40K/tháng!
Mã giảm giá: 42089QPI03TI (-9%)
THUÊ VPS NGAY