WSGI nginx

1.什么是WSGI

WSGI是web server gateway interface简写。
是python应用程序或框架的和web服务器之间的接口。

WSGI 接口有服务端和应用端两部分,服务端也可以叫网关端,应用端也叫框架端。服务端调用一个由应用端提供的可调用对象。如何提供这个对象,由服务端决定。例如某些服务器或者网关需要应用的部署者写一段脚本,以创建服务器或者网关的实例,并且为这个实例提供一个应用实例。另一些服务器或者网关则可能使用配置文件或其他方法以指定应用实例应该从哪里导入或获取。

WSGI对app的要求有三点:

  1. 必须是一个可调用对象;
  2. 接收两个必选参数envrion和start_response;
  3. 返回值必须是可迭代对象,用来表示http body。

2.为什么要有WSGI

web框架或应用在实际生产中不用于接收http请求。web服务器和web框架的分工不同,职责不同,它们是两个不同的组件,通过一定的约定俗尘的协议进行通信,这和协议就是WSGI。

3.http请求如何到达应用程序

两种方式:

  1. 两级结构:uWSGI作为服务器,使用到了http协议和wsgi协议,flask作为app,实现了wsgi协议。当有客户端发来请求,调用flask app得到相应给客户端。
  2. 三级结构:uWSGI作为中间件,用到了uwsgi协议与nginx通信,wsgi协议调用flask pp。当有客户端发来请求时,nginx先做处理(静态资源),无法处理的请求在转发给uWSGI,最后的响应也是nginx恢回复给客户端。
    多了nginx这一层的好处有:1)提高web server的性能,uWSGI的静态资源处理速度不如nginx;2)nginx做负载均衡,保护了实际上的web服务器即uWSGI。

4.什么是nginx

nginx是一个高性能的web服务器和反向代理服务器,可以实现服务器集群的负载均衡。
nginx的优点:

  1. 使用了epoll网络io模型,支持较高的并发连接;
  2. 内置健康检查功能,如果负载均衡中的一个服务器宕机,则接收到的请求会发送给其他服务器;
  3. 支持热部署,可以再不间断服务的情况下进行平滑的配置更改;
  4. 异步接收请求,减轻了web服务器的压力。
  • 正向代理:代理服务器代理的是客户端,是一个位于客户端和服务端之间的服务器,客户端明确的指出要访问的服务器地址,将请求发送给代理,代理实际上去访问服务器,并将我们需要的资源返回。正向代理隐藏了客户端的信息。
  • 反向代理:多个客户端向服务器发送请求时,nginx收到请求后,按照一定的规则转发到不同的服务器进行业务逻辑的处理,也就是前面提到的负载均衡。此时请求来源于哪个客户端是确定的,但是由哪台服务器进行处理则是不确定的,反向代理主要用于服务器集群分布式部署的情况下,隐藏了服务器的信息。

5.nginx高并发的实现

异步 非阻塞 epoll 优化
nginx采用1个master + 多个worker进程的工作模式,每次接收到一个请求,master都会按照一定的规则将请求分发给worker进程处理,同时由于worker进程的异步非阻塞工作模式,可以在等待请求callback的时候接受其他请求进行处理,这样实现了少数进程保证高并发。

阻塞io与非阻塞io

  • 阻塞io:以输入操作为例,一次输入操作有两个阶段:1)等待数据到达;2)从内核将数据复制到程序缓冲区。
    阻塞式io即是指,应用进程发起例如recvfrom的系统调用时,改进程会被挂起,直至数据准备好并复制进今进程缓冲区后被唤醒;

  • 非阻塞io:进程发起recvfrom系统调用后,若数据未准备好,内核向进程返回一个错误,不挂起进程,进程可以利用这段时间处理其他事情,某一次进程在进行系统调用时,若数据准备好了,则挂起进程,复制数据进进程缓冲区,唤醒进程。

异步io与同步io

  • 同步io:应用进程在数据从内核复制进进程缓冲区(上述第二阶段)时被挂起,即进程阻塞于io系统调用;
  • 异步io:等待数据与复制数据都是由内核完成,完成后通知进程,进程不会被阻塞。

总结:

  • 阻塞/非阻塞:进程要访问的数据是否就绪,进程是否需要等待;
  • 同步/异步:访问数据的方式,同步需要主动读写数据,在读写的过程中会被阻塞;异步只需要io操作完成的通知,并不主动的读写数据,而是由os内核完成。

epoll简介

  • select和poll采用的是轮询的方式,每次调用都要扫描整个注册文件描述符的集合,并将其中就绪的文件描述符返回给用户程序,因此它们检测就绪事件的时间复杂度是O(n)。
  • 而epoll则是采用回调的方式,内核检测到就绪的文件描述符时,将触发回调函数,回调函数将该文件描述符对应的事件插入到内核就绪事件队列。最后在适当的时间将就绪队列中的内容拷贝到用户空间,因此epoll_wait无需轮询整个文件描述符集合来检测哪些事件已经就绪,其算法时间复杂度为O(1)。

6.nginx为什么不创建多线程

没创建一个线程都需要为为其分配资源,多线程会导致过多的消耗内存资源。所以nginx采用单线程异步的处理用户请求,这样不需要不断的为线程分配资源,减轻了服务器的内存消耗,是的nginx的性能更加高效。

7.问什么要动静分离

日常开发中,前端静态文件比如图片资源是不需要经过服务器的,但是调用API这些类型的就需要后端进行处理请求,所以为了提高对资源文件的响应速度,应做到动静分离架构。可以把静态文件发在nginx中,把动态文件的请求转发到后端服务器去进行进一步的处理。

8.nginx负载均衡的几种常用方式

  1. 轮询round_robin(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,则直接剔除;
  2. ip哈希ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定的访问一个后端服务器,可以解决session共享问题,但在实际场景中,一般不考虑使用ip_hash的方式解决session共享;
  3. 最少连接least_conn:下一个请求将被分配到活动连接数量最少的服务器;
  4. weight:对不同的服务器设置不同的权重比例,这样可以改变不同后端服务器处理请求的比例,可以给性能更高的服务器配置更高的权重;
  5. fail:类似于轮询,主要根据后端服务器的响应时间来分配请求,响应时间更短的服务器优先分配请求
  6. url_hash:使用url的hash结果来分配到不同的服务器,使用这种方法的的每个url请求都会由一个后端服务器处理,后端服务器为缓存时效率更高。

9.nginx处理http请求的过程

  • nginx启动,解析配置文件,得到要监听的端口和ip地址,然后在nginx的master进程里初始化好这个监听的socket;
  • fork出若干子进程;
  • 子进程竞争accept连接,此时,客户端可以向nginx发起连接。当客户端进过三次握手与nginx建立好一个连接后,某一个子进程会accept成功,得到这个建立好的连接的socket,进行对服务的响应;
  • 设置读写事件处理函数,添加读写事件来与客户端进行数据的交换。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值