随着Python在Web开发领域的崛起,Django作为其最受欢迎的Web框架之一,以其“开箱即用”的强大功能和完善的生态系统,赢得了无数开发者的青睐。然而,将一个Django项目从开发环境顺利部署到生产环境,并确保其高性能、高稳定运行,对于许多初学者或经验不足的开发者而言,仍是一个不小的挑战。
主题铺今天将为你带来一份Python Django项目生产级部署的深度指南,我们将以一个实际的DjangoBlog项目为例,手把手教你如何从Python环境准备、源码下载、配置修改,一直到最终实现Nginx + uWSGI + 动静分离的高效生产级部署,并且演示在BT宝塔面板环境下载的安装图文教程,让你轻松应对各种部署难题!
Django项目生产级部署核心步骤
本教程将以部署DjangoBlog项目为例,带你完成整个部署流程。
一、Python环境准备
一个干净、隔离的Python环境是项目部署的基石。
- Python版本下载与安装:
- 首先,确保你的服务器上安装了合适版本的Python。推荐使用Python 3.x的最新稳定版本。
- 你可以通过系统包管理器(如Ubuntu/Debian的
apt,CentOS/AlmaLinux的yum/dnf)安装,或从Python官网下载源码编译安装。- Ubuntu/Debian:
sudo apt update && sudo apt install python3 python3-pip - CentOS/AlmaLinux:
sudo dnf install python3 python3-pip
- Ubuntu/Debian:
- 主题铺提示: 建议使用pyenv或miniconda等工具管理Python版本,以便在同一服务器上运行多个Python项目。
- 创建并激活虚拟环境:
- 为了避免不同项目之间Python包结构混乱和依赖冲突,强烈建议为每个项目创建一个独立的虚拟环境。
- 进入你的项目目录(或计划存放项目的目录),执行以下命令创建虚拟环境:
cd /path/to/your/project/python3 -m venv venv_djangoblog # 创建名为venv_djangoblog的虚拟环境 - 激活虚拟环境:
source venv_djangoblog/bin/activate - 主题铺点评: 虚拟环境是Python开发和部署的“好习惯”,它能让你更好地管理项目依赖,避免“依赖地狱”。
二、下载源码并调教数据库连接配置
我们将下载DjangoBlog项目的源码,并根据实际情况调整数据库配置。
下载项目源码:
使用git工具克隆DjangoBlog项目的源码到你的服务器上:git clone https://gitee.com/lylinux/DjangoBlog.git
进入项目根目录:cd DjangoBlog
配置文件修改:
DjangoBlog项目默认推荐使用MySQL数据库。主题铺提示: 如果你的服务器没有安装MySQL,或你更倾向于使用其他数据库(如PostgreSQL),你需要进行相应的修改。
djangoblog项目的配置文件位于 /DjangoBlog/djangoblog/settings.py。你可以看到默认的数据库信息和Redis缓存配置。
切换为PostgreSQL (PgSQL) 数据库:
如果你的服务器安装了PgSQL,需要修改 settings.py 中的 DATABASES 配置。
添加 psycopg2-binary 依赖:由于切换到PgSQL,你需要安装连接PgSQL的第三方库 psycopg2-binary。在激活的虚拟环境下执行:pip install psycopg2-binary
并确保你的 requirements.txt 或 Pipfile 中也包含此依赖。
修改 settings.py 中的 DATABASES 配置,示例如下(请替换为你的PgSQL实际信息):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # 修改此处
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost', # 或你的数据库服务器IP
'PORT': '',
}
}使用环境变量文件配置数据库和Redis缓存:
DjangoBlog项目支持从环境变量中获取配置信息,这是一种更安全、更灵活的配置方式。
在项目根目录(或你方便管理的位置)创建一个名为 myenvd 的文件(或其他你喜欢的名称),并在其中配置数据库和Redis缓存的环境变量,例如:
# myenvd 文件内容示例
DATABASE_NAME=your_db_name
DATABASE_USER=your_db_user
DATABASE_PASSWORD=your_db_password
DATABASE_HOST=localhost
DATABASE_PORT=5432
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=your_redis_password在启动项目时,你需要确保这些环境变量被加载。
三、添加并初始化Django项目
在配置好数据库连接后,我们需要对项目进行初始化。
- 安装项目依赖:
- 在激活的虚拟环境下,安装项目所需的全部Python包:
pip install -r requirements.txt
(如果项目使用Pipenv,则执行pipenv install)
- 在激活的虚拟环境下,安装项目所需的全部Python包:
- 项目初始化命令:
- Django项目需要将模型映射到数据库中。在激活的虚拟环境下,执行数据库迁移命令:
python manage.py makemigrationspython manage.py migrate - 主题铺提示: 如果你没有执行这些初始化命令,项目启动时可能会因为找不到数据库表而失败。
- Django项目需要将模型映射到数据库中。在激活的虚拟环境下,执行数据库迁移命令:
- 等待项目创建成功:
- 执行完迁移命令后,数据库结构就已准备就绪。
四、检查运行状态与创建管理员
在生产部署之前,先在开发模式下检查项目是否能正常运行,并创建管理员账号。
- 测试项目运行:
- 在激活的虚拟环境下,并确保环境变量已加载(例如,通过
source myenvd或在启动命令中指定),尝试运行Django的开发服务器:python manage.py runserver 0.0.0.0:8000- 主题铺提示: 原始文章中提到“访问失败,排查后发现本地监听的是127.0.0.1不是0.0.0.0,内网无法访问”。为了让内网或其他IP可以访问,
runserver命令需要指定监听地址为0.0.0.0。
- 主题铺提示: 原始文章中提到“访问失败,排查后发现本地监听的是127.0.0.1不是0.0.0.0,内网无法访问”。为了让内网或其他IP可以访问,
- 在浏览器中访问
http://你的服务器IP:8000,检查网站是否能正常显示。如果出现错误,请检查前面的步骤是否有遗漏。
- 在激活的虚拟环境下,并确保环境变量已加载(例如,通过
- 创建管理员:
- 在项目运行正常后,创建一个Django超级用户(管理员账号):
python manage.py createsuperuser - 按照提示输入用户名、邮箱和密码。
- 在项目运行正常后,创建一个Django超级用户(管理员账号):
五、实现生产级部署:Nginx + uWSGI + 动静分离
这是将Django项目部署到生产环境的关键步骤,它能显著提升项目性能和稳定性。
uWSGI托管Web应用:
安装uWSGI:在激活的虚拟环境下安装uWSGI:pip install uwsgi
uWSGI配置:在项目根目录创建一个 uwsgi.ini 配置文件,用于定义uWSGI如何运行你的Django应用。
# uwsgi.ini
[uwsgi]
# Django项目根目录
chdir = /path/to/your/DjangoBlog/
# Django WSGI文件路径
module = djangoblog.wsgi:application
# 监听地址和端口,或Unix Socket
socket = 127.0.0.1:8000 # 或 socket = /tmp/djangoblog.sock
# 进程数和线程数
master = true
processes = 4
threads = 2
# 自动清理所有进程
vacuum = true
# 启用Python虚拟环境
virtualenv = /path/to/your/DjangoBlog/venv_djangoblog/
# 启用守护进程模式并指定日志文件
daemonize = /var/log/uwsgi/djangoblog.log # 确保路径存在且uwsgi有写入权限
pidfile = /tmp/djangoblog.pid
# 加载环境变量文件(如果使用)
env = DJANGO_SETTINGS_MODULE=djangoblog.settings
# 也可以通过env参数加载myenvd文件中的环境变量
# env = PYTHON_ENV_FILE=/path/to/your/DjangoBlog/myenvd
- 主题铺提示: 确保
chdir和virtualenv路径正确。
关闭DEBUG模式,切换到uWSGI服务运行:
- 修改
djangoblog/settings.py文件:
DEBUG = False # 生产环境务必设置为False
ALLOWED_HOSTS = ['your_domain.com', 'your_server_ip'] # 替换为你的域名和IP- 启动uWSGI服务:
uwsgi --ini uwsgi.ini- 你可以使用
ps aux | grep uwsgi检查uWSGI进程是否正常运行。
- 你可以使用
Nginx代理服务与动静分离:
安装Nginx:如果你的服务器尚未安装Nginx,请通过系统包管理器安装:
Ubuntu/Debian:sudo apt install nginx
CentOS/AlmaLinux:sudo dnf install nginx
Nginx配置:
- 在Nginx的配置目录(通常是
/etc/nginx/conf.d/或/etc/nginx/sites-available/)创建一个新的网站配置文件,例如djangoblog.conf。配置Nginx代理uWSGI服务,并实现动静分离。
# /etc/nginx/conf.d/djangoblog.conf (或 sites-available/djangoblog.conf)
server {
listen 80;
server_name your_domain.com your_server_ip; # 替换为你的域名和IP
# 动态文件(通过uWSGI处理)
location / {
include uwsgi_params; # 引入uWSGI的通用参数
uwsgi_pass 127.0.0.1:8000; # 对应uwsgi.ini中设置的socket
# 如果uWSGI使用Unix Socket:
# uwsgi_pass unix:///tmp/djangoblog.sock;
}
# 静态文件(由Nginx直接返回,实现动静分离)
# DjangoBlog项目将静态文件收集到collectedstatic目录,并以/static/路由访问
location /static/ {
alias /path/to/your/DjangoBlog/collectedstatic/; # 替换为你的实际路径
expires 30d; # 缓存30天
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
# 媒体文件(如果项目有用户上传的媒体文件)
# location /media/ {
# alias /path/to/your/DjangoBlog/media/; # 替换为你的实际路径
# expires 30d;
# add_header Cache-Control "public, must-revalidate, proxy-revalidate";
# }
}主题铺提示: 确保 alias 中的路径与你实际的静态文件收集路径一致。expires 和 add_header Cache-Control 有助于浏览器缓存静态文件,提升用户体验。
检查Nginx配置并重启:
sudo nginx -t # 检查配置语法
sudo systemctl restart nginx # 重启Nginx服务配置域名和外网映射:
- DNS解析:将你的域名(
your_domain.com)解析到你的服务器IP地址。 - 本地Host设置(测试阶段):在测试阶段,你可以在本地电脑的
hosts文件中添加一条记录,将域名映射到服务器IP,例如:你的服务器IP地址 your_domain.com - 外网映射:如果你的服务器在内网,需要配置路由器或防火墙进行端口转发,将外部请求映射到服务器的80端口。
六、静态文件收集与压缩
Django项目中的静态文件(CSS, JS, 图片等)需要被收集到统一的目录,以便Nginx直接提供服务。
- 收集静态文件:
- 在激活的虚拟环境下,执行以下命令将Django项目中所有应用的静态文件收集到
STATIC_ROOT指定的目录(在settings.py中配置)。python manage.py collectstatic --noinput - 主题铺提示:
DjangoBlog项目默认将静态文件收集到collectedstatic目录。
- 在激活的虚拟环境下,执行以下命令将Django项目中所有应用的静态文件收集到
- 压缩静态文件(可选,但推荐):
DjangoBlog项目可能使用了django-compressor等库来压缩静态文件。执行压缩命令:python manage.py compress --force- 主题铺点评: 压缩静态文件能进一步减小文件大小,加快传输速度,提升用户体验。
七、访问测试
现在,你可以通过域名或服务器IP访问你的Django项目了。
- 通过域名访问:在浏览器中输入你的域名
http://your_domain.com。 - 通过IP访问:在浏览器中输入
http://你的服务器IP。 - 检查动静分离:
- 打开浏览器的开发者工具(F12),切换到“网络”(Network)标签。
- 刷新页面,观察静态资源的请求(CSS, JS, 图片),它们的请求应该直接由Nginx返回,而不是经过uWSGI。
将Python Django项目部署到生产环境,并利用Nginx代理uWSGI服务,同时实现动静分离,是确保网站高性能和稳定运行的业界标准实践。虽然涉及的步骤较多,但每一步都有其明确的目的和优化效果。
如果使用BT宝塔面板的话部署如下:
1. Python环境准备
a、版本下载
![图片[1]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215511848.png/ztp)
b.虚拟环境建立, 使用刚才安装的Python环境创建一个虚拟环境,防止包结构混乱带来的管理麻烦
![图片[2]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215514787.png/ztp)
2. 下载源码,调教一下数据库链接配置
a. 1. git下载git clone https://gitee.com/lylinux/DjangoBlog.git
![图片[3]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215518603.png/ztp)
b.配置文件
i.djangoblog项目默认推荐使用的是mysql数据库,但是我测试的机器没有安装,故切换为pgsq数据库
ii.在djangoblog项目的配置文件在/DjangoBlog/djangoblog/settings.py,可以看到默认使用的数据库信息, 和Redis缓存方式
![图片[4]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215525539.png/ztp)
![图片[5]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215530664.png/ztp)
iii.修改为支持pgsql, 因为使用了pgsql,所以需要再第三方包记录文件中添加 psycopg2-binary这个链接pgsql的第三方库
![图片[6]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215535409.png/ztp)
iv.因为该项目支持从环境环境变量获取配置信息,所以这里我使用创建一个名为myenvd的环境变量文件来配置数据库和redis缓存,方便后续管理
![图片[7]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215539539.png/ztp)
![图片[8]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215543465.png/ztp)
3.添加Python项目
a.填写项目信息
![图片[9]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215547365.png/ztp)
b.初始化命令,这个也可之后自己在终端输入执行,不过django项目需要数据库信息才能正常访问,所以这里如果没执行初始化命令,会启动失败
![图片[10]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215551953.png/ztp)
![图片[11]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215556995.png/ztp)
c.等待项目创建成功
![图片[12]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215600152.png/ztp)
4.检查运行状态
a.正常运行, 如果没能正常运行可以检查是否有遗漏某些操作,没执行初始化是可能会出现启动失败的
![图片[13]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215605464.png/ztp)
b.创建管理器
![图片[14]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215610618.png/ztp)
c.直接访问服务, 发现访问失败,排查后发现本地监听的是127.0.0.1不是0.0.0.0,内网无法访问,遂修改启动命令,使内网可直接访问
![图片[15]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215615193.png/ztp)
![图片[16]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215619468.png/ztp)
![图片[17]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215624927.png/ztp)
![图片[18]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215628472.png/ztp)
5.实现生产级部署 (Nginx + uwsgi + 动静分离)
a.这里测试DjangoBlog项目是一个基于Python的wsgi网络协议运行的,可将web应用托管给uWsgi服务,提高运行效率,在通过Nginx代理服务,同时将静态文件分离由Nginx直接返回。
b.关闭DEBUG模式,切换到uwsgi服务运行
![图片[19]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215635781.png/ztp)
![图片[20]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215639530.png/ztp)
c.配置域名 (此处测试是通过本地host设置代替DNS域名解析的)
![图片[21]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215643769.png/ztp)
d.配置外网映射
![图片[22]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215647388.png/ztp)
![图片[23]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215652275.png/ztp)
e.配置动静态分离, djangoBlog项目支持将静态文件收集并压缩,放在一个固定的文件夹下,同时使用/static/.*的路由格式访问静态文件。静态文件收集并压缩的命令是之前初始化执行的命令
python manage.py collectstatic --noinput
python manage.py compress --force由于Django将数据收集到了collectionstatic目录,所以此处我将使用NGINX路由重写实现
location /static/ {
rewrite ^/static/(.*)$ /collectedstatic/$1 break;
}![图片[24]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215657403.png/ztp)
访问测试
![图片[25]-BT宝塔面板部署Python项目 从零开始到Nginx+uWSGI+动静分离-主题铺](https://cdn.zhutipu.com/wp-content/uploads/2025/06/20250609215701517.png/ztp)

















暂无评论内容