Cài đặt và cấu hình Gunicorn cho môi trường Production
Chúng ta cần thay thế server phát triển mặc định của FastAPI/Flask bằng Gunicorn. Gunicorn là một WSGI HTTP Server chuẩn, tối ưu cho việc chạy ứng dụng Python trên Linux trong môi trường production, hỗ trợ đa tiến trình (multi-process) để xử lý tải cao.
Cài đặt Gunicorn và các thư viện phụ thuộc cần thiết vào môi trường virtual environment đã được tạo ở Phần 3.
source /home/user/my-venv/bin/activate && pip install gunicorn
Kiểm tra phiên bản Gunicorn đã được cài đặt thành công. Kết quả mong đợi là hiển thị số phiên bản hiện hành.
gunicorn --version
Test chạy ứng dụng với Gunicorn
Trước khi cấu hình systemd, hãy thử chạy ứng dụng trực tiếp với Gunicorn để đảm bảo điểm entry (entrypoint) của ứng dụng FastAPI/Flask đúng. Giả sử file chính của bạn là `main.py` và ứng dụng là biến `app`.
cd /home/user/my-ai-app && gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 127.0.0.1:8000 main:app
Giải thích tham số: -w 4 tạo 4 worker process, -k uvicorn.workers.UvicornWorker sử dụng worker ASYNC phù hợp cho FastAPI, -b 127.0.0.1:8000 bind vào localhost cổng 8000.
Kết quả mong đợi: Terminal hiển thị log "Worker process started" và "Uvicorn running on http://127.0.0.1:8000". Nhấn Ctrl+C để dừng sau khi kiểm tra.
Cấu hình Nginx làm Reverse Proxy
Cài đặt và khởi động Nginx
Cài đặt Nginx từ kho mặc định của Ubuntu 24.04 và kích hoạt dịch vụ để chạy ngay lập tức.
sudo apt update && sudo apt install nginx -y && sudo systemctl enable --now nginx
Khởi động và bật tự động Nginx. Kết quả mong đợi là dịch vụ Nginx chuyển sang trạng thái "active (running)".
sudo systemctl status nginx
Tạo cấu hình Server Block cho ứng dụng AI
Tạo file cấu hình riêng biệt cho ứng dụng của bạn thay vì chỉnh sửa file mặc định. Điều này giúp quản lý dễ dàng và tránh xung đột.
sudo nano /etc/nginx/sites-available/ai-app
Dán toàn bộ nội dung cấu hình sau vào file, thay đổi server_name bằng tên miền hoặc IP thực tế của bạn.
server {
listen 80;
server_name your-server-ip;
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 300;
}
location /health {
proxy_pass http://127.0.0.1:8000/health;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Cấu hình này chuyển tiếp tất cả request từ cổng 80 của Nginx sang Gunicorn chạy trên cổng 8000. Tham số proxy_read_timeout 300 tăng thời gian chờ phản hồi lên 5 phút, rất quan trọng cho các request AI (RAG) thường mất thời gian xử lý.
Link cấu hình mới vào thư mục sites-enabled để kích hoạt.
sudo ln -s /etc/nginx/sites-available/ai-app /etc/nginx/sites-enabled/
Khử file mặc định của Nginx để tránh xung đột cổng 80.
sudo rm /etc/nginx/sites-enabled/default
Kiểm tra cú pháp cấu hình Nginx trước khi reload.
sudo nginx -t
Kết quả mong đợi: Hiển thị "syntax is ok" và "test is successful".
Reload Nginx để áp dụng thay đổi mà không làm gián đoạn dịch vụ.
sudo systemctl reload nginx
Cấu hình Systemd Service cho Gunicorn
Tạo file Unit file cho Gunicorn
Để Gunicorn tự động khởi động cùng server và được quản lý bởi systemd, chúng ta cần tạo một file service unit. File này sẽ chạy Gunicorn với các tham số production đã xác định ở phần trên.
sudo nano /etc/systemd/system/gunicorn.service
Dán nội dung hoàn chỉnh sau vào file. Lưu ý thay đổi User, WorkingDirectory và ExecStart cho đúng với user và đường dẫn dự án của bạn.
[Unit]
Description=Gunicorn instance to serve AI App
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/my-ai-app
Environment="PATH=/home/ubuntu/my-ai-app/my-venv/bin"
ExecStart=/home/ubuntu/my-ai-app/my-venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 127.0.0.1:8000 main:app
[Install]
WantedBy=multi-user.target
Giải thích: User=ubuntu là user chạy app (không dùng root), Group=www-data để Nginx có quyền truy cập socket nếu cần, Environment đảm bảo dùng đúng virtual environment.
Reload systemd manager configuration để nhận diện file service mới.
sudo systemctl daemon-reload
Enable và start dịch vụ Gunicorn.
sudo systemctl enable --now gunicorn
Kiểm tra trạng thái dịch vụ Gunicorn.
sudo systemctl status gunicorn
Kết quả mong đợi: Trạng thái "active (running)" và log cho thấy các worker đã khởi tạo.
Verify và kiểm tra toàn bộ hệ thống
Kiểm tra kết nối từ Nginx đến Gunicorn
Sử dụng curl để truy cập vào server từ bên ngoài (hoặc localhost nếu đang test trên chính server đó) qua cổng 80. Nginx sẽ proxy request sang Gunicorn.
curl -v http://your-server-ip/health
Kết quả mong đợi: HTTP 200 OK và nội dung phản hồi từ ứng dụng FastAPI (thường là JSON {"status": "ok"} hoặc tương tự).
Quan sát header response để xác nhận Nginx đang xử lý request.
curl -I http://your-server-ip/
Kết quả mong đợi: Header Server: nginx xuất hiện trong response.
Kiểm tra log khi có lỗi
Nếu ứng dụng không chạy, kiểm tra log của Gunicorn để tìm lỗi Python hoặc lỗi cấu hình.
sudo journalctl -u gunicorn -f
Đồng thời kiểm tra log của Nginx nếu có lỗi 502 Bad Gateway (thường do Gunicorn không chạy).
sudo tail -f /var/log/nginx/error.log
Khởi động lại Gunicorn nếu cần thiết sau khi sửa lỗi.
sudo systemctl restart gunicorn
Điều hướng series:
Mục lục: Series: Triển khai Database AI với LangChain, PostgreSQL và Ubuntu 24.04
« Phần 5: Triển khai ứng dụng RAG với LangChain và PostgreSQL
Phần 7: Tối ưu hiệu năng, bảo mật và xử lý sự cố »