nginx+WSGI+uwisgi+uWISI详解及nginx/uwisgi/django交互流程
目录
(正向)代理服务器是位于客户端和原始服务器的一台中间服务器。为了从原始服务器获取到内容,客户端向代理服务器发送一个请求并带上目标服务器,代理服务器接收到请求后会将请求转发给原始服务器,并将从原始服务器上获得到的数据返回给客户端。代理服务器是代理的客户端,一般客户端是知道代理服务器的存在的,比如FQ就用了代理服务器
反向代理服务器是位于原始服务器端的服务器,反向代理服务器接收来自互联网的请求,然后将这些请求发送给内网的服务器,并将从内网的服务器获取结果返回给互联网上的客户端,反向代理服务器是代理的服务器端,所以客户端时不知道反向代理服务器的存在的,服务器是知道反向代理服务器的。nginx就是常用的反向代理服务器。
1. 访问原本无法访问的资源(如FQ)
2. 用作缓存,加速访问速度
3. 对客户端访问授权,上网进行认证(校园网认证)
1. 保护内网安全
2. 负载均衡
3. 缓存、减少服务器的压力
1. nginx是一个反向代理服务器,将多台服务器代理成一台服务器,用户访问网站的时候,首先HTTP请求会访问到在nginx服务器,nginx服务器会转到我们实际的后台项目中去,其起一个中转的作用。
2. nginx用于实现高并发。可以实现负载均衡,将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高服务的吞吐量。比如若在某一刻有几万个人同时访问后台服务器,后台服务器会直接崩掉,利用nginx可以实现负载均衡,将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高服务的吞吐量。
3. 动静分离,nginx可以用作静态文件的缓存服务器,提高访问速度,
1. 在nginx启动后,会有一个master进程和多个worker进程,master进程主要用来管理worker进程,包括:接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程。基本的网络事件会交给worker进程处理。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其他进程的请求,worker进程的个数时可以设置的,一般我们设置与机器CPU核数一致。
2. 当master接收到重新加载的信号会怎么处理?master会重新加载配置文件,启动新的进程,使用新的worker进程来接受请求,并告诉老的worker进程他们可以退休了,老的worker进程将不会接受新的,老的worker进程处理完手中正在处理的请求就会退出
3. worker进程是如何处理用户的请求呢?首先master会根据配置文件生成一个监听相应端口的socket,然后再faster出多个worker进程,这样每个worker就可以接受从socket过来的消息(其实这个时候应该是每一个worker都有一个socket,只是这些socket监听的地址是一样的)。当一个连接过来的时候,每一个worker都能接收到通知,但是只有一个worker能和这个连接建立关系,其他的worker都会连接失败,这就是所谓的惊群现在,为了解决这个问题,nginx提供一个共享锁accept_mutex,有了这个共享锁后,就会只有一个worker去接收这个连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
WSGI是一种通信协议。WSGI,全称Web Server Gateway Interface,或者Python Web Server Gateway Interface,是为python语言定义的web服务器和web应用程序或框架之间的一种简单而通用的接口。也就是说,WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。
WSGI有两方:“服务器”或“网关”一方,以及“应用程序”或“应用框架”一方。服务方调用应用方,提供环境信息,以及一个回调函数,并接收web内容作为返回值。
uwsgi同WSGI一样是一种通信协议
uWSGI是一个web服务器,它实现了WSGI协议、uwsgi、HTTP等协议,nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意WSGI/uwisgi/uWSGI等概念的区分
·WSGI是一种通信协议
·uwsgi同WSGI一样是一种通信协议
·uWSGI是实现了uwsgi和WSGI两种协议的web服务器
·首先是客户端请求服务资源
·nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包,分析。
·如果是静态文件就根据nginx配置的静态文件目录,返回请求的资源
·如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI将接收到的包进行处理,并转发给wsgi,
·wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi.
·wsgi将返回值进行打包,转发给uWSGI
·uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)