(1)DRF项目服务器部署(Linux/Nginx/Uwsgi)

简介

在这里记录下一个普通DRF项目(比如本站后端)用最普通的部署流程部署到Linux生产环境的过程,使用到的相关工具,技术 Linux, Nginx, Uwsgi。当然生产环境的部署肯定需要你有个Linux云服务器备案域名

部署流程

  1. 首先,确保服务器安装了符合条件的Python版本以及Nginx,这点默认大家都没问题
  2. 再将你的项目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
  1. 编写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
  1. 编写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;
    }
}

  1. 重启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 欢迎访问指点

你可能感兴趣的:(服务器,linux,nginx)