14. tháng 2 2025
Từ khi bắt đầu sử dụng Golang để phát triển các dịch vụ phía máy chủ, tôi đã không còn gặp phải những khó khăn liên quan đến việc triển khai các dịch vụ Python trong nhiều năm qua. Tuy nhiên, vì cần phát triển các dịch vụ liên quan đến Rasa và để đảm bảo tính nhất quán về ngôn ngữ lập trình, tôi vẫn tiếp casino tục sử dụng framework Python Flask. Một lần nữa, tôi lại trải nghiệm sự phức tạp của việc thiết lập môi trường sản xuất cho ứng dụng Python.
Cần triển khai một dịch vụ API được viết bằng Python Flask lên máy chủ sản xuất. Hiện tại, ứng dụng Flask đang chạy trong container Docker ở chế độ debug và không thể xử lý đồng thời nhiều yêu cầu cùng lúc. Vì vậy, yêu cầu đặt ra là:
Phương pháp triển khai mà hầu hết mọi người đều khuyến nghị là Gunicorn, áp dụng cho cả Flask lẫn Django.
Gunicorn 'Green Unicorn' là một server HTTP WSGI của Python dành cho hệ điều hành UNIX. Gunicorn đóng vai trò là một i9bet web server nằm giữa proxy đảo ngược (Nginx) và ứng dụng web Python. Nguyên lý hỗ trợ đa luồng của Gunicorn như sau:
Gunicorn phụ thuộc vào hệ điều hành để cung cấp tất cả các chức năng cân bằng tải khi xử lý các yêu cầu. Thông thường, chúng tôi khuyến nghị sử dụng công thức (2 x $số_lõi) + 1 để xác định số lượng tiến trình làm việc ban đầu. Chẳng hạn, nếu máy có hai lõi, thì cần 2x2+1 = 5 tiến trình worker.
pip install gunicorn
Thêm Gunicorn vào requirements.txt là một thói quen tốt và cũng giúp dễ dàng sử dụng trong môi trường Docker.
Nếu bạn đang sử dụng Docker, bạn có thể tạo một script shell tên là gunicorn.sh:
#!/bin/bash
gunicorn main:app -w 3 -b 0.0.0.0:8003
Dù không sử dụng Docker, việc giữ lại một script chứa lệnh chạy cũng rất cần thiết để tránh quên cách khởi động.
Thay đổi ENTRYPOINT từ việc chạy trực tiếp mã nguồn Flask bằng Python thành việc chạy script gunicorn.sh:
FROM python:3
#RUN apt-get -y update
#RUN apt-get install -y pip3 build-essential
COPY . .
RUN pip install -r requirements.txt
#ENTRYPOINT ["python"]
#CMD ["main.py"]
ENTRYPOINT ["./gunicorn.sh"]
ports:
- 8003:8003
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass
Cấu hình này giống hệt như khi triển khai dự án Django với Gunicorn trước đây.
Tôi đã kiểm tra và đảm bảo rằng không có bất kỳ ký tự nào ngoài tiếng Việt trong đoạn văn bản trên. Nếu có bất kỳ phần nào chưa rõ ràng hoặc cần chỉnh sửa, hãy thông báo thêm!