主要内容:html
1. WSGIpython
1.1 WSGI相关概述linux
引子: wsgi server (好比uWSGI) 要和 wsgi application(好比django )交互,uwsgi须要将过来的请求转给django 处理,那么uWSGI 和 django的交互和调用就须要一个统一的规范,这个规范就是WSGI WSGI(Web Server Gateway Interface)nginx
1.2 定义一个简版的WSGI 接口git
from wsgiref.simple_server import make_server def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>'] httpd = make_server('', 8080, application) print('Serving HTTP on port 8080...') # 开始监听HTTP请求: httpd.serve_forever()
注意: 整个application()函数自己没有涉及到任何解析HTTP的部分,也就是说,底层代码不须要咱们本身编写, 咱们只负责在更高层次上考虑如何响应请求就能够了。 application()函数必须由WSGI服务器来调用。有不少符合WSGI规范的服务器,咱们能够挑选一个来用。 Python内置了一个WSGI服务器,这个模块叫wsgiref application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数: //environ:一个包含全部HTTP请求信息的dict对象; //start_response:一个发送HTTP响应的函数。 在application()函数中,调用:start_response('200 OK', [('Content-Type', 'text/html')]) 就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()函数。 start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每一个Header用一个包含两个str的tuple表示。 一般状况下,都应该把Content-Type头发送给浏览器。其余不少经常使用的HTTP Header也应该发送。 而后,函数的返回值b'<h1>Hello, web!</h1>'将做为HTTP响应的Body发送给浏览器。 有了WSGI,咱们关心的就是如何从environ这个dict对象拿到HTTP请求信息,而后构造HTML,经过start_response()发送Header,最后返回Body。
1.3 WSGI 的做用web
WSGI有两方:“服务器”或“网关”一方,以及“应用程序”或“应用框架”一方。服务方调用应用方,提供环境信息,以及一个回调函数(提供给应用程序用来将消息头传递给服务器方),并接收Web内容做为返回值。
所谓的 WSGI中间件同时实现了API的两方,所以能够在WSGI服务和WSGI应用之间起调解做用:从WSGI服务器的角度来讲,中间件扮演应用程序,而从应用程序的角度来讲,中间件扮演服务器。“中间件”组件能够执行如下功能:
重写环境变量后,根据目标URL,将请求消息路由到不一样的应用对象。
容许在一个进程中同时运行多个应用程序或应用框架。
负载均衡和远程处理,经过在网络上转发请求和响应消息。
进行内容后处理,例如应用XSLT样式表
2. uWSGIdjango
1.1 uWSGI的相关概述浏览器
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的做用是与uWSGI服务器进行交换。服务器
1.2 uWSGI配置的的理解网络
(1) 通讯接口: http/http-socket/socket
socket 方式: socket = 0.0.0.0:8000
http 方式: http = 0.0.0.0:8000
上面两个图都是http方式,使用http启动uwsgi,系统会额外启动一个http进程,从级别上来讲,它和nginx是同一级别的,因此客户端和uwsgi通讯,彻底能够绕过nginx,不须要额外进行一个转发(如第二张图同样),但很显然,这是并非一个很明智但选择,这样会失去了nginx不少优秀的功能。
所以: 若是你没用nginx,只想本身启动一个http界面,用这个
--- 另外 还有一方式,可是在uWSGI的配置文件中并未展现出: 具体使用待定---
http -socket 方式 http-socket=127.0.0.1:8000
http-socket方式,这个适用于web服务器不支持uwsgi时。
(2) processes/workers.
表示开启多进程,根据你的应有开启合适的进程数,在一些参考资料上,可能会看到processes = 2 * cpucores或者workers = 2 * cpucores,若是应有比较简单,这样设置通常能够。若是想更合理,官方提供了uwsgitop去得到一个较为合理的值。
(3)threads & enable-threads
python中存在GIL,实际上不存在真正意义上的多线程,可是否须要,这个就根据各自但需求设定了。结合processes:
表示2个进程,每一个进程中有4个线程。
(4)uid & gid & chmod-socket
uwsgi不建议使用root权限去启动uwsgi实例。能够经过root用户去运行uwsgi文件,当经过uid和gid去修改用户(移除root权限)。而且,若是你使用的是socket的通讯方式,最好加上chmod-socket字段,在linux下,socket的启动方式,套接字相似文件,你必须保证有权限去读取它。
(5)master
意味着启动一个master主进程来管理其余进程,建议启动这个进程,在管理的时候比较方便;若是kill这个master进程,至关于关闭全部的uwsgi进程
----------- 内容摘自: https://blog.csdn.net/l_vip/article/details/81487608 -------------------------------------------
3. uwsgi
概述: uwsgi是服务器和服务端应用程序的通讯协议,规定了怎么把请求转发给应用程序和返回
关于 uwsgi的理解
本文根据代码阅读以及参照多种文档,描述了uwsgi的启动多进程+多线程工做缘由,以及thunder_lock参数的做用:
-------- 以上内容摘自: https://blog.csdn.net/pzqingchong/article/details/79522215 -------