基于 Gunicorn + Systemd + Nginx 部署高可用 Python FastAPI 后端
前言
在如今的 AI 应用开发与微服务接口建设中,Python 凭借 FastAPI 框架的高性能异步特性与自动生成交互式 API 文档的能力,成为了众多后端开发者的首选。然而,在本地开发时使用的 uvicorn main:app --reload 仅适用于调试环境。当我们将项目迁移至华为云弹性云服务器(ECS)或 Flexus 应用服务器 L 实例正式上线时,直接在前台裸跑开发服务器不仅无法发挥多核 CPU 的并发能力,一旦遇到未捕获异常或终端断开,服务便会直接挂起。
本文将完整演示在华为云 Ubuntu 22.04 环境下,采用 “Nginx 反向代理 + Gunicorn 进程管理(Uvicorn Worker)+ Systemd 守护进程” 的标准生产级架构,实现 Python Web 后端服务的高可用、多进程并发与故障自动重启。
一、 环境准备与虚拟环境隔离
为了避免污染华为云 ECS 宿主机的系统级 Python 环境,我们首先安装 python3-venv 并创建独立的项目运行目录与专用虚拟环境。
1. 安装基础编译与环境依赖
sudo apt update
sudo apt install -y python3-pip python3-venv python3-dev build-essential nginx curl
2. 创建项目目录与 Python 虚拟环境
我们在 /opt/fastapi_app 下构建项目工程,并初始化 venv 虚拟环境:
# 创建项目工作目录
sudo mkdir -p /opt/fastapi_app/logs
sudo chown -R $USER:$USER /opt/fastapi_app
cd /opt/fastapi_app
# 创建名为 venv 的虚拟环境
python3 -m venv venv
# 激活虚拟环境并升级 pip
source venv/bin/activate
pip install --upgrade pip
3. 安装 FastAPI 与生产级 ASGI 服务器
在激活的虚拟环境中安装 fastapi、uvicorn 以及进程管理器 gunicorn:
pip install fastapi "uvicorn[standard]" gunicorn
二、 编写 FastAPI 示例应用与 Gunicorn 配置
1. 编写后端接口代码 main.py
我们创建一个包含健康检查(Health Check)与系统负载查询接口的标准示例文件 /opt/fastapi_app/main.py:
cat << 'EOF' > /opt/fastapi_app/main.py
import os
import time
from fastapi import FastAPI
app = FastAPI(
title="HuaweiCloud ECS FastAPI Service",
description="基于华为云 ECS 生产环境部署的 FastAPI 后端服务",
version="1.0.0"
)
START_TIME = time.time()
@app.get("/")
async def root():
return {
"code": 200,
"message": "Welcome to HuaweiCloud FastAPI Production Server",
"worker_pid": os.getpid()
}
@app.get("/health")
async def health_check():
uptime_seconds = int(time.time() - START_TIME)
return {
"status": "healthy",
"uptime_seconds": uptime_seconds,
"worker_pid": os.getpid()
}
EOF
2. 编写 Gunicorn 生产配置文件 gunicorn_conf.py
Gunicorn 作为主进程(Master Process)负责管理多个 UvicornWorker 子进程。通常推荐的 Worker 数量计算公式为 。我们在 /opt/fastapi_app/gunicorn_conf.py 中写入如下配置:
cat << 'EOF' > /opt/fastapi_app/gunicorn_conf.py
import multiprocessing
# 仅绑定本地回环端口,由宿主机 Nginx 统一对外提供服务
bind = "127.0.0.1:8000"
# 根据华为云 ECS CPU 核心数动态计算工作进程数
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "uvicorn.workers.UvicornWorker"
# 进程超时与最大请求数限制(防止内存泄漏)
timeout = 60
keepalive = 5
max_requests = 5000
max_requests_jitter = 500
# 日志文件路径
accesslog = "/opt/fastapi_app/logs/access.log"
errorlog = "/opt/fastapi_app/logs/error.log"
loglevel = "info"
EOF
三、 配置 Systemd 系统守护进程
为了让后端服务在华为云 ECS 开机时自动拉起,并在进程意外崩溃时实现秒级自动重启,我们编写一个标准的 Systemd 服务单元文件 /etc/systemd/system/fastapi-app.service:
sudo tee /etc/systemd/system/fastapi-app.service << 'EOF'
[Unit]
Description=FastAPI Production Service managed by Gunicorn
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/opt/fastapi_app
Environment="PATH=/opt/fastapi_app/venv/bin"
ExecStart=/opt/fastapi_app/venv/bin/gunicorn -c /opt/fastapi_app/gunicorn_conf.py main:app
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
重新加载 Systemd 守护进程配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable --now fastapi-app
# 查看服务运行状态与多 Worker 进程树
sudo systemctl status fastapi-app
当看到状态为 active (running) 且下方列出了多个 gunicorn 子进程 PID 时,说明多进程并发架构已成功运行。
四、 配置 Nginx 反向代理与平滑发布
最后一步,我们通过宿主机 Nginx 将公网 80 端口的请求转发至本地的 127.0.0.1:8000。
1. 创建 Nginx 站点配置文件
sudo tee /etc/nginx/conf.d/fastapi_proxy.conf << 'EOF'
upstream fastapi_backend {
server 127.0.0.1:8000 fail_timeout=0;
keepalive 32;
}
server {
listen 80;
server_name _;
client_max_body_size 20M;
location / {
proxy_pass http://fastapi_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
移除默认配置冲突并重载 Nginx:
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
2. 验证接口并发分流与零停机热重载
在终端连续发起多次请求,观察返回的 worker_pid 变化:
curl -s http://127.0.0.1/health
curl -s http://127.0.0.1/health
你会发现每次请求返回的 worker_pid 在不同进程号之间轮转,证明多个 Uvicorn Worker 正在协同分担并发流量。
当后续更新了 main.py 业务代码时,无需中断线上服务,只需执行以下命令即可触发 Gunicorn 的平滑热重载(Graceful Reload),实现零停机发版:
sudo systemctl reload fastapi-app
总结
通过 “Python Venv 虚拟环境隔离 + Gunicorn 多 Worker 调度 + Systemd 故障自愈守护 + Nginx 反向代理” 的四层标准架构,我们在华为云 ECS 上构建了一套高可靠、易维护的生产级 Python 后端运行环境。无论是部署常规 RESTful 接口还是封装轻量级 AI 模型推理服务,这套架构都能提供扎实稳定的底层支撑。
- 点赞
- 收藏
- 关注作者
评论(0)