Django 项目的部署上线

Django 项目的部署上线

准备工作

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
    

    附:宝塔网址https://www.bt.cn/

    > 安装完成后,会给出以下信息:

    外网面板地址: 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
    
    1. 删除 pymysql,改成 mysqlclient,centos7.x 默认的 mysql 驱动
    2. 首行添加 setuptools-scm , 确保安装与 django2 配套的 django-haystack 和 django-redis,否则会自动安装 django3
    3. 确保依赖文件与 manage.py 同位置
  • 添加git忽略文件

    1. 如果没有远程仓库,先到码云或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 
    
    1. 修改 .gitignore 文件
    # 添加如下内容
    *.pid
    *.log
    test*
    uwsgi.ini
    # 虚拟环境
    *_venv/
    # 迁移文件
    0*
    collect_static/
    admin/
    
    1. 推送
    # 添加并提交
    $ 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
posted @   流水自净  阅读(466)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示