简介
在这里记录下一个普通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.wsgimaster = trueprocesses = 4vacuum = true# 日志地址
daemonize = /data/apiroot/simplespace-server/logs/logs# uwsgi进程pid文件,后续对uwsgi进行重启操作需要用到
pidfile = /data/apiroot/simplespace-server/logs/pidstats= /data/apiroot/simplespace-server/logs/uwsgi.status# 此选项关系到接口长时间计算的返回状态,后续文章将讲解,数值过小的时候进行长时间技术会被终止计算
harakiri=30#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy=10# 开启内存使用报告
memory-report=truepost-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请求都转发到httpsreturn 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 欢迎访问指点