Django + uWSGI + Nginx + FastAPI 微服务生产环境部署指南
本文适用于前后端分离项目的生产部署,前端使用 Nginx 托管静态文件,后端主服务使用 Django + uWSGI,部分功能拆分为独立的 FastAPI 微服务,通过 systemd 进行守护,实现开机自启和异常自动重启。
一、整体架构
用户请求 → Nginx (80/443)
├── / → 前端静态文件 (dist)
├── /api/ → Django 主后端 (uWSGI,端口 8000)
├── /gen/ → FastAPI 微服务 A(测试用例生成,端口 8010)
└── /other/ → FastAPI 微服务 B(接口测试功能,端口 8030)
-
前端:Nginx 托管静态文件,负责反向代理后端接口。
-
后端主服务:Django + uWSGI,使用 systemd 守护。
-
微服务:FastAPI 应用,使用 uvicorn 启动,使用 systemd 守护。
二、前端部署
1. 打包前端项目
在本地前端项目根目录执行:
npm run build
打包完成后会生成 dist 目录,该目录即前端静态文件。
2. 服务器安装 Web 服务器(Nginx)
可以选择直接安装 Nginx,或使用宝塔面板等可视化工具管理。
安装 Nginx(Ubuntu/Debian 示例):
sudo apt update
sudo apt install nginx -y
若使用宝塔面板:请自行安装并登录面板,在软件商店中安装 Nginx。
3. 开放安全组/防火墙端口
在云服务器控制台的安全组中放行所需端口:
-
80(HTTP)
-
443(HTTPS,若配置 SSL)
-
宝塔面板端口(若使用宝塔,默认为自定义端口,请根据实际配置放行)
同时确保系统防火墙放行:
sudo ufw allow 'Nginx Full'
4. 创建站点并配置 Nginx
在 Nginx 中创建一个站点配置文件,例如 /etc/nginx/sites-available/your_domain:
server {
listen 80;
server_name your_domain.com; # 替换为你的域名或服务器IP
# 前端静态文件
root /var/www/your_project/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理后端 API(Django)
location /api/ {
proxy_pass http://127.0.0.1:8000;
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;
}
# 反向代理测试用例生成微服务
location /gen/ {
proxy_pass http://127.0.0.1:8010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 反向代理接口测试微服务
location /other/ {
proxy_pass http://127.0.0.1:8030;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启用站点并重载 Nginx:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
5. 上传前端文件
将本地 dist 目录上传到服务器上 Nginx 配置中 root 指定的路径,例如 /var/www/your_project/dist。上传完成后,访问域名或服务器 IP 即可看到前端页面。
三、后端主服务(Django + uWSGI)部署
1. 创建虚拟环境并安装依赖
在服务器上创建项目目录,并创建 Python 虚拟环境:
mkdir -p /home/your_user/your_project
cd /home/your_user/your_project
python3 -m venv venv
source venv/bin/activate
上传后端代码,并安装依赖:
pip install -r requirements.txt
pip install uwsgi
2. 创建 uwsgi.ini 配置文件
在项目根目录下创建 uwsgi.ini,内容示例:
[uwsgi]
# 项目目录
chdir = /home/your_user/your_project
# 指定 Django 的 wsgi 文件
module = your_project.wsgi:application
# 使用 socket 与 Nginx 通信
socket = 127.0.0.1:8000
# 进程数
processes = 4
# 线程数
threads = 2
# 启用主进程
master = true
# 进程 ID 文件
pidfile = /home/your_user/your_project/uwsgi.pid
# 日志文件(可选,若使用 systemd 可注释掉)
# logto = /home/your_user/your_project/uwsgi.log
# 虚拟环境路径
home = /home/your_user/your_project/venv
# 环境变量
env = DJANGO_SETTINGS_MODULE=your_project.prod_settings
注意:生产环境使用
.prod_settings作为 Django 配置模块,请根据实际项目修改。
3. 启动 uWSGI
cd /home/your_user/your_project
uwsgi --ini uwsgi.ini
如需平滑重载代码(不中断服务):
uwsgi --reload uwsgi.pid
4. 使用 systemd 守护 uWSGI
创建 systemd 服务文件:
sudo nano /etc/systemd/system/uwsgi.service
内容如下:
[Unit]
Description=uWSGI service for Django backend
After=network.target
[Service]
User=your_user
Group=your_user
WorkingDirectory=/home/your_user/your_project
Environment="PATH=/home/your_user/your_project/venv/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONPATH=/home/your_user/your_project"
ExecStart=/home/your_user/your_project/venv/bin/uwsgi --ini /home/your_user/your_project/uwsgi.ini
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl start uwsgi
sudo systemctl enable uwsgi
sudo systemctl status uwsgi
确认状态显示 active (running)。
端口占用处理:若 8000 端口被占用,可先结束旧进程:
sudo pkill -f uwsgi sudo ss -tlnp | grep 8000 sudo kill -9 <PID>
四、FastAPI 微服务部署
1. 微服务架构说明
为了解耦功能,将部分独立功能拆分为 FastAPI 微服务,例如:
-
测试用例生成服务:端口 8010,路径前缀
/gen/ -
接口测试执行服务:端口 8030,路径前缀
/other/
每个微服务建议独立目录、独立虚拟环境。
2. 为每个微服务创建虚拟环境并安装依赖
示例(以测试用例生成服务为例):
mkdir -p /home/your_user/ai-testcase-service
cd /home/your_user/ai-testcase-service
python3 -m venv .venv
source .venv/bin/activate
# 上传代码后安装依赖
pip install -r requirements.txt
其他微服务同理。
3. 创建 systemd 服务文件
微服务 A(测试用例生成,8010):
sudo nano /etc/systemd/system/ai-testcase.service
内容:
[Unit]
Description=FastAPI Microservice - TestCase Generation
After=network.target
[Service]
User=your_user
Group=your_user
WorkingDirectory=/home/your_user/ai-testcase-service
Environment="PATH=/home/your_user/ai-testcase-service/.venv/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONPATH=/home/your_user/ai-testcase-service"
ExecStart=/home/your_user/ai-testcase-service/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8010
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
微服务 B(接口测试执行,8030):
sudo nano /etc/systemd/system/exec-api.service
内容:
[Unit]
Description=FastAPI Microservice - TestCase Execution (8030)
After=network.target
[Service]
User=your_user
Group=your_user
WorkingDirectory=/home/your_user/ai-testcase-exec-service
Environment="PATH=/home/your_user/ai-testcase-exec-service/.venv/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONPATH=/home/your_user/ai-testcase-exec-service"
ExecStart=/home/your_user/ai-testcase-exec-service/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8030
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
4. 启动并启用服务
sudo systemctl daemon-reload
sudo systemctl start ai-testcase
sudo systemctl enable ai-testcase
sudo systemctl status ai-testcase
sudo systemctl start exec-api
sudo systemctl enable exec-api
sudo systemctl status exec-api
五、常用运维命令
查看服务日志
# 查看 uWSGI 日志(若使用 systemd)
sudo journalctl -u uwsgi -f
# 查看微服务日志
sudo journalctl -u ai-testcase -f
sudo journalctl -u exec-api -f
重启服务
sudo systemctl restart uwsgi
sudo systemctl restart ai-testcase
sudo systemctl restart exec-api
查看端口占用
sudo ss -tlnp | grep 8000
sudo ss -tlnp | grep 8010
sudo ss -tlnp | grep 8030
六、注意事项
-
路径替换:本文中
/home/your_user/your_project等路径均为示例,请替换为你的实际路径。 -
端口放行:确保云服务器安全组和系统防火墙放行了 80/443 及所需自定义端口(如 8000、8010、8030 若需对外直接访问,但通常仅通过 Nginx 反向代理,无需直接暴露)。
-
域名解析:若使用域名,需在 DNS 服务商处将域名解析到服务器 IP,并在 Nginx 中配置
server_name。 -
HTTPS 配置:建议使用 Let's Encrypt 等工具为域名配置 SSL 证书,提升安全性。
-
环境变量:若微服务需要额外的环境变量(如外部 API 地址、密钥等),可在 systemd 服务文件中通过
Environment=添加。
以上是根据自己的项目进行部署的实践,仅供参考。

浙公网安备 33010602011771号