【Django】宝塔面板部署Django+MySQL项目实战

【Django】宝塔面板部署Django+MySQL项目实战,第1张

文章目录 一、环境准备1.1 部署环境1.2 相关概念1.3 工作流程 二、部署流程2.1 部署前准备2.1.1 调开发模式为生产模式2.1.2 导出项目依赖包2.1.3 收集静态文件 2.2 部署2.2.1 下载宝塔面板2.2.2 安装软件2.2.3 添加站点2.2.4 上传项目至文件2.2.5 编辑uwsgi.ini文件2.2.6 配置数据库2.2.7 添加项目2.2.8 配置网站2.2.9 子域名绑定 2.3 验证 三、报错3.1 nginx报502网关错3.1.1 进入虚拟环境的方法3.1.2 我的问题 3.2 Internal Server Error3.3 后台admin样式失效 四、日志文件五、Reference六、个人总结

一、环境准备 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将返回值进行打包,转发给uWSGIuWSGI接收后转发给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文件。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/927166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存