在部署DRF(Django Rest Framework)项目时遇到了大量的问题,也学习了大量的博客,终于才将项目正确部署在Linux: Ubuntu服务器上,下面记录部署过程中踩过的坑。
一、运行DRF项目注意点
1. DRF项目目录树结构:
整个项目下有Font(前端的静态文件)和VisualPytorch(后端的django项目)两个文件夹,VisualPytorch
作为django项目目录下每个文件夹都是一个app,还有一个用于管理项目的manage.py
,还有一个同名的文件夹VisualPytorch
,下面的settings.py
,uwsgi.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程序设置
测试用post方法:
curl -d '{"num_img":16,"nrow":4,"noise_continue":1}' sunie.top:8000/api/inference/dcgan
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 9000;
server_name localhost;
location / {
#root html;
#index index.html index.htm;
# echo "please visit /static";
root /Server/VisualPytorch-develop/font/static;
}
location ~* .*\.(css|gif|ico|jpg|js|png|ttf|woff)$ {
root /Server/VisualPytorch-develop/font;
}
}
注:设置site-enable的静态链接:ln -s /etc/nginx/site-available/visualpytorch /etc/nginx/site-enable/visualpytorch
评论区