Django 项目的部署上线
Django 项目的部署上线
准备工作
-
购买域名并注册备案
https://wanwang.aliyun.com/?spm=5176.10695662.1158081.3.3ec742344h1cac
-
购买服务器
推荐:
- 阿里云试用中心: https://www.aliyun.com/minisite/goods?userCode=ecsh7mnp&share_source=copy_link
- 阿里云新用户特惠:https://www.aliyun.com/activity/ambassador/share-gift/goods?taskCode=shareNew2108&recordId=847955&userCode=ecsh7mnp
- 阿里云云小站特惠:https://www.aliyun.com/minisite/goods?userCode=ecsh7mnp&share_source=copy_link
- 云服务器 精选特惠,新用户低至0.6折起 爆款免费试用3个月
- 加入云大使
-
申请SSL证书
-
简介:
Secure socket layer 安全套接层。一种安全协议,用来认证服务器。
作用:- ssl 证书是一个能够激活 ssl 协议 的 数字证书。就好像 Pycharm 的激活密钥。
- 没有 ssl 证书 , 服务器就不能用于商业生产。
- 在浏览器的直接表现是,服务器可以使用 https 协议访问(s便是代表ssl协议),并且不会显示不安全。
-
申请:
点击到阿里云申请 ssl 证书:阿里云控制台-SSL证书或者:
- 登录阿里云,搜索 ssl,进入 ssl 证书管理控制台。
- 点击 ssl证书 > 免费证书 > 立即购买 > 立即购买 > 支付。
- 返回 ssl 证书管理控制台.ssl证书
- 点击创建证书>证书申请
- 填写域名 联系人 地区 其他默认,
- 然后按提示到控制台设置DNS解析,完成申请。
- 点击下载证书
-
Django 线上部署
一、下载宝塔面板
1.连接远程服务器
-
获取服务器IP和密码
- 进入阿里云控制台-云服务器-实例
- 如果想换系统,先停止服务器,再点击更换操作系统,本教程以Centos7.9为例。
- 如果不知道服务器密码:点击重置实例密码,用户名默认为root,设置密码并保存。
- 新建文件保存服务器公网IP、私网IP、用户名、密码。
-
连接服务器
-
方法一:使用Xshell连接
-
下载
- 自行搜索下载 Xshell。
- 百度网盘下载(免安装版,解药后,运行绿化文件,创建快捷方式即可。):
链接: https://pan.baidu.com/s/1o8ORAR__-Q0lBK2myc8qKg
提取码: j9ww
-
使用
> 运行 Xshell 图标。
> 点击新建:名称自定义,协议选 SSH, 主机:服务器公网IP,端口号:22
> 点击左侧窗口的用户身份验证:方法: Password, 用户名:服务器用户名,密码:服务器密码。
> 点击链接,注意不要点击确定,否则就白设置了,要新来过了。
> 自动进入服务器root目录下,链接成功。
-
-
方法二:阿里云远程连接
> 在阿里云控制台](https://ecs.console.aliyun.com/)-云服务器-实例界面,点击实例ID后面的远程连接。
> 选择 Workbench 远程连接立即登录
> 输入root密码,点击确定。便可成功连接到服务器
-
其他远程连接选项说明:
-
VNC
需要设置VNC密码(点击重置实例密码后面的三点,修改VNC密码),然后重启服务器。使用VNC登录后,还是需要输入用户名和密码才能进入服务器。并且是最原始的黑窗口,无法复制粘贴。不推荐使用。
-
发送远程命令
无需用户名和密码,由云服务器发送命令。对网速要求较高,否则发送一条命令,需要执行好久,适合命令固定不变的操作比如安装软件。若要经常发送命令,实时知道结果,不适合这个。
-
-
2. 安装宝塔面板
> Centos安装命令,其他系统见宝塔面板安装教程
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
> 安装完成后,会给出以下信息:
外网面板地址: http://服务器公网IP:8888/xxxxx 内网面板地址: http://服务器私网IP:8888/xxxxx username: z4ewfrlw password: 831845c4
> 在浏览器中打开外网面板地址,输入用户名和密码便可进入服务器的宝塔面板。
-
二、安装环境
需要安装的软件:
- nginx1.18
- mysql
- redis
- python 项目管理器
- docker管理器
三、git 克隆项目
1. 上传项目到git
-
生成模块依赖文件
python freeze > requirements.txt
- 删除 pymysql,改成 mysqlclient,centos7.x 默认的 mysql 驱动
- 首行添加 setuptools-scm , 确保安装与 django2 配套的 django-haystack 和 django-redis,否则会自动安装 django3
- 确保依赖文件与 manage.py 同位置
-
添加git忽略文件
- 如果没有远程仓库,先到码云或github创建远程仓库,在项目根目录初始化仓库,并连接远程仓库,拉取远程仓库 .gitignore 文件
# 创建远程仓库 # 检查git $ git # 如果没有git, 按输出的提示安装git # 确认git配置 $ git config --global user.name 'name' $ git config --global user.email 'email' # name 和 email 需与远程git仓库一致 $ git config --list # 查看配置 # ssh 连接 # 生成 ssh 公私钥,将公钥添加到远程git用户SSH中,不是仓库SSH,它没有推送权限。 $ ssh-keygen -t rsa # 检测连接 $ ssh -T git@gitee.com # 在项目文件夹所在目录,创建本地仓库,连接并拉取远程仓库 $ git init $ git remote add origin 远程仓库url $ git pull origin master
- 修改 .gitignore 文件
# 添加如下内容 *.pid *.log test* uwsgi.ini # 虚拟环境 *_venv/ # 迁移文件 0* collect_static/ admin/
- 推送
# 添加并提交 $ git add .ignore $ git commit -m '修改.gitignore,添加忽略文件' # 推送 $ git push origin master
-
推送项目
# 添加项目文件 $ git add . # 查看要提交的文件 $ git status # 撤销添加(如果有不需要推送的文件,重做上一步,重新修改.gitignore) $ git reset HEAD # 提交项目并推送到远程仓库 $ git commit -m '提交项目' $ git push origin master
2. 克隆 git 仓库到服务器
-
连接服务器终端,输入git,若没有git,则按提示安装。
-
克隆项目
# 先进入到 /www/wwwroot/ 文件夹,再克隆项目 cd /www/wwwroot/ git clone 远程仓库url
方式一:https连接方式: 直接复制url克隆项目。
方式二::SSH连接方式:生成ssh密钥,添加到仓库密钥中。检测连接并拉取。注意:仓库密钥没有推送权限。
# 生成 ssh 公私钥 ssh-keygen -t rsa # 添加公钥到git仓库后,验证连接 ssh -T git@gitee.com # 克隆仓库 git clone 仓库ssh连接
四、初次运行项目
1.进入python项目管理器下载项目python环境
2. 修改配置文件的 DEBUG=False,删除与总路由文件同位置的 __init__.py 文件中的 pymysql 模块配置
3. 配置 mysql 数据库
- 点击’数据库-添加数据库‘
- 按照配置文件中 mysql 配置填写‘数据库名’和’用户名‘。复制自动生成的密码覆盖配置文件中的密码。
- 点击导入,导入数据库备份文件,或进行第4步后,手动进入虚拟环境,迁移数据库。
# 进入虚拟环境
source 项目根目录/项目名称_venv/bin/activate
# 迁移数据库
python manage.py makemigrations
python manage.py migrate
4. 点击‘项目管理 - 添加项目’,内容设置如下
项目名称: 用于虚拟环境 (自动创建)
路径:项目根目录
框架: django
启动方式:uwsgi
启动文件:wsgi.py 所在路径
端口: 建议在8000+,需在服务器安全组和宝塔面板防火墙中放行。
安装模块依赖:√
开机启动:√
现在可以在浏览器中可通过 ip:端口号 的形式访问django项目中的非静态视图
5. 创建网站
点击‘项目管理-映射’,输入服务器 ip 或已备案域名,将创建 nginx 反向代理网站,可在网站栏中看到。
在浏览器中输入 服务器ip或已备案域名 可以打开标有“创建成功”字眼的默认网页。网址中无需输入端口号,也能访问django项目非静态页面。
实质:由nginx 反向代理将 域名或ip 解析为 ip:port 的形式再访问
五、部署静态文件
1. uwsgi 模式
-
打开python项目管理器,停止项目,点击配置;
-
添加代码,第二个等号左右两边不能有空格
static-map = /static=项目静态文件所在位置
-
重启项目
打开静态文件也没问题了
2. niginx 模式
- 打开python项目管理器,停止项目,点击配置;
- 添加 nginx 访问接口 socket,同时注释掉http。端口号要在面板防火墙和服务器安全组放行。
socket 127.0.0.1:端口号
- 收集静态文件
此步骤将admin、子应用和第三方模块的静态页面收集到一个静态文件目录。所以看情况收集,模块中没有静态文件的就不用收集了。
# 在配置文件中添加搜集路径
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
# 进入虚拟环境,运行收集命令
source 项目根目录/项目名称_venv/bin/activate
python manage.py collectstatic
- 打开’网站-设置-配置文件‘,作以下3个修改
# 1.注释原有的反向代理
#引用反向代理规则,注释后配置的反向代理将无效
#include /www/server/panel/vhost/nginx/proxy/39.108.120.229/*.conf;
# 2.自定义反向代理,端口号与 socket 相同
location / {
#include uwsgi_params;
uwsgi_pass 127.0.0.1:端口号;
}
# 3.说明静态路由和静态文件位置
location /static
{
alias 收集静态文件路径(末尾不加/,要和路由相匹配);
}
用 nginx 代理静态文件,能大大提高网站响应效率,减轻服务器负担。
socket 和 uwsgi_pass 的 IP 有效对应关系
socket uwsgi_pass 127.0.0.1 127.0.0.1 0.0.0.0 0.0.0.0/127.0.0.1/内网IP/外网IP 内网IP 内网IP/外网IP
六、启动 docker 容器
1. 拉取镜像
- elasticsearch-ik:2.4.6-1.0
- fastdfs
- mysql:5.7.34
2. 创建并启动镜像
elasticsearch
-
准备好配置文件和映射目录;
-
elasticsearch 和 项目 的 配置文件 中均使用内网IP;
-
启动命令如下,使用你自己的镜像名称:delron/elasticsearch-ik:2.4.6-1.0;
docker run -dit --name=esik --network=host -v ~/elasticsearch/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
fastdfs
-
修改 fastdfs 的 IP 为公网 IP,文件包括:
- 项目文件夹 utils 中的 client.conf 文件
- 配置文件 prod.py
-
启动项目
docker run -dit --name tracker --network=host -v ~/fdfs/tracker:/var/fdfs delron/fastdfs tracker
docker run -dit --name storage --network=host -e TRACKER_SERVER=公网IP:22122 -v ~/fdfs/storage:/var/fdfs delron/fastdfs storage
-
导入数据
压缩原来的 storage/data 文件夹,上传到 映射目录 storage 中解压
# 压缩命令,进入storage文件夹压缩
tar -zcvf data.tar.gz data
# 解压命令
tar -zxvf data.tar.gz
mysql 主从
见教程:https://www.cnblogs.com/52note/p/15160872.html
七、启动 celery 和 crontab
1. celery 的启动与关闭
启动测试,需要转到你创建celery任务文件夹(celery_tasks)的目录下执行。使用 Ctrl+C 关闭进程。
celery -A celery_tasks.main worker -l info
celery_tasks为模块名,worker 为进程名,均可自定义。-l info 日志等级:debug|info|error
守护式启动,关闭进程将 start 换成 stop(停止) 或 kill(关闭,编者没试过)
celery multi start cel \
-A celery_tasks.main worker \
--pidfile=./celery_tasks/cel.pid \
-l info --logfile=./logs/celery_tasks.log
cel 为进程名,--pidfile 进程文件, --logfile 日志文件,文件位置最好自定义,使用默认的可能会报错。
关闭所有celery服务,守护式 celery 任务需要通过进程名关闭。
ps auxww | grep 'celery' | awk '{print $2}' | xargs kill -9
注意:每次重启项目,都要重启 celery。
2. 修改邮件端口号
打开配置文件,修改邮件端口
EMAIL_PORT = 587 # 或 465。25端口被禁用了。
25号端口被视为危险端口,已被禁止使用,推荐SMTP用 465 ,我试过,也不行。详情见阿里云控制台-云服务器-安全组-安全组规则-教我设置-常用端口(-25号端口解封申请)。
3.crontab 定时任务
# 添加定时任务到系统中
$ python manage.py crontab add
# 显示已激活的定时任务
$ python manage.py crontab show
# 移除定时任务
$ python manage.py crontab remove
4. 宝塔面板计划任务
执行释放内存等预设任务;
执行自定义任务使用 shell 脚本;
脚本中填写终端命令即可。比如某些访问频繁但内容固定不变的页面的静态化。
cd /www/wwwroot/project/
source venv/bin/activate
cd scripts/
python regenerate_static_html.py
cd ..
cp -r meiduo/static/detail/ /www/wwwroot/39.108.120.229/static/
注意:
- 每条命令的长度不能超过脚本内容框长度,否则很容易出错。
- 创建任务后,先执行,查看日志,确认脚本正常执行。
- 如果脚本错了,建议删除后,重新创建更安全。
- 千万注意不要在添加任务后使用编辑功能修改脚本,这样很容易出错。
八、其他
支付宝支付
- prod.py 中的 ip -> 公网ip 或域名
QQ登录
- prod.py 中的 ip -> 公网ip 或域名
九、备份代码
改了这么久,该把项目文件备份一遍了。由于服务器 git 使用的是远程仓库密钥,没有推送权限。所以下载到本地,重新创建个私有仓库用来备份。毕竟项目中有了很多敏感信息可不能泄露。
结束语
第一次做部署上线,真不简单。一个人弄了将近一个月,才总算大功告成。这篇笔记从准备到写完用了十多天,前期写草稿时,边写边测试,相当费时费精力,当然收货也是不少,特别是宝塔面板,基本上所有操作都是基于宝塔面板。
文件修改汇总
项目文件
prod.py
-
DEBUG = False
-
修改IP,建议用变量装载 IP,就不需要一个个去找了。
-
mysql 数据库
- 删除 pymysql,在项目同名模块的 __init__.py 文件中
- 修改数据库密码
-
静态文件收集
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
-
邮件端口号
EMAIL_PORT = 587
client.conf
- fastdfs 配置文件,修改 host 为公网 IP
其他文件
elasticsearch.yml
- elasticsearch 配置文件,修改 host 为私网 IP
uwsgi 配推荐置
- 二选一,都选也没事。
socket 127.0.0.1:端口号
static-map = /static=项目静态文件所在位置
nginx 配置
- 前提:uwsgi 设置了 socket
location / {
#include uwsgi_params;
uwsgi_pass 127.0.0.1:端口号;
}
location /static
{
alias 收集静态文件路径(末尾不加/,要和路由相匹配);
}
命令汇总
# 安装宝塔面板
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
# 模块打包
python freeze > requirements.txt
# git命令
$ git
$ git config --global user.name 'name'
$ git config --global user.email 'email'
$ git config --list
$ ssh-keygen -t rsa
$ ssh -T git@gitee.com
$ git init
$ git remote add origin 远程仓库url
$ git pull origin master
$ git push origin master
# 虚拟环境及迁移
cd /www/wwwroot/
source 项目根目录/项目名称_venv/bin/activate
python manage.py makemigrations
python manage.py migrate
# docker 命令
docker pull mysql:5.7.34
docker run -dit --name=esik --network=host -v ~/elasticsearch/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
docker run -dit --name tracker --network=host -v ~/fdfs/tracker:/var/fdfs delron/fastdfs tracker
docker run -dit --name storage --network=host -e TRACKER_SERVER=公网IP:22122 -v ~/fdfs/storage:/var/fdfs delron/fastdfs storage
sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v ~/slave_mysql/data:/var/lib/mysql -v ~/slave_mysql/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.34
docker ps -a
sudo docker rm -f mysql-slave
# mysql 命令
mysql -V
sudo service mysql restart
mysql -uroot -p
show master status;
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
REPLICATION SLAVE;
mysql -uroot -pmysql -h 127.0.0.1 --port=3307
rm -rf ~/slave_mysql/data/*
change master to master_host='127.0.0.1', master_user='slave',master_password='slave',master_log_file='mysql-bin.000009',master_log_pos=1562;
start slave
show slave status \G;
> mysqldump -uroot -pmysql --databases db_name --lock-all-tables > ~/master_db.sql
> mysql -uroot -pmysql -h127.0.0.1 --port=3307 < ~/master_db.sql
# 压缩解压
tar -zcvf data.tar.gz data
tar -zxvf data.tar.gz
# celery
celery -A celery_tasks.main worker -l info
celery multi start cel -A celery_tasks.main worker --pidfile=./celery_tasks/cel.pid -l info --logfile=./logs/celery_tasks.log
ps auxww | grep 'celery' | awk '{print $2}' | xargs kill -9
# crontab
python manage.py crontab add
python manage.py crontab show
python manage.py crontab remove
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix