简介
在这里记录下一个普通DRF项目(比如本站后端)用最普通的部署流程部署到Linux生产环境的过程,使用到的相关工具,技术 Linux
, Nginx
, Uwsgi
。当然生产环境的部署肯定需要你有个Linux云服务器
,备案域名
。
部署流程
- 首先,确保服务器安装了符合条件的Python版本以及Nginx,这点默认大家都没问题
- 再将你的项目clone到服务器本地,在你要部署的路径下clone项目,并安装好依赖
cd /data/apiroot # 我的后端部署路径
git clone https://****.git # 我的git仓库地址
cd 项目名称 # 进入项目目录
# 创建虚拟环境
python3 -m venv venv_lib # 其中 venv_lib 为 虚拟环境目录名,可自由指定
# 进入虚拟环境
source venv_lib/bin/activite
# 然后根据项目所需依赖,安装依赖包,当然如果之前导出了所需依赖列表,安装更方便
pip install -r requirements.txt
验证环境
反复确认项目所需依赖是否安装完成,项目链接数据库地址或其他关联链接是否能正常访问,使用runserver启动服务试试有没有明显的环境相关错误。
3.反复确认项目所需依赖是否安装完成,项目链接数据库地址或其他关联链接是否能正常访问,使用runserver启动服务试试有没有明显的环境相关错误
4. 退出虚拟环境,使用外部pip安装uwsgi
pip install uwsgi
- 编写uwsgi.ini配置文件
[uwsgi]
# 缓冲区大小
buffer-size = 65536
# socket 端口
# 当配合nginx使用的时候,开启socket端口,如果不通过nginx,直接对外网开发的情况下可以直接使用http端口
socket = 127.0.0.1:6667
# 项目路径
# 其中 /data/apiroot/ 是我部署项目的根路径, simplespace-server 是项目名称,也是git clone后生成的项目文件夹,
# SimpleSpaceServer是项目主目录,也是创建Django项目后的主目录,SimpleSpaceServer目录下可以找到manage.py,可以根据这个来确认项目路径
chdir = /data/apiroot/simplespace-server/SimpleSpaceServer
# 虚拟环境路径
# 这也是我们上一步穿件的虚拟环境目录
virtualenv = /data/apiroot/simplespace-server/venv_lib
# 这个module中,SimpleSpaceServer这个名称也就是我们setting.py wsgi.py等文件所在的那个文件夹名称
module = SimpleSpaceServer.wsgi
master = true
processes = 4
vacuum = true
# 日志地址
daemonize = /data/apiroot/simplespace-server/logs/logs
# uwsgi进程pid文件,后续对uwsgi进行重启操作需要用到
pidfile = /data/apiroot/simplespace-server/logs/pid
stats= /data/apiroot/simplespace-server/logs/uwsgi.status
# 此选项关系到接口长时间计算的返回状态,后续文章将讲解,数值过小的时候进行长时间技术会被终止计算
harakiri=30
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy=10
# 开启内存使用报告
memory-report=true
post-buffering=4096
- 编写uwsgi启动配置并且正确安装uwsgi后,启动uwsgi服务
uwsgi --ini run_uwsgi.ini
:::tip 验证uwsgi启动状态
在执行uwsgi --ini run_uwsgi.ini
后如无明显报错,在设定的日志目录中应该有生成日志和pid文件,查看日志可验证启动状态以及可能的报错信息
可以通过lsof -i:6667
命令查看uwsgi是否正确启动,端口是否正常开启
:::
7.截止uwsgi服务状态都确认无误后,编写对应的nginx配置,接收本机地址6667端口(自己设定的端口)
server {
listen 80;
server_name simplespace-api.simplespace.site;
# http请求都转发到https
return 301 https://$host%request_uri;
}
server {
listen 443 ssl;
listen 18443 ssl;
server_name simplespace-api.simplespace.site;
# ssl证书地址
ssl_certificate /usr/local/nginx/ca_ssl/simplespace.site/all/cert.pem;
ssl_certificate_key /usr/local/nginx/ca_ssl/simplespace.site/all/key.pem;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# 项目路径
set $root /data/apiroot/simplespace-server/SimpleSpaceServer;
charset UTF-8;
location /media/ {
alias $root/media/; # 指向媒体文件目录
# 如果需要,可以添加缓存和过期头部等配置
add_header Access-Control-Allow-Origin '*';
}
location / {
include /usr/local/nginx/conf/uwsgi_params;
# 转发到本机uwsgi指定的端口中
uwsgi_pass 127.0.0.1:6667;
}
}
- 重启Nginx,外网访问域名测试,基本的部署流程完结
可能出现的问题以及调试
一切顺利的情况下,现在已经能在外网访问到你的后端接口了,如果出现问题,根据项目直接启动,uwsgi,nginx不同层次分开排查,在项目正常启动,排查uwsgi,uwsgi日志正常,排查nginx。当然要保证你的域名有合法的备案和正确的解析,
解析: 首先要确保域名访问能正常的解析到该服务器上来,可以在nginx的日志中查看访问记录来确认。
环境依赖: 当然部署最有可能出现问题的还是python的环境依赖问题,直接pip install -r req.txt
其实是很容易出现冲突问题的,我的建议是将主要的包比如django,根据版本优先安装,比如先执行pip install Django==3.6
,将主要的模块安装好,依赖冲突问题会少很多。
mysql环境: 如果使用的是mysql,要在linux中确保已经安装了mysql的依赖环境,然后python的mysql-client驱动先去官网找到对应版本(最好存放git仓库中),在pip虚拟环境中直接安装,比如pip install mysqlclient-1.4.6-cp36-cp36m-win_amd64.whl
原文发布在本人个人博客网站:www.simplespace.site 欢迎访问指点