uWSGI

Posted small-office

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uWSGI相关的知识,希望对你有一定的参考价值。

      uWSGI是实现了WSGIuwsgi的一个web serverWSGI是一种规范。要实现WSGI协议,必须同时实现web serverweb applicationweb serveruwsgi提供,app很多pythonweb框架都支持,比如djangoflask等,基本模型如下。

技术分享图片

        uWSGI可以启动多个进程,进程里面可以启动多个线程来服务。进程分为主进程和worker进程,worker里面可以有多个线程。执行启动uwsgi启动主进程,主进程进行初始化并加载app配置,此时会先forkworker进程,但是并未开始accpet消息,等初始化完成才会真正开始acceptmaster用来管理worker进程以及一些定时或者事件触发任务。worker部分负责循环接收(accept)请求。在启动woker时可以根据--threads参数指定要产生的线程个数,否则只在当前进程启动一个线程,这些线程循环接收请求并处理。uWSGI在消息处理方面和nginx很像,有一个互斥锁保证顺序accept消息,但和nginx不同,nginx采用的是异步非阻塞模式处理请求,而uWSGI每个worker以线程方式接收请求,如果使用协程则需要配合gevent,所以nginx可以处理同时处理多个请求,而uWSGI则只能同时处理一个,下面看下uWSGIDjango的交互过程。

1wsgiweb server参数python化,封装为request对象传递给apllication命名的func对象并接受其传出的response参数,这个applicationwsgi.py里:

技术分享图片

2、加载django的配置,LOGGINGINSTALL_APP等,并调用每个app下的AppConfig里的ready函数完成初始化:

技术分享图片

调用ready函数:

技术分享图片

3、初始化WSGIHandler,加载中间件,返回一个WSGIHandler对象给wsgi,入参是environstart_response

技术分享图片

4、返回后,配置加载完成,uwsgi认为django已经准备好接收请求了,开始启动worker接收消息了。

5、当收到消息,uwsgi调用WSGIHandler,先解析environ,获取webserver带给我们的信息:

技术分享图片

6、准备获取response,先将请求逐个用中间件进行处理:

 技术分享图片

7、获取urlconf,并解析request里的参数,然后从url里匹配对应的url

技术分享图片

8、获取对应的view对象,这里这个对象是restframework实现的,并传入参数:

技术分享图片

9、那我们获取到的view对象是怎么来的呢?我们每个url后都会跟一个***.as_view(),这个as_view返回一个view的回调函数,允许接受request, *args, **kwargs

技术分享图片

10django拿到这个view并传入参数,view会调用dispatch依靠request.method将消息分发给我们定义的viewGET,PUT,POST等等方法:

 技术分享图片

11、修改start_response并返回responsewsgi

技术分享图片

 

以上是关于uWSGI的主要内容,如果未能解决你的问题,请参考以下文章

uwsgi部署相关问题Fatal Python error: Py_Initialize: Unable to get the locale encoding

linux+flask+uswgi+nginx

Django+uWSGI+nginx部署

部署前后端分离项目

Django + Uwsgi + Nginx 的生产环境部署

nginx+uwsgi+flask 服务器配置