Cách deploy FastAPI trên cPanel bằng Uvicorn

Khi bạn mới bắt đầu với FastAPI nhưng lại quen thuộc với cPanel của hosting thay vì VPS/Server thì bạn vẫn có thể deploy FastAPI trên cPanel bằng Uvicorn thay vì WSGI. Chúng ta không cần một hosting chuyên dụng cho Python. Hãy làm theo hướng dẫn dưới đây để tiết kiệm thời gian và ngân sách của bạn.

Deploy FastAPI trên cPanel

Để nhanh chóng Deploy FastAPI trên cPanel, chúng ta sẽ bắt đầu với một dự án FastAPI đơn giản có 2 file như sau:

main.py

from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}


@app.post("/items/")
async def create_item(item: Item):
    return item

requirements.txt

fastapi
pydantic
uvicorn
Dự án đơn giản để làm ví dụ deploy FastAPI trên cPanel
Dự án đơn giản để làm ví dụ deploy FastAPI trên cPanel

Bước 1: Hãy đảm bảo bạn đã trỏ tên miền về đúng IP của hosting và thêm tên miền vào hosting. Đừng quên cài SSL cho website trong cPanel để bật giao thức an toàn HTTPS cho tên miền.

Thêm tên miền cho ứng dụng FastAPI của bạn
Thêm tên miền cho ứng dụng FastAPI của bạn

Bước 2: Tải các file trong dự án của bạn vào thư mục của tên miền trong File Manager.

Tải source code của dự án FastAPI vào thư mục của tên miền
Tải source code của dự án FastAPI vào thư mục của tên miền

Bước 3: Tạo một ứng dụng Python. Hãy vào mục Setup Python App trong cPanel.

Vào Setup Python App để deploy một ứng dụng Python
Vào Setup Python App để deploy một ứng dụng Python

Nhấp nút CREATE APPLICATION để tạo một ứng dụng Python trong cPanel.

Nhấp nút CREATE APPLICATION
Nhấp nút CREATE APPLICATION

Chỉ cần điền thông tin Application rootApplication URL là tên miền của bạn rồi nhấp nút CREATE. Bạn không cần bận tâm các trường thông tin khác.

Chỉ cần điền Application root và Application URL
Chỉ cần điền Application root và Application URL

Bước 4: Cài đặt các package trong file requirements.txt. Bước này gồm 2 bước nhỏ như sau:

  1. Gõ “requirements.txt” và nhấp nút Add.
  2. Nhấp vào nút Run Pip Install và chọn requirements.txt.
Cài đặt các package Python
Cài đặt các package Python

Bước 5: Nhấp nút STOP APP và sao chép command truy cập vào virtual environment của ứng dụng.

Lý do cần stop là vì FastAPI không hoạt động tốt với WSGI. Cho dù bạn đã cấu hình file passenger_wsgi.py thế nào thì vẫn bị lỗi như [UID:1003][2014879] Child process with pid: 2021889 was killed by signal: 15, core dumped: no. Chúng ta chỉ mượn Setup Python App để tạo một virtual environment hợp lệ trên cPanel.

Stop App và sao chép command trên cPanel
Stop App và sao chép command trên cPanel

Bước 6: Chạy FastAPI trong Terminal.

Mở Terminal trong cPanel.

Vào Terminal trên cPanel
Vào Terminal trên cPanel

Tạo một screen mới. Mình sẽ giới thiệu về command screen chi tiết hơn ở cuối bài viết. Tạm thời bạn cứ làm theo hướng dẫn. Hãy thay myfastapi thành bất cứ tên nào bạn muốn.

screen -S myfastapi

Dán và chạy command mà bạn đã sao chép ở bước 5, bạn cũng có thể cài thêm các package khác với Pip tại chổ này. Sau đó chạy Uvicorn bằng command này.

uvicorn main:app --host 0.0.0.0 --port 8000

Nếu bạn bị lỗi “address already in use” thì có nghĩa là đã có một ứng dụng khác đang chạy với local IP này. Bạn chỉ cần tăng port lên là được, ví dự như 8001.

Deploy FastAPI trên cPanel chạy với Uvicorn
Deploy FastAPI trên cPanel chạy với Uvicorn

Khi Terminal không còn lỗi thì hãy truy cập FastAPI của bạn ở định dạng domain:port hoặc domain:port/docs. Thật tuyệt vời vì cuối cùng FastAPI của bạn đã hoạt động, nhưng nó vẫn còn hai vấn đề cần xử lý.

  1. Chưa có HTTPS (SSL) khiến cho trình duyệt hiển thị “Not Secure”.
  2. Phần Port phía sau khiến URL trông không chuyên nghiệp và chưa hoàn thiện.
FastAPI đã hoạt động với trên cPanel
FastAPI đã hoạt động với trên cPanel

Detach screen trước khi đóng Terminal. Nhấn tổ hợp phím Ctrl + A, sau đó nhấn phím D để detach screen hiện tại.

Detach screen đang chạy FastAPI
Detach screen đang chạy FastAPI

Bước 7: Kích hoạt HTTPS và cài đặt proxy cho tên miền trỏ về địa chỉ FastAPI ở local. Hãy thêm đoạn code này vào file .htaccess trong thư mục của tên miền. Nhớ thay fastapi.lucidgen.com:8001 thành địa chỉ local FastAPI của bạn.

RewriteEngine On

# Force HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Reverse Proxy
RewriteRule ^(.*)$ http://fastapi.lucidgen.com:8001/$1 [P,L]
Bật HTTPS và bỏ Port cho khi truy cập FastAPI
Bật HTTPS và bỏ Port cho khi truy cập FastAPI

Nếu bạn không thấy file .htaccess thì có thể nó bị ẩn, nhấp vào nút Settings và bật Show Hidden Files (dotfiles) để hiển thị các file ẩn trong File Manager. Nếu hoàn toàn không có file .htaccess thì bạn cứ tạo nó.

Bước 8: Truy cập tên miền FastAPI chính thức của bạn. Lúc này HTTPS đã được bật và Port cũng không còn trong URL.

FastAPI đã được deploy hoàn thiện trên cPanel
FastAPI đã được deploy hoàn thiện trên cPanel

Giải thích về screen

Command screen dùng để lưu lại phiên làm việc của bạn trong Terminal, khi bạn tắt và mở lại Terminal, bạn có thể dễ dàng quay lại màn hình của phiên làm việc trước đó.

CommandChức năng
screen -S myfastapiTạo screen mới tên myfastapi
screen -lsLiệt kê tất cả các screen đang chạy
screen -r myfastapiQuay lại screen myfastapi đang chạy
Ctrl + A, DThoát screen nhưng giữ tiến trình chạy
exitThoát và đóng screen

Chúng ta nên dùng screen vì 2 lý do sau:

  1. Bạn dễ dàng tắt và khởi động lại FastAPI của bạn. Chỉ cần quay lại screen đang chạy FastAPI và nhấn Ctrl + C để tắt FastAPI.
  2. Tránh bị lỗi CORS với POST khi bạn đã cấu hình allow_origins trong add_middleware của FastAPI. Đây chỉ là trải nghiệm của mình khi không dùng screen mà đóng Terminal, có thể bạn sẽ không gặp vấn đề này.

Lời kết

Mình chỉ vô tình nghĩ ra cách deploy FastAPI trên cPanel như trên và thật may mắn là nó hoạt động, thật sự bản thân không phải là một chuyên gia về vấn đề hosting, VPS/Server. Nếu bạn thấy bài viết này hay, hãy chia sẻ nó lên các diễn dàn để giúp những người khác.

Trước mắt, với các dự án FastAPI vừa và nhỏ thì mình thấy chúng hoạt động rất tốt trên cPanel theo cách này. Mình chưa có dự án FastAPI nào với quy mô và truy cập lớn để kiểm tra tính ổn định của nó trên cPanel. Nếu bạn tìm thấy những vấn đề của cách này, hãy chia sẻ cho mình và mọi người thông qua bình luận bên dưới nhé.

Bài viết liên quan

Trần Ngọc Minh Hiếu

Trần Ngọc Minh Hiếu

Mình hiện đang làm Data Analyst, trước đó từng làm Digital Marketing. Viết blog là một niềm vui của mình, giúp mình chia sẻ lại những kiến thức và trải nghiệm từ cuộc sống và công việc. Bạn có thể donate cho mình tại đây.

Viết một bình luận

Hãy thoải mái để lại bình luận của bạn, chúng tôi sẽ kiểm duyệt và phản hồi trong thời gian sớm nhất. Vui lòng sử dụng email thật để đảm bảo bình luận được duyệt và nhận thông báo khi chúng tôi trả lời. Bạn cũng có thể thêm ảnh đại diện cho email của mình.