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

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.

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.

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

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

Chỉ cần điền thông tin Application root và Application 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.

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:
- Gõ “requirements.txt” và nhấp nút Add.
- Nhấp vào nút Run Pip Install và chọn requirements.txt.

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.

Bước 6: Chạy FastAPI trong Terminal.
Mở Terminal trong 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.

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ý.
- Chưa có HTTPS (SSL) khiến cho trình duyệt hiển thị “Not Secure”.
- Phần Port phía sau khiến URL trông không chuyên nghiệp và chưa hoàn thiện.

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.

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]

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.

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 đó.
Command | Chức năng |
---|---|
screen -S myfastapi | Tạo screen mới tên myfastapi |
screen -ls | Liệt kê tất cả các screen đang chạy |
screen -r myfastapi | Quay lại screen myfastapi đang chạy |
Ctrl + A, D | Thoát screen nhưng giữ tiến trình chạy |
exit | Thoát và đóng screen |
Chúng ta nên dùng screen
vì 2 lý do sau:
- 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.
- Tránh bị lỗi CORS với POST khi bạn đã cấu hình
allow_origins
trongadd_middleware
của FastAPI. Đây chỉ là trải nghiệm của mình khi không dùngscreen
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é.