FastAPI + NGINX + Gunicorn:一步一步教你部署一个高性能的Python网页应用
FastAPI 是一个现代的、快速(高性能)的 Web 框架,适用于构建 APIs,尤其是基于 Python 的项目。要让 FastAPI 应用能够处理生产级别的流量,我们通常会使用 Gunicorn 作为 WSGI 服务器,并通过 NGINX 进行反向代理。在这篇文章中,我们将详细讲解如何搭建一个高性能的 FastAPI 应用并部署到生产环境中。
1. 环境准备
在开始之前,请确保你的服务器上安装了 Python 3.7+、pip、NGINX 和 Gunicorn。你可以使用以下命令在 Ubuntu 上安装这些组件:
sudo apt update
sudo apt install python3 python3-pip python3-venv nginx
2. 创建 FastAPI 应用
首先,我们需要创建一个 FastAPI 应用。我们将在一个新的目录中执行所有操作:
mkdir my_fastapi_app
cd my_fastapi_app
接下来创建一个虚拟环境并激活它:
python3 -m venv venv
source venv/bin/activate
安装 FastAPI 和 Uvicorn(因为我们将通过 Gunicorn 启动 Uvicorn Worker):
pip install fastapi uvicorn gunicorn
创建一个简单的 FastAPI 应用 main.py
:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
3. 启动 Gunicorn
在本地测试应用程序的正确性可以通过直接使用 Uvicorn 运行:
uvicorn main:app --host 0.0.0.0 --port 8000
接下来,我们使用 Gunicorn 来运行应用:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000
此命令中的参数解释:
- -w 4
:表示使用4个工作进程,您可以根据自己的服务器配置调整这个数字。
- -k uvicorn.workers.UvicornWorker
:指定使用 Uvicorn 的 worker。
- --bind 0.0.0.0:8000
:绑定到所有可用的 IP 地址。
4. 配置 NGINX
接下来,我们需要配置 NGINX 作为反向代理。编辑 NGINX 配置文件:
sudo nano /etc/nginx/sites-available/my_fastapi_app
在配置文件中添加以下内容:
server {
listen 80;
server_name your_domain.com; # 将your_domain.com替换为你的域名或IP
location / {
proxy_pass http://127.0.0.1:8000; # Gunicorn运行在8000端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
保存并退出编辑器。
现在,我们需要创建一个符号链接,将配置文件链接到 sites-enabled
目录,并重新加载 NGINX:
sudo ln -s /etc/nginx/sites-available/my_fastapi_app /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置是否正确
sudo systemctl restart nginx # 重新启动 NGINX
5. 启动 Gunicorn 的后台服务
为了让 Gunicorn 在后台运行,我们可以使用 systemd
创建一个服务文件。创建服务文件:
sudo nano /etc/systemd/system/my_fastapi_app.service
添加以下内容:
[Unit]
Description=Gunicorn instance to serve my_fastapi_app
After=network.target
[Service]
User=your_username # 替换为你的用户名
Group=www-data
WorkingDirectory=/path/to/my_fastapi_app
Environment="PATH=/path/to/my_fastapi_app/venv/bin"
ExecStart=/path/to/my_fastapi_app/venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 127.0.0.1:8000
[Install]
WantedBy=multi-user.target
保存并退出。然后启用服务并启动它:
sudo systemctl start my_fastapi_app
sudo systemctl enable my_fastapi_app
6. 测试应用
打开浏览器,访问你的域名或服务器 IP 地址,应该能看到 FastAPI 返回的 {"Hello": "World"}
的 JSON 响应。
至此,通过 FastAPI、NGINX 和 Gunicorn 的组合,我们成功部署了一个高性能的 Python 网页应用。此架构既适合小型项目,也可以扩展到大型应用,非常适合中小型企业或开发者进行应用部署。希望你能顺利完成部署,并在以后的项目中更好地应用这些技术!