一、环境准备
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 安装软件
软件商店 — 下载MySQL
、Nginx
、Python项目管理器
;
在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文件。