技术博客-3 nginx+uwsgi部署DRF项目踩坑

在部署DRF(Django Rest Framework)项目时遇到了大量的问题,也学习了大量的博客,终于才将项目正确部署在Linux: Ubuntu服务器上,下面记录部署过程中踩过的坑。

一、运行DRF项目注意点

1. DRF项目目录树结构:

整个项目下有Font(前端的静态文件)和VisualPytorch(后端的django项目)两个文件夹,VisualPytorch作为django项目目录下每个文件夹都是一个app,还有一个用于管理项目的manage.py,还有一个同名的文件夹VisualPytorch,下面的settings.pyuwsgi.py均为django自动生成的,用于部署的文件。

2. DRF运行

visualpytorch项目克隆下来以后,并不能直接运行,作为DRF前后端分离的项目,需要将后端服务器运行起来,并通过文件的方式访问对应的页面(不能直接访问127.0.0.1:8000,因为在DRF项目中并未将index页面加入路由,而且静态页面也完全没必要)。

因为前后端是分离的,前端的html等静态文件,与后端Django项目文件是相对分离的。后端不需要写入前端的路由,前端也不用太关系后端的运行方式。只有在前端向后端发起GET请求时,才会给后端一个json,相应的,后端工作完成后返回一个json给前端。

首先需要配置数据库:在项目文件夹config下新建个db.py,内容为:

NAME='本地数据库名'
HOST='localhost'
PORT=3306
USER='用户名'
PASSWORD='密码'

打开mysql,并创建连接,用户名密码与db.py一一对应,在连接中创建对应名字的数据库,并保证开启状态:

后台运行mysql时,DRF会自动寻找对应的数据库,接下来就可以迁移数据及运行了,在项目文件夹下依次运行下列命令:

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

不能通过127.0.0.1:8000打开,而应该通过静态文件,所以设置浏览器的打开方式,以Chrome为例:在快捷方式——属性——目标中添加--allow-file-access-from-files,注意前面一定要有空格!

使用该快捷方式打开static中对应的index.html,就能得到正常跳转的页面了。

二、部署DRF项目坑点

在部署的过程中参照了部署Django REST Framework服务(Nginx + uWSGI + Django)。流程大概是对的(先配置好uwsgi,通过http方式能在对应端口上后台运行,再配置nginx,进行反向代理),然而照着教程做不清楚背后的原理,调了很久仍然出问题。

其他学习部署链接:

https://www.jianshu.com/p/f3fd1f831729

https://www.jb51.net/article/137856.html

https://www.bilibili.com/video/BV1xW411o77G?from=search&seid=6001884209692780453

web服务器怎样提供服务?

对于Nginx+uWSGI+Django项目,web服务器怎样提供服务?

如图所示(详见服务器部署过程),对于服务器的http请求,nginx如同一个门将请求进行分离,与静态资源进行对接的同时,通过socket与后端uWSGI服务连接,调用相应的django程序。

0. 创建并开启数据库

sql命令行创建visualpytorch数据库方式:mysql -u root -p打开

update user set plugin='mysql_native_password' where user='root';
update user set authentication_string=password('Sunye123') where user='root';
create database visualpytorch default charset utf8 collate utf8_general_ci;

1. django程序设置

django程序基本上和在本地运行一致,需要打开数据库和migrate,运行runserver时使用curl -i 127.0.0.1:8000/docs出现正常应答说明运行正常,可以停止runserver,进行下一步(因为uWSGI也可以启动django项目)。

由于本地项目始终使用的是127.0.0.1:8000,而在服务器上使用uWSGI启动,而且使用的是socket,不是http,故需要将程序中所有127.0.0.1:8000替换成对应服务器IP(端口默认80),所以需要使用以下命令:

sed -i "s/127.0.0.1:8000/39.97.209.22/g" `grep 127.0.0.1:8000 -rl .`

(114服务器)
sed -i "s/39.97.209.22/114.115.148.27/g" `grep 39.97.209.22 -rl .`

除此之外,DEBUG = False,ALLOWED_HOSTS = ['*']是部署必备的,关闭DEBUG模式,开启其他主机访问。

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FONT_DIR = os.path.dirname(BASE_DIR) + r"/font"
STATIC_ROOT = os.path.join(FONT_DIR, 'static/')
STATICFILES_DIR = [os.path.join(FONT_DIR,''),]

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']

2. uWSGI配置

对于uwsgi来说,设置django程序路径,并且设置参数稳定且正确运行是很重要的。可以使用命令行的方式直接启动,如下所示:

uwsgi --chdir=/root/VisualPytorch-develop 
    --module=VisualPytorch/wsgi.py:application 
    --home=/root/anaconda3/envs/visualpytorch    # optional path to a virtualenv
    --socket :8000

也可以写uwsgi_config.ini文件,将启动的配置记录下来,放在manage.py同目录下,uwsgi uwsgi_config.ini以启动。

[uwsgi]
chdir=/home/VisualPytorch-develop/VisualPytorch
module=VisualPytorch.wsgi:application

#http=127.0.0.1:8080
socket= :8000

wsgi-file=VisualPytorch/wsgi.py
master=true
processes = 4
vacuum=true
home=/root/anaconda3/envs/visualpytorch
daemonize=uwsgi.log

注:

  • 关闭uWSGI进程的方式:ps -aux | grep uwsgi | awk '{print $2}' | xargs kill -9

  • uWSGI成功安装测试方法:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

uwsgi --http :8000 --wsgi-file test.py

3. nginx配置

对于nginx来说,一头监听http端口(一般是80端口),另一头设置uwsgi socket端口和静态资源,如何正确地设置路径时很重要的。

首先需要学习conf文件路径配置的方式,参考nginx与location语法详解,清楚~/*$.()符号代表的含义,alias和root的差异。才能正确配置DRF项目对应的conf文件,/etc/nginx/site-available/visualpytorch参考如下:

server{
  listen 80;
  server_name visualpytorch;
  charset utf-8;

  client_max_body_size 75M;

  location /static {
    alias /home/VisualPytorch-develop/font/static;
  }       
         
  location ~* .(css|gif|ico|jpg|js|png|ttf|woff)$ {
    root /home/VisualPytorch-develop/font;
  }     

  # 配置uwsgi socket端口
  location / {
    uwsgi_pass 127.0.0.1:8000;
    include /etc/nginx/uwsgi_params;
  } 
}

注:设置site-enable的静态链接:ln -s /etc/nginx/site-available/visualpytorch /etc/nginx/site-enable/visualpytorch

原文地址:https://www.cnblogs.com/NAG2020/p/12920154.html