Python从入门到精通day58

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 域名与证书配置(阿里云示例)

  1. 注册域名:通过阿里云域名服务注册专属域名

  2. 域名备案:按照阿里云要求完成域名备案,无备案域名无法正常访问

  3. 域名解析:将域名解析至服务器公网IP

  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复用,提升性能
    use epoll;
    worker_connections 10240;
}

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;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    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 {
    listen  80;
    server_name www.xxx.com;
    return 301 https://$host$request_uri;
}

# HTTPS服务配置
server {
    listen      443 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_timeout 5m;
    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_ciphers on;
    
    # 动态请求转发至uWSGI
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        uwsgi_param UWSGI_SCHEME https;
    }
    
    # 静态资源直接由Nginx处理,设置缓存过期时间
    location /static/ {
        alias /root/project/stat/;
        expires 30d;
    }
}

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 {
        server 192.168.1.100:801 weight=2;  # weight为权重,权重越高请求越多
        server 192.168.1.100:802 weight=1;
        server 192.168.1.100:803 weight=1 backup;  # backup为备用节点
    }

    server {
        listen  80;
        server_name www.xxx.com;
        return 301 https://$host$request_uri;
    }

    server {
        listen  443 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

class MasterSlaveRouter(object):
    """数据库主从读写分离路由"""
    @staticmethod
    def db_for_read(model, **hints):
        """读请求分发至从库"""
        return random.choice(('slave1',))
    
    @staticmethod
    def db_for_write(model, **hints):
        """写请求分发至主库"""
        return 'default'
    
    @staticmethod
    def allow_relation(obj1, obj2, **hints):
        return True
    
    @staticmethod
    def allow_migrate(db, app_label, **hints):
        return True

七、进程管理与容器化部署

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:定义项目运行环境与启动命令
    1. 构建镜像docker build -t django-project:v1 .
    1. 运行容器:映射端口、挂载目录,启动项目容器
    1. 镜像分发:推送至Docker镜像仓库,实现多节点部署

八、常用运维工具与服务汇总

8.1 开源运维工具

功能场景 开源工具推荐
版本控制 Git、SVN
负载均衡 Nginx、LVS、HAProxy
数据库 MySQL、PostgreSQL、Redis
服务监控 Zabbix、Nagios
消息队列 RabbitMQ、Kafka、Redis

8.2 云服务推荐

功能场景 云服务平台
代码托管 Github、Gitee、阿里云CODING
云服务器 阿里云ECS、腾讯云CVM
对象存储 阿里云OSS、七牛云
短信/推送服务 阿里云短信、极光推送

国内直接使用顶级AI工具

谷歌浏览器访问:

https://www.nezhasoft.cloud/r/vMPJZr

相关推荐
楚Y6同学2 小时前
为什么 C++ 要设计函数重载
开发语言·c++
steins_甲乙2 小时前
【无标题】
开发语言·c++
码云数智-大飞2 小时前
PHP OPcache 深度调优:从性能陷阱到生产环境最佳实践
开发语言
weixin_433179332 小时前
Python - 调试
java·开发语言·python
代码探秘者2 小时前
【算法篇】6.分治
java·数据结构·后端·python·算法·排序算法
Elastic 中国社区官方博客2 小时前
我们如何修复 OpenTelemetry 中基于 head 的采样
大数据·开发语言·python·elasticsearch·搜索引擎
20岁30年经验的码农2 小时前
Java NIO底层实现原理
开发语言·php
飞鱼计划2 小时前
EasyExcel 3.3.2 模板方式写入数据完整指南
java·开发语言
梦因you而美2 小时前
Python自动化复制Excel sheet表(openpyxl+win32com双方案,完美保留格式)
python·自动化·excel·win32com·openpyxl