宝塔面板部署Django+MySQL项目实例详细教程

发布时间:2022-05-21 10:25

一、环境准备

1.1 部署环境

宿主机:阿里云ECS

环境:CentOS 7.9 + Nginx 1.20.2 + MySQL 5.7.37 + Python 3.8.5 + Django 3.2.0

简而言之,在ECS上,用 Nginx + uWSGI 部署 Django。

1.2 相关概念

1、Nginx:Web服务器,网站对接客户端的接口。承担正向解析和反向解析功能,承担处理所有静态http请求的责任;

2、WSGI:一种为python web定义的协议,django就是运行在此协议之上。

3、uwsgi:uWSGI服务器的独占协议,一般用于uWSGI服务器与其他网络服务器的数据通信,这里实现uWSGI服务器与Nginx服务器的通信;

4、uWSGI:Web服务器,它实现了WSGI协议、uwsgi协议、http协议等协议;

在这里插入图片描述

1.3 工作流程

在采用 nginx + uwsgi 的方式部署Django项目的方式中。nginx是对外的服务接口,外部浏览器通过url访问nginx。当面对一次Web请求时, nginx 作为服务器的最前端,它将接收 web 的所有请求,并统一管理这些请求。

  • 对于静态请求:nginx 服务器自己处理所有静态请求。
  • 对于动态请求:nginx服务器将所有非静态请求转发给通过uwsgi协议转发给uWSGI服务器处理。
    • uwsgi 接收到请求之后将请求包处理成uWSGI可以接受的格式,并发给uWSGI;
    • uWSGI通过WSGI协议将包转发给Django,WSGI会根据请求调用django工程的某个文件或函数,处理完后django将返回值交给WSGI;
    • WSGI将返回值进行打包,转发给uWSGI
    • uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。

服务器工作流程:

在这里插入图片描述 在这里插入图片描述

二、部署流程

2.1 部署前准备

2.1.1 调开发模式为生产模式

Django配置文件setting.py修改,调开发模式为生产模式:

DEBUG = False# 开发模式为True,实际生产False
ALLOWED_HOSTS = ['8.130.98.214']# 开发模式为*,实际生产为真实IP或域名

STATIC_URL = '/static/'
# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "static"),# 开发模式
# ]
STATIC_ROOT = os.path.join(BASE_DIR, "static")# 生产模式

2.1.2 导出项目依赖包

pip freeze > requirements.txt

2.1.3 收集静态文件

python manage.py collectstatic# 必须调到生产模式才能成功

其中带有后台的项目必须要收集静态文件,部署时才能显示后台。

2.2 部署

2.2.1 下载宝塔面板

宝塔面板官网: https://www.bt.cn/new/download.html

我选择了CentOS版本:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

注意:必须为没装过其它环境如Apache/Nginx/php/MySQL的新系统,推荐使用centos 7.X的系统安装宝塔面板。

2.2.2 安装软件

软件商店 — 下载MySQLNginxPython项目管理器在这里插入图片描述

加粗样式 在Python项目管理器中安装Python3.8.5

2.2.3 添加站点

在这里插入图片描述

域名:wl01.weiyuting.cn 选择MySQL数据库,会自动创建一个库。

数据库名:wl01_weiyuting_c 用户:wl01_weiyuting_c 密码:FA6sy2CD2tyNGGAn

在这里插入图片描述 在这里插入图片描述

2.2.4 上传项目至文件

1.文件→wl01.weiyuting.cn→删除404.html与index.html文件

在这里插入图片描述

2.打包自己的项目,此时此压缩包中包括

在这里插入图片描述 3.上传至项目根目录 在这里插入图片描述 4.解压压缩文件

在这里插入图片描述

2.2.5 编辑uwsgi.ini文件

在刚创建的项目根目录中新建uwsgi.ini文件

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
socket=127.0.0.1:9001
#配置项目路径,项目的所在目录
chdir=/www/wwwroot/wl01.weiyuting.cn/
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录
wsgi-file= myscan/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置uwsgi日志记录
daemonize=uwsgi_01.log

2.2.6 配置数据库

1.将本地数据库sql文件导入

在这里插入图片描述 在这里插入图片描述 2.修改项目配置文件setting.py 中 MySQL配置,和数据库连接

在这里插入图片描述

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'wl01_weiyuting_c',
'USER': 'wl01_weiyuting_c',
'PASSWORD': 'FA6sy2CD2tyNGGAn',
'HOST': 'localhost',
'PORT': '3306',
}
}

2.2.7 添加项目

Python项目管理器添加项目

在这里插入图片描述 在这里插入图片描述 注意启动文件选择刚才编辑的uwsgi.ini文件,端口号与uwsgi.ini中配置的相同。 之后编自动下载requirement.txt中的项目依赖。

在这里插入图片描述

2.2.8 配置网站

在这里插入图片描述

在这里插入图片描述 加入:

location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9001;#端口要和uwsgi里配置的一样
uwsgi_param UWSGI_SCRIPT myscan.wsgi;#wsgi.py所在的目录名+.wsgi
uwsgi_param UWSGI_CHDIR /www/wwwroot/wl01.weiyuting.cn/; #项目路径
}
location /static/ {
alias /www/wwwroot/wl01.weiyuting.cn/static/; #静态资源路径
}

2.2.9 子域名绑定

在这里插入图片描述

将网站IP填入

在这里插入图片描述

2.3 验证

有域名可通过域名访问,没通过通过IP直接访问,注意放行网站的80端口。

1、前台:

在这里插入图片描述

数据库中数据都成功引入。

2、后台:

在这里插入图片描述

没有静态文件丢失。

三、报错

3.1 nginx报502网关错

如果报502网关错,首先在虚拟环境下执行,看一下项目是否能正常启动。

3.1.1 进入虚拟环境的方法

1、进入虚拟环境

每个人机子虚拟环境地址不一样,先搜一下虚拟环境的入口:

find / -name activate

在这里插入图片描述

执行,进入虚拟环境:

source /www/wwwroot/wl01.weiyuting.cn/6ef364d0181464ca4a42c6bdf1ffbbe9_venv/lib/python3.8/venv/scripts/common/activate

出现项目名 VENV_PROMPT 这个标记,才说明已经成功进入虚拟环境。此时可以看一下虚拟环境中安装的依赖:

在这里插入图片描述

2、在虚拟环境中再次进入项目根目录

 cd /www/wwwroot/wl01.weiyuting.cn/

此时可以执行在开发模式中的启动服务命令,进行测试。

python3 manage.py runserver

在这里插入图片描述

如果提示报错请先检查一下项目是否本身存在报错问题,尤其是requirements.txt依赖是否都装全了!我好几次在这踩坑。

其次一定要多看日志!错误记录都在日志中!

3.1.2 我的问题

我的问题是当项目部署后,继续编写项目,装了新包,但没有重新导出requirements.txt,部署的项目中没有装入这个包,这时前端会报nginx网关错。这里网上解决方案都和php相关,但我的项目中根本没有php,所以一味改nginx配置文件一点用没有!后来我是从uwsgi日志中发现的错误,错在uwsgi而不是nginx。这时可以去到虚拟环境里继续调试项目。

注意:宝塔面板部署的项目,依赖都在虚拟环境中,比如进入虚拟环境才能调试,才有效,在真实环境中调试无效!

3.2 Internal Server Error

访问显示出现 Internal Server Error 之类的错误的话,可能是程序不能正常运行的原因。请进入虚拟环境(进入方法在3.1.1节)下,使用python3 manage.py runserver 命令运行项目,看项目能不能正常运行,不能正常运行就按错误提示进行解决就好。程序能正常运行使用项目管理器重启一下项目就能正常访问。

3.3 后台admin样式失效

网页f12打开调试模式会发现样式都404了。

请先进入虚拟环境收集静态文件:

python3 manage.py collectstatic# 必须调到生产模式才能成功

并将setting.py中开发模式调为生产模式。

四、日志文件

两个比较重要的日志:

在这里插入图片描述在这里插入图片描述

uwsgi日志根据你的uwsgi.ini配置文件而定。

五、Reference

1、宝塔Linux部署Django项目教程|带MySQL数据库:https://www.bilibili.com/read/cv14309219 2、解决django项目部署到nginx+uwsgi服务器admin后台样式消失的问题: https://blog.csdn.net/qq_42571805/article/details/80862455 3、使用宝塔面板快速部署Django项目:https://blog.csdn.net/weixin_42134789/article/details/120030452

六、个人总结

1、错误日志很重要,要看全日志;

2、注意你所在环境:宝塔面板部署的django项目依赖都在虚拟环境中,调试项目必须进入虚拟环境;

3、注意你所在模式:部署前一定要先收集静态文件,并调开发模式为生产模式(但如果在开发时项目为生产模式同样会造成后台静态文件丢失);

4、uwsgi.ini很重要,django的启动文件是自行编辑的uwsgi.ini文件。

文档下载:宝塔面板部署Django+MySQL项目实例详细教程.doc文档

THE END
喜欢就支持一下吧