Django项目生产环境部署上线实战指南
本文档基于CentOS 7.x系统,详细梳理Django项目从上线前准备、服务器环境搭建、服务配置到高可用架构优化的全流程部署方案,兼顾实操性与生产环境安全性,可直接落地使用,规避常见部署风险。
一、上线前配置与安全加固
项目上线前需完成核心配置修改与安全优化,彻底关闭调试模式、加固安全配置、隔离敏感信息,杜绝生产环境安全隐患。
1.1 部署前置检查
执行Django官方部署校验命令,排查生产环境配置漏洞、缺失依赖及潜在风险,确保项目满足上线基础条件。
python manage.py check --deploy --fail-level WARNING
1.2 核心环境配置修改
生产环境严禁开启DEBUG模式,且需严格限定允许访问的域名,禁止使用通配符,避免非法访问。
# 生产环境必须关闭调试模式
DEBUG = False
# 严格配置允许访问的域名,禁止使用 * 通配符
ALLOWED_HOSTS = ['www.xxx.com', 'api.xxx.com', '服务器公网IP']
1.3 HTTPS与安全配置强化
完善HTTP安全响应头、强制HTTPS访问、加固Cookie安全,防范常见Web攻击,适配生产环境HTTPS部署场景。
# HSTS强制HTTPS配置(有效期设为1年,提升安全性)
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# 自动将HTTP请求重定向至HTTPS
SECURE_SSL_REDIRECT = True
# 禁用浏览器MIME类型嗅探,防范恶意文件执行
SECURE_CONTENT_TYPE_NOSNIFF = True
# 开启浏览器XSS攻击防护
SECURE_BROWSER_XSS_FILTER = True
# 会话Cookie与CSRF Cookie仅允许HTTPS传输
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# 禁止页面被iframe嵌套,防范点击劫持
X_FRAME_OPTIONS = 'DENY'
# 关闭浏览器JS本地存储能力(可选,提升数据安全)
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
1.4 敏感信息隔离管理
生产环境严禁将密钥、数据库账号密码、认证信息硬编码在代码中,统一通过环境变量或专用配置文件读取,防止代码泄露引发安全风险。
import os
# 项目密钥、数据库、缓存等敏感信息从环境变量读取
SECRET_KEY = os.environ.get('SECRET_KEY')
# 数据库配置
DB_USER = os.environ.get('DB_USER')
DB_PASS = os.environ.get('DB_PASS')
DB_HOST = os.environ.get('DB_HOST')
# Redis缓存认证
REDIS_AUTH = os.environ.get('REDIS_AUTH')
二、服务器Python 3.x环境搭建
CentOS 7默认自带Python 2.7,部署Django项目需全新安装Python 3.x,严禁卸载、修改系统自带Python,避免系统命令异常。
2.1 安装底层依赖库
提前安装Python编译所需依赖,解决安装失败、缺失组件问题。
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libpcap-devel xz-devel libffi-devel libxml2 gcc gcc-c++
2.2 下载并校验Python源码
# 下载Python 3.7.6源码(可替换为其他稳定3.x版本)
wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz
# 校验文件完整性,防止下载文件损坏
md5sum Python-3.7.6.tar.xz
2.3 解压与编译安装
# 解压源码包
xz -d Python-3.7.6.tar.xz
tar -xvf Python-3.7.6.tar
# 进入目录,预编译配置
cd Python-3.7.6
./configure --prefix=/usr/local/python37 --enable-optimizations
# 编译并安装(--enable-optimizations开启性能优化)
make && make install
2.4 环境变量配置
# 编辑用户环境变量
vim ~/.bash_profile
# 编辑系统全局环境变量
vim /etc/profile
在文件末尾添加如下配置,新增Python 3环境变量:
export PATH=$PATH:/usr/local/python37/bin
# 刷新环境变量,立即生效
source ~/.bash_profile
source /etc/profile
# 创建软链接,方便全局调用Python3与pip3
ln -s /usr/local/python37/bin/python3 /usr/bin/python3
ln -s /usr/local/python37/bin/pip3 /usr/bin/pip3
2.5 安装验证
# 验证Python3版本
python3 --version
# 验证系统默认Python(需保留为Python2)
python --version
# 验证pip3
pip3 --version
三、项目标准化目录规划
生产环境推荐采用标准化目录结构,实现代码、配置、日志、静态资源、虚拟环境完全分离,便于后期维护、排查问题与服务迁移。
project
├── code # 项目核心代码(从Git仓库拉取)
│ └── django_project # 业务项目目录
│ ├── api
│ ├── common
│ ├── django_project
│ ├── manage.py
│ ├── static
│ └── templates
├── conf # 各类服务配置文件
│ ├── cert # HTTPS证书与私钥存放目录
│ │ ├── xxx.key
│ │ └── xxx.pem
│ ├── nginx.conf
│ └── uwsgi.ini
├── logs # 项目、Nginx、uWSGI日志文件
│ ├── access.log
│ ├── error.log
│ └── uwsgi.log
├── stat # 收集后的静态资源(CSS/JS/图片)
│ ├── css
│ ├── images
│ └── js
└── venv # 项目独立虚拟环境
3.1 域名与证书配置(阿里云示例)
- 2. 域名备案:按照阿里云要求完成域名备案,无备案域名无法正常访问
- 4. 申请SSL证书:阿里云申请免费/付费SSL证书,下载后上传至
project/conf/cert目录
3.2 项目代码拉取与环境初始化
# 进入代码目录,拉取远程仓库代码
cd project/code
git clone 项目仓库地址
# 返回项目根目录,创建虚拟环境
cd ..
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装项目依赖
pip install -r code/django_project/requirements.txt
# 收集项目静态资源(需提前在settings.py配置STATIC_ROOT)
python code/django_project/manage.py collectstatic
四、uWSGI服务配置
uWSGI是Python项目高效的WSGI服务器,负责处理Django动态请求,实现项目与Web服务器的对接。
4.1 安装uWSGI
# 虚拟环境内安装uWSGI
pip install uwsgi
4.2 编写uWSGI配置文件
创建/修改project/conf/uwsgi.ini,配置如下:
[uwsgi]
# 项目根目录
base=/root/project
# 项目名称
name=django_project
# 开启主进程
master=true
# 工作进程数(建议设为服务器CPU核心数2倍)
processes=4
# 虚拟环境路径
pythonhome=%(base)/venv
# 项目代码目录
chdir=%(base)/code/%(name)
# 项目wsgi文件路径
module=%(name).wsgi:application
# 与Nginx通信方式(socket模式,测试时可改为http)
socket=127.0.0.1:8000
# 日志存放路径
logto=%(base)/logs/uwsgi.log
# 设置缓冲,防止请求丢失
buffer-size=65535
# 进程异常自动重启
vacuum=true
# 最大请求数,防止内存泄漏
max-requests=5000
测试阶段可将socket改为http,直接通过IP+端口访问项目;上线后改回socket模式,通过Nginx反向代理实现动静分离。
4.3 启动uWSGI服务
# 后台守护进程方式启动
nohup uwsgi --ini project/conf/uwsgi.ini
五、Nginx服务配置
Nginx作为Web反向代理服务器,负责处理静态资源、实现请求转发、负载均衡,提升项目访问速度与并发能力。
5.1 安装Nginx
yum -y install nginx
5.2 Nginx全局配置
修改/etc/nginx/nginx.conf,优化服务性能:
user nginx;
# 工作进程数(与CPU核心数一致)
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
# 使用epoll多路IO复用,提升性能
useepoll;
worker_connections10240;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status$body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfileon;
tcp_nopushon;
tcp_nodelayon;
keepalive_timeout65;
types_hash_max_size2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
# 引入项目自定义Nginx配置
include /root/project/conf/nginx.conf;
}
5.3 项目专属Nginx配置
创建/修改project/conf/nginx.conf,实现HTTP强制跳转HTTPS、动静分离、反向代理:
# HTTP请求强制跳转HTTPS
server {
listen80;
server_name www.xxx.com;
return301 https://$host$request_uri;
}
# HTTPS服务配置
server {
listen443 ssl;
server_name www.xxx.com;
# 日志路径
access_log /root/project/logs/access.log;
error_log /root/project/logs/error.log;
# SSL证书配置
ssl_certificate /root/project/conf/cert/xxx.pem;
ssl_certificate_key /root/project/conf/cert/xxx.key;
ssl_session_timeout5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_cipherson;
# 动态请求转发至uWSGI
location / {
include uwsgi_params;
uwsgi_pass127.0.0.1:8000;
uwsgi_param UWSGI_SCHEME https;
}
# 静态资源直接由Nginx处理,设置缓存过期时间
location /static/ {
alias /root/project/stat/;
expires30d;
}
}
5.4 Nginx服务管理
# 启动Nginx
systemctl start nginx
# 设置开机自启
systemctl enable nginx
# 重启Nginx(配置修改后执行)
systemctl restart nginx
# 平滑重载配置(不中断服务)
nginx -s reload
六、高可用架构扩展配置
6.1 Nginx负载均衡配置
多服务器部署时,通过Nginx实现请求负载均衡,提升系统并发承载能力,基于Docker模拟多后端节点示例:
# Docker启动多台后端Nginx节点
docker run -d -p 801:80 --name nginx1 nginx:latest
docker run -d -p 802:80 --name nginx2 nginx:latest
docker run -d -p 803:80 --name nginx3 nginx:latest
Nginx负载均衡核心配置:
http {
# 定义后端服务集群
upstream django_cluster {
server192.168.1.100:801 weight=2; # weight为权重,权重越高请求越多
server192.168.1.100:802 weight=1;
server192.168.1.100:803 weight=1 backup; # backup为备用节点
}
server {
listen80;
server_name www.xxx.com;
return301 https://$host$request_uri;
}
server {
listen443 ssl;
# SSL证书配置(同上)
location / {
proxy_pass http://django_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
负载均衡算法:默认加权轮询(WRR),支持ip_hash、url_hash、fair等算法,可按需配置。
6.2 Keepalived高可用
为防止负载均衡服务器单点故障,通过Keepalived实现主备服务器自动切换,保障服务高可用。配置相对复杂,建议由专业运维人员部署,可参考官方文档与专业教程完成配置。
6.3 MySQL主从复制与读写分离
生产环境数据库采用主从架构,主库负责写入,从库负责读取,提升数据库性能与数据安全性,基于Docker快速搭建:
6.3.1 目录规划
root/mysql
├── master # 主库
│ ├── conf
│ └── data
├── slave-1 # 从库1
│ ├── conf
│ └── data
└── slave-2 # 从库2
├── conf
└── data
6.3.2 主从库核心配置
主库配置(server-id=1),从库配置server-id需唯一且不重复:
[mysqld]
datadir=/var/lib/mysql
server-id=1
log-bin=mysql-bin
expire_logs_days=30
max_binlog_size=256M
6.3.3 Django读写分离实现
通过自定义数据库路由,实现主库写入、从库读取,配置如下:
# settings.py
DATABASES = {
'default': { # 主库
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_db',
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASS'),
'HOST': '主库IP',
'PORT': 3306,
},
'slave1': { # 从库1
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_db',
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASS'),
'HOST': '从库1IP',
'PORT': 3306,
},
}
# 配置数据库路由
DATABASE_ROUTERS = ['common.routers.MasterSlaveRouter']
# common/routers.py
import random
classMasterSlaveRouter(object):
"""数据库主从读写分离路由"""
@staticmethod
defdb_for_read(model, **hints):
"""读请求分发至从库"""
return random.choice(('slave1',))
@staticmethod
defdb_for_write(model, **hints):
"""写请求分发至主库"""
return'default'
@staticmethod
defallow_relation(obj1, obj2, **hints):
returnTrue
@staticmethod
defallow_migrate(db, app_label, **hints):
returnTrue
七、进程管理与容器化部署
7.1 Supervisor进程管理
Supervisor是Python开发的进程管理工具,可实现uWSGI、Celery等服务的开机自启、异常重启,保障服务稳定性。
# 安装Supervisor
pip install supervisor
# 生成默认配置文件
echo_supervisord_conf > /etc/supervisord.conf
编写项目进程管理配置/etc/supervisord.d/django.ini:
[program:django_uwsgi]
command=/root/project/venv/bin/uwsgi --ini /root/project/conf/uwsgi.ini
directory=/root/project
autostart=true
autorestart=true
startretries=3
user=root
stdout_logfile=/root/project/logs/supervisor.log
stderr_logfile=/root/project/logs/supervisor_err.log
# 启动Supervisor
supervisord -c /etc/supervisord.conf
# 查看、管理进程
supervisorctl
> status # 查看进程状态
> restart django_uwsgi # 重启进程
7.2 Docker容器化部署
Docker可彻底解决环境不一致问题,实现项目快速打包、迁移与部署,核心操作:
- 1. 编写Dockerfile:定义项目运行环境与启动命令
- 2. 构建镜像:
docker build -t django-project:v1 . - 4. 镜像分发:推送至Docker镜像仓库,实现多节点部署
八、常用运维工具与服务汇总
8.1 开源运维工具
8.2 云服务推荐