前言:如果你在布署Django项目时,遇到了困难,你可以私信我!我们一直交流讨论。这篇文章花费了几天的时间,路过千山万水(踩过坑),看过无数“奇珍异宝(文章)”,最后才敢把它呈现在你的面前。

世界上没有免费的午餐,免费的只有水和空气。    --- 提前声明

目录

前言:如果你在布署Django项目时,遇到了困难,你可以私信我!我们一直交流讨论。世界上没有免费的午餐,免费的只有水和空气。

一、布署python项目

- 安装环境

- 打包模块

- 引入数据库

- 添加网站

- uwsgi启动服务

- 管理项目

- 样式处理

- 测试环节

- 部署环节

- 总结:

二、部署项目事项

1.布署位置

2. 花生壳域名

3.多个网站项目

4. navicat连接远程


一、布署python项目

- 安装环境

在宝塔的应用商店安装python管理器,安装python 3.8.5版本

如果是上线 API, 则不建议使用浏览器去检测是否正常访问

一般来说,浏览器都会有缓存。而建议下载 一个postman 或者 runapi 去测试接口。

安装runapi对写规范的接口文档很有帮助

- 打包模块

(1.将本地计算机的项目下的模块打包

python -m pip freeze > requirements.txt

(2.配置settings,设置静态文件的位置

DEBUG = True
​
ALLOWED_HOSTS = ['121.xxx']   ## 公网IP
​
STATIC_URL = '/static/'
​
# STATICFILES_DIRS = [
​
# os.path.join(BASE_DIR, "static")
​
# ]
​
STATIC_ROOT = os.path.join(BASE_DIR, "static") 

- 引入数据库

在navicat导出sql文件,然后引入数据库,重新设置setting.py文件

image-20211204093818511

步骤:先创建数据库,然后输入xxx 用户名, root 密码(这其实可以认为是一个变量,因为顶部的 root密码 才是真实的数据库密码)

image-20211127111122220

注意:以后修改数据库,可以选择在本地的navicat连接远程 宝塔中的数据库。 (具体详情看下方)

- 添加网站

准备两个端口,3233 (外网访问) , 3234 (内网连接)

公网ip默认 80, 只需再准备一个 7788 (内网连接端口)

左侧的网站添加新的网站, 点击 添加站点

image-20211204094325266

前面的域名可以随便设置,然后设置访问的 公网IP + 端口 (外网 3233)

image-20211202231919268

双击根目录,上传项目下的网站数据

先把默认的的404.html和404.html文件删除,然后点击上传。项目下的所有文件

image-20211127121130300

上传python模块包列表

image-20211127121331915

- uwsgi启动服务

在项目下新建一个uwsgi.ini空白文件,添加下面的内容,

注意:放行 阿里云和宝塔的端口 7788 (自定义,内网连接端口)

这个是nginx和uwsgi启动服务的套接字连接端口

#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接,      
socket=127.0.0.1:3234                 #### 修改端口
#配置项目路径,项目的所在目录
chdir=/www/wwwroot/www.myDjangoAPI.com/           #### 绝对路径的子目录,不建议删除。 
#配置wsgi接口模块文件路径,也就是 wsgi.py 这个文件所在的目录,这个文件是Django下的默认配置文件
wsgi-file= TTAS/wsgi.py                #### 修改文件夹
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录, ` 不要舍去  , 日志保存在项目下, 否则可能会出现编码格式错误
daemonize=/www/wwwroot/www.myDjangoAPI.com/uwsgi.log`     

然后,连接nginx,修改网站配置

网站--》 选中当前项目 --》 设置 ---》 配置文件

记得点击保存

nginx找到 映射到 运行的项目中 7788商品 (其实也不用开启外网访问的端口)

     location / {
       include /www/server/nginx/conf/uwsgi_params;  ### 如果这个关闭了,会导致uswgi无法运行   
       uwsgi_pass 127.0.0.1:7788;                 #端口要和uwsgi里配置的一样
       uwsgi_param UWSGI_SCRIPT TTAS.wsgi;         #wsgi.py所在的目录名+.wsgi
       uwsgi_param UWSGI_CHDIR /www/wwwroot/www.myDjangoAPI.com/; #项目路径
    }
    location /static/ {
      alias /www/wwwroot/myDjango/static/;         #静态资源路径
    }

image-20211204091005562

- 管理项目

python管理器添加项目

image-20211204091740359

如果还需要其它模块, 可以点击 python管理器中的 当前项目的 模块, 进行安装。

python管理器中,可以查看当前项目的配置,(就是上面输入的uwsgi.ini的文件内容)

image-20211127124315548

也可以到终端的虚拟环境venv 安装模块

source /www/wwwroot/myDjango/myDjango_venv/bin/activate
​
一般是在项目下(出现xxx_venv)
source myDjango_venv/bin/activate

注意: myDjango_venv是在python管理器添加项目时生成的文件名,里面保存着模块。 项目名+ _venv


任何处理uwsgi服务信息,都需要重新启动项目。

浏览器会存在延迟,可以先使用xxx:3000等后端进行测试缓存。

- 样式处理

如果在第一步没有设置好settings文件,则需要进行更新 (并且需要 在nginx添加 外网访问的静态文件 location / static/ { ... }),, 测试连通性也依然可以使用php文件。

除了在settings文件添加

STATIC_ROOT = os.path.join(BASE_DIR, "static")
cd   myDjango
source myDjango_venv/bin/activate       激活虚拟环境,可以使用pip命令
​
pip list                                查看模块
python manage.py  collectstatic         采集静态资源,结果会保存在项目下的static目录,
                                        而不是应用里面的static目录,所以它只是一个收集的作用。

image-20211127125047646

使用宝塔面板快速部署Django项目-Django社区,Django中文网,django教程,Django!

通过宝塔面板的python项目管理器部署django项目(部署在服务器)_lizige2008的博客-CSDN博客

其实这里访问的还是静态文件,nginx访问的是直接文件

如果说需要访问应用下的static,那还要自定义路由,将应用下的static暴露出来。

总结:外网访问的顺序, 1. 直接路径, 就是可以直接找到的文件,

2.匹配路径,当前项目下的nginx配置, location xxx{ }

(1. 最长先匹配

(2. 有后缀的再匹配

(3. 最后再匹配 “/” 根路径。(一般就是自动运行的应用路由)

注意:只要前面匹配到了相关模式,不管结果如何,都不会再次进行匹配。


在使用uwsgi服务前,可以先进行测试。数据库和运行

启用前,请先经过测试,再运行项目。

- 测试环节

运行环境出错 (测试)

<span style="background-color:#f8f8f8"><span style="color:#333333">需要在(venv)下运行 python manage.py runserver 7788</span></span>

(1.无法识别mysql包

在应用项目下添加__init__.py文件夹
import pymysql
pymysql.install_as_MySQLdb()

(2.mysql数据库出错。 (密码要设置为xxxx)

mysql -u root -p
use mysql;
宝塔终端,查看密码,结果是密码有问题

(3.数据模型出错

在(venv)下运行 执行:python manage.py migrate
​
它可以让我们在修改Model后可以在不影响现有数据的前提下重建表结构。

(4.无法访问重启后的资源

确认是使用Django模块, 而不是使用python
使用uwsgi启动。

这里测试运行: 公网ip + 已经放行的端口, 虚拟环境下使用

python mange.py runserver 0.0.0.0:3233           上面的settings只要允许 公网IP主机访问就行。

image-20211204083937820

浏览器中,如果可以正常访问,说明项目可以运行,没有问题

访问地址 :   公网ip:端口

image-20211204115744270

查看 端口是否已经使用, 查看 uwsgi是否可以正常运行

下面是python管理器正常运行的项目, 项目是会占有 一定的CPU, 如果是占用不到百分之一,那就有可能出现了问题。

image-20211204114040822

uwsgi.log` 自定义位置,生成的项目运行文件 , 但真实上线必需删除控制台的输出

1.可以看到uwsgi 运行的日志

2.可以看到 项目在控制台输出的信息

image-20211204125008342


- 部署环节

前言,布署环节不应该修改以上测试成功的代码,包括配置路径。这里只是检查是否有缺少的设置。uwsgi.ini不要去修改,上面已经是正确的配置。

(1.端口占用

首先暂停相关已经开启的uwsgi.ini 服务,(就是关闭网站),然后kill杀死进程。

在阿里云服务器或者宝塔服务器终端云kill端口 
​
先查询端口                      netstat -anp | grep 3233
​
再查看端口对应的PID              lsof -i:3233
​
根据PID杀死进程                  kill -s 9  xxxxxx   或者 kill  xxxx

(2.无法启用python项目 (????)

然后在创建项目的时候,仔细查找刚才关闭的uwsgi.ini是否还存在(否则会python管理器会无法运行)

也可以再次查看 3233 , 3234端口。 宝塔面板的终端和项目下的终端

image-20211204082708107

最后在 /www/wwwroot/www.myDjangoAPI.com/uwsgi.log 项目运行的日志文件中找到

WARNING: you are running uWSGI as root, 或者说 chdri() : to /www/wwwroot/www.myDjangoAPI.com/ 没有找到,则一定是nginx的配置出现 了问题。

其实就是nginx找不到这个子文件夹,因为nginx 中有个 include属性 它可以帮助我们找到这个子目录。

每次开关网站,都有可能会自动关闭这个选项。

image-20211204114758532

python管理器又可以重新开启这个项目。

特别说明: 如果不行的话,可以尝试使用 命令启动 uwsgi.ini ,而不是通过python 管理器

image-20211204091948118

(3. 出现无法访问网站

出现无法访问,并且端口开启却没有使用。 那就是项目还有缓存, 即使 nginx 重启,也没有更新项目。

重启nginx服务必须先暂停所有网站的连接(网站+管理器)

  1. 先检查是否可以访问网站, (默认有index.html文件, 或者可以创建一个getapi.php文件)

    使用 xxxx:端口/getapi.php

    <?php
    ​
       header('Access-Control-Allow-Origin: *');      ## 使用真正接口的参数
       echo '{ "username" : "zhangsan", "content":"这是一个测试"}';
    ​
       echo "这是一个getapi.php";

    如果还是访问不了,那就检查nginx服务有没有开启。 修改完nginx, 打开 需要运行的项目, 并重新启动nginx, 一般就可以 使用 xxxx:端口/getapi.php

  2. 再检查是否放行的端口没有正确使用(在宝塔的 安全 选项卡中可以查找端口的使用情况)

    重要的事情说三遍:暂停所有项目,然后再操作nginx ( 点击首页, nginx中的重启)

    如果说前面已经点击 “nginx面板” 的 重载配置 , 并且网站使用的是默认 80端口, 那原来默认是指向 888 端口的,所以需要修改为 80 端口。(这是nginx的总配置)

    image-20211204092303432

  3. 然后检查是否是 uswgi.ini 的问题

    uwsgi.ini 文件配置 --》 当前网站项目 的 文件配置

    不过这又 回到无法启用python项目的 步骤了,主要是查看 uwsgi.ini 的端口(3234),然后查看一下 uwsgi.ini的运行日志。

    最后,在uwsgi.ini中出现的异常,自身解决不了,可以找度娘。

(4. 504 网关错误

即使再变,也不要修改以上基本流程的代码。 本次测试,其实,只是nginx服务器出现了小的异常

image-20211204115418909

如果有问题, 再去看看来时的方向。 使用宝塔面板快速部署Django项目-Django社区,Django中文网,django教程,Django!

- 总结:

 **部署使用的端口**
​
   (1.  外网访问这个公网的项目,使用的是3233这个端口
   (2.  (nginx配置文件就是监听这个3233 ),当接收到外来的访问,
   就会找到 公网下的本地路径 location /{   },.  如果外网需要访问静态资源
   还需要设置静态目录  location /static/{  }
​
  (3. 而location / { 里面包含了 是否可以自启动的 模块 (uwsgi.ini )
     127.0.0.1:3234  }, 指定这个公网下的本地运行端口 3234.  如果没有找到直接路 
      径,就会在运行的项目中是否有相关的路由(外网是不能直接访问 运行项目中 
       的  static文件)
  (4. 而项目下的 uwsgi.ini 使用的是 127.0.0.1:3324 这个端口, 并且 python管理器
   也是使用这个 3234 端口。 uwsgi.ini 是自启动的功能,  python管理器 主要是对
   项目的模块进行管理, 并且连接数据库 (如果外网需要访问 静态资源,则不能 
    直接在项目中获取失败,毕竟它没有返回的接口数据)。</span></span>

二、部署项目事项

一个公网下,可以添加多个端口号来制作成不同的项目。

1.布署位置

  • wwwroot目录

这个目录可以放前端项目,也可以放置后端项目,就是改端口号

  • 单个项目:

一般来说 公网 IP 可以直接配置 vue前端项目, 访问也可以直接通过 公网 IP 访问网站。 当然,把唯一的 公网IP的访问功能 让给后端也可以。就是省去添加端口号(80)。同时,也可以使用反向代理,访问在 wwwroot 运行的nodejs 后端接口 。

image-20211127143359799

  • 多个项目:

    单个项目的基础上, 可以在不先指定域名的情况下,先创建项目再配置域名。而后配置的域名就可以使用再 端口 的形式,制作多个后端接口。 公网IP + 不同端口 访问后端接口, 公网 IP 访问前端网站。

    一般使用python的 rest_framework去安装的制作接口的话,就需要使用这种方式。后端接口也可以直接指定域名

    image-20211127143514040

    image-20211127143547661


2. 花生壳域名

无法访问通过 DNS找到公网 IP + 80 , 但可以使用 公网 IP + 其它端口

公网ip 默认端口号 80, 花生壳的域名无法解析到结果, 只有通过 公网号IP + 端口 才能通过域名解析,找到对应的主机。

3.多个网站项目

1.创建一个空的域名不允许在 这里使用 公网号IP + 不同端口格式

image-20211127141117328

2.修改项目指向的项目的域名 (这里可以直接放置真实域名)

image-20211127141458200

3.开放端口后,可以通过 公网号IP + 不同端口格式访问

image-20211127141424400

4.上面可以直接添加真实域名,DNS解析到服务器。

也可以使用花生壳的域名, 添加映射的 公网号IP + 不同端口,找到IP服务器。

image-20211127141830183

通过花生壳的域名访问目标服务器,ok, 搞定。

image-20211127142122600

4. navicat连接远程

  1. 宝榙和阿里云服务器上放行3306端口。

  2. 定塔放行数据库权限 ,(所有人访问)

  3. navcat访问宝塔数据库 (名称是 xxx, 密码是root, 端口3306, 主机 :公网ip)

    image-20211128131541770

    image-20211128131703867

创作不易,请不要转载!支持原创,才是正道。我们要有所为,有所不为!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐