django+uwsgi+nginx

记录下部署车牌识别web接口的过程,方便以后查看。最好用python的虚拟开发环境来开发,用virtualenv可以建立多个python独立虚拟开发环境。

1.virtualenv。pip3 install virtualenv(安装),virtualenv --version(测试安装),virtualenv project_env(为一个工程项目创建一个虚拟开发环境,这边是以系统默认的python解释器来创建的,可能是python2或者是python3,virtualenv -p /usr/bin/python2.7 project_env(也可以以指定的python解释器来创建)),source project_env/bin/activate(激活虚拟环境),deactivate(停用虚拟环境,这个可执行文件在bin目录下)。

2.sudo pip3 install django,一定要用root权限,安装完django后,命令django-admin startproject lpr_api,在当地路径生成一个文件夹,将编写好的代码放入其中,接着可以修改setting.py里的配置,来适应项目要求,在urls.py更改配置。

期间碰到的问题:程序"django-admin"尚未安装,按照命令安装:sudo install python-django-common,再次执行创建工程的命令是可能又会出行问题,说是不能找到对应的安装版本,对应的解决方法:sudo apt-get install python-django。再次执行,就可以创建工程。

ps_1:django创建普通用户,执行python3 manage.py migrate建立表单,python3 manage.py shell 进入shell环境,输入一下命令创建用户:

from django.contrib.auth.models import User

user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

普通用户已创建。

ps_2:测试使用的命令,python3 manage.py runserver 0.0.0.0:8001,可以让其他主机访问。

ps_3:发现如果请求头过大,会报错,所以可以在setting.py里添加一下参数。

             DATA_UPLOAD_MAX_MEMORY_SIZE = 10485760(这个大小为10M)

3.安装uwsgi,sudo pip3 install uwsgi。然后写配置文件uwsgi.ini,然后uwsgi --ini uwsgi.ini方式启动,注意一点,uwsgi和nginx之间的通信是以socket的形式进行的,所以设置参数的时候,用socket =127.0.0.1:8001,通过内部端口区进行连接。

ps_1:写uwsgi.ini配置文件时,注意开头添加[uwsgi],不然程序会报error。

ps_2:在安装uwsgi前,先把pcre正则表达式库先安装成功,sudo apt-get install libpcre3 libpcre3-dev。这样在使用时,就不会报一个WARNING。

ps_3:用linux adduser 命令,创建新用户,用--uid,--gid,参数来配置,以非root用户启动,否则会报WARNING。

ps_4: uwsgi.ini配置文件里,moudel参数写的是django的工程目录。

4.安装nginx,sudo apt-get install nginx,安装成功后,在浏览器里输入127.0.0.1,会出现测试成功的画面。在/etc/nginx/nginx.conf,里修改配置文件,将自己所需的配置要求写入进去,可以用nginx -t -c nginx.conf查看配置文件是否有效,nginx -c nginx.conf以配置文件方式启动。

查看是否运行成功,systemctl status nginx ,使用nginx -t参数进行配置检查,即可知道实际调用的配置文件路径及是否调用有效。

配置文件里的注意,在http{}里写入,server{},写入相关配置,location /lpr{},这个配置写入相关项目的情况,如果有公网IP地址的话,在参数server_name里写上自己的公网IP地址。

ps:如果请求头过大,会超过nginx默认的大小,所以可以在location /lpr{},中添加一下参数。

         client_max_body_size 64M;(按需要更改大小)

5.配置时出现了一些问题,注意django的csrf验证机制,解决方法:在每出来的post地方,添加@csrf_exempt,或者在settings.py里将csrf中间件给注销掉(不推荐使用,可能在不同的环境会出bug)。

    6.nginx和uwsgi的通信(转载):

    nginx发送数据到uwsgi:首先nginx会判断用户是否设置client_max_body_size指令,如果设置了,则会用该值来和content-  length进行比较,如果发送的包体超过了设置的值,则nginx返回413包体过大的错误。如果包体在给定范围内,则nginx会根据proxy_request_buffering是否开启,来决定是否先缓存客户端发来的请求。如果关闭了proxy_request_buffering(默认开启),则nginx是接收到一部分数据就直接发送给uwsgi;如果开启了proxy_request_buffering,则nginx是是把所有的数据都读取到之后,再发送给uwsgi,如果body过大,则可能需要把body先存入临时文件中。

     uwsgi返回数据到nginx:如果uwsgi_buffering开启(默认开启),nginx会尽可能缓存uwsgi发送来的body,缓冲区的大小由uwsgi_buffers和uwsgi_buffer_size两个指令设置的缓冲区之和;如果还是存不下,则需要写入临时文件,临时文件的大小由uwsgi_max_temp_size和uwsgi_temp_file_write_size决定;如果关闭,则数据同步的发送给浏览器,每次最多缓存uwsgi_buffer_size的数据,可以从upstream->recv()方法看出,如果满了,会导致uwsgi无法发送数据而阻塞。

     在工作中,一般是保持proxy_request_buffering和uwsgi_buffering默认开启的设置,这样才能充分利用nginx高并发的特性,不会让一个连接长时间占用后端的web application;另外如果要限制请求body的大小,如上传图片,一般是nginx开到最大合理的大小,然后python按照具体接口的业务,读一部分,超过大小就扔掉。因为nginx可能需要限制多个请求body的大小,所以一般设置一个最大值,然后在web应用中根据需求来加以限制。

7.参考文章链接:

https://blog.csdn.net/Miss_Audrey/article/details/81874038 uwsgi常用参数详解

https://www.jianshu.com/p/b3cd64c27595 一些原理

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值