前言
为了方便前端组测试后端组不定时更新的接口,下面紧接着要进行的就是将DRF后端配置到阿里云服务器。
一、环境
主流的配置方式是uwsgi+nginx,最初的想法是端口8000用作nginx反向代理,端口8083用作uwsgi来启动项目,3306给mysql。然而配置uwsgi.ini时出现了问题,不能正确启动项目。
那就退而求其次,毕竟django是有自带的启动方式的,对我们的小项目也是足够使用了。
最后使用的端口如下,8000直接运行项目后端而不是nginx,不再使用8083,3306给mysql
当然阿里云的安全组的依旧要开,把3306,8000端口打开,具体操作参考vue前端配置那篇文章。
使用出错的反向代理nginx.conf,也不知道错在哪了,反正uwsgi.ini疯狂报错,咱也不知道到底是哪个配置的问题
起初参考的博客:https://www.cnblogs.com/pyyu/p/10160874.html
如果想参考这个,注意一下有个地方
这个地方module要改成wsgi-file,毕竟上面的注释也写了
而且少用注释,两个信息文件的配置
pidfile=uwsgi.pid #记录进程号
daemonize=uswgi.log #记录报错信息
生成的文件名居然就是’uswgi.log #记录报错信息’ = =。。
二、配置DRF后端
我可以说是把奇奇怪怪的坑踩了一遍,最初凭着印象中用的python3.5.2,然而安装numpy库都找不到相应版本,一问才知道要改用python3.7.3。
改用后很快就下完了所有所需的包,能够成功运行项目了。
首先运行项目前,最好有个虚拟环境保证各种python包干净隔离,当然不用也可以(咱就没用
然后是最重要的!!!要配置settings.py!!!!
1.配置前,要将服务器防火墙的相应端口打开(我们就卡在这很久
如下是添加8000端口的操作示例
firewall-cmd --list-ports 查看开放的端口:
firewall-cmd --add-port=8000/tcp --permanent #添加8000端口
firewall-cmd --reload #重新加载配置
当然,你也可以关掉整个防火墙
systemctl status firewalld #查看防火墙状态
systemctl stop firewalld #关闭防火墙
systemctl is-enabled firewalld #查看防火墙是否开机自启
systemctl disable firewalld #关闭防火墙的开机自启
systemctl start firewalld #启动防火墙
systemctl enable firewalld #重启防火墙
如果没有在防火墙打开相应的端口,成功运行项目后,访问后端网址时,会很慢,然后告诉你timeout(阿里云的安全组没配置也是这样,不过这两种情况项目也能成功运行,如果真是运行不了也不会提示timeout
2.这个是允许访问的host,省事的话就配成’*’,代表都可以访问
如果不配置,运行成功后,访问的时候会提示不允许访问,非法的host,报错也会让你去配置ALLOWED_HOSTS,把host加到白名单(报错界面忘截图了
ALLOWED_HOSTS = ['*']
3.DEFAULT_AUTO_FIELD ,这个直接加进去就好,如果你运行时会报waring,如下所示,就加上,似乎和数据库的model相关,反正我们运行项目时好像没有什么影响
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
4.跨域设置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'user',#这是写的一些接口,依据项目具体加
'citycrop',
'cityclimate',
'market',
'news',
'image',#到这都是接口
'corsheaders'#这个可太重要了,必须加上
]
CORS_ORIGIN_WHITELIST = (#允许跨域的IP
'http://localhost:8080',
'http://127.0.0.1:8080',
'http://10.27.236.90:8080',
'http://localhost:8082',
'http://127.0.0.1:8082',
'http://0.0.0.0:8082',
'http://0.0.0.0:8080',
) #这个写8080好像是因为前端组成员本地的前端有的用的端口为8080??不太清楚
CORS_ALLOW_CREDENTIALS = True #也重要
如果你没有配置这个,运行成功后,后端也可以收到各种get post请求,也会有状态码200,但是不能返回给前端,前端会提示被跨域拦截
5.数据库的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '库名',
'USER': '用户名',
'PASSWORD':'密码',
'HOST':'数据库地址.mysql.rds.aliyuncs.com',#我们使用的阿里云
'PORT':'3306'#记得在安全组开启该端口
}
}
这个不配置,运行项目时就会直接报错,告诉你密码错误连不上之类的
三、启动DRF项目
首先把项目打包成zip包,丢进mnt或者opt文件夹。(有的教程用前者,有的教程用后者,好像也没啥影响,都是空文件夹。)
cd到相应目录,然后解压,例如
cd /mnt
unzip ariculture.zip
然后刷新下进入解压后的目录,运行项目
python manage.py runserver 0.0.0.0:8000
提示缺啥库就下啥库,提示如下就是成功了
可以用postman或者前端组连接进行测试,
接到的各种get post请求就会在下面显示
netstat -tnlp #查看项目是否已运行
kill -9 相应PID #强制结束某进程
如下代表成功运行
直接访问是这样也就代表能用了
四、持续运行server
搭配使用nohup和&可以使你摆脱不定时重启server的困扰
nohup python manage.py runserver 0.0.0.0:8000 &
nohup是no hang up 的缩写,即:不挂断的意思。以忽略挂起信号的方式执行命令,关闭终端后进程还能继续执行,但是直接在shell中使用ctrl + c 或ctrl + z时,进程会结束。
使用nohup运行程序:
结果默认会输出到nohup.out
使用Ctrl + C发送SIGINT信号,程序关闭
关闭session发送SIGHUP信号,程序免疫
在命令末尾加上&,作用是使进程在后台执行,即使你用ctrl + c, 进程照样运行,因此会丢失标准错误和标准输出。如果是守护进程,断开终端则程序继续运行,如果不是守护进程,断开终端则程序也会被断开停止运行。
使用&后台运行程序:
结果会输出到终端
使用Ctrl + C发送SIGINT信号,程序免疫
关闭session发送SIGHUP信号,程序关闭
平日线上经常使用nohup和&配合来启动程序:
同时免疫SIGINT和SIGHUP信号
转自https://www.jianshu.com/p/5e9c4871e8f8,有详细测试过程
如果使用了上述方法,所有后续的信息都会被存在与manage.py同目录下的nohup.out文件里
总结
今天记录了在阿里云服务器上配置DRF的详细过程与经历,也学习到很多知识。最后祝大家少踩坑,一次成功!