Cài đặt Gunicorn Thêm Gunicorn vào requirements - lịch bóng đá ngoại hạng anh

/imgposts/eaj26ivr.jpg

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à:

  1. Tìm cách triển khai Flask phù hợp cho môi trường sản xuất
  2. Phù hợp với cấu trúc triển khai Docker

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:

  1. Mô hình đa tiến trình: Gunicorn sử dụng mô hình đa tiến trình để xử lý các yêu cầu đồng thời. Nó tạo ra nhiều tiến trình con để xử lý các yêu cầu từ client. Mỗi tiến trình con là một worker độc lập có khả năng xử lý một hoặc nhiều yêu cầu cùng lúc.
  2. Tiến trình chính và tiến trình làm việc: Khi khởi động, Gunicorn sẽ tạo ra một tiến trình chính và nhiều tiến trình làm việc. Tiến trình chính chịu trách nhiệm lắng nghe các yêu cầu mạng và phân phối chúng cho các tiến trình làm việc. Các tiến trình làm việc thực hiện việc xử lý các yêu cầu cụ thể.
  3. Lắng nghe cổng và cân bằng tải: Tiến trình chính sẽ lắng nghe trên một hoặc nhiều giao diện mạng để nhận các yêu cầu từ client. Khi một yêu cầu đến, tiến trình chính sẽ sử dụng thuật toán cân bằng tải (như vòng tròn hoặc số kết nối đồng thời) để phân phối yêu cầu cho các tiến trình làm việc sẵn sàng. Điều này giúp phân bổ yêu cầu một cách cân đối và xử lý chúng đồng thời.
  4. Các tiến trình làm việc độc lập: Mỗi tiến trình làm việc đều hoạt động độc lập trong không gian tiến trình riêng của mình và xử lý các yêu cầu được phân công. Vì mỗi tiến trình làm việc đều độc lập, chúng không chia sẻ bộ nhớ với nhau, từ đó đảm bảo sự cô lập và an toàn trong quá trình xử lý yêu cầu.
  5. I/O không chặn: Gunicorn sử dụng I/O không chặn (Non-blocking I/O) để cải thiện hiệu suất đa luồng. Các tiến trình làm việc xử lý yêu cầu và phản hồi theo cách không chặn, có nghĩa là chúng có thể xử lý các yêu cầu khác trong khi chờ đợi các thao tác I/O (như đọc/ghi file hoặc giao tiếp mạng), nhờ đó tăng cường thông lượng và tốc độ phản hồi của hệ thống.

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!