nginx uwsgi wsgi uWSGI 新手向

这几个概念比较模糊,所以今天来捋一捋,补充:越写越感觉其实这里面还是有很多可写的东西的,这次就简单的说一下,后面慢慢填坑

nginx这一部分看的时候,我希望不要把uWSGI什么的掺杂进来,下面我会讲这几个之间的关系。

什么是nginx?

leiue:Nginx 是异步的 框架的 网页服务器也可以用作反向代理、负载平衡器和 HTTP 缓存。

百度:Nginx (engine x) 是一个高性能的HTTP反向代理web服务器

可以看出来重点,nginx主要作用是服务器,当然这么庞大一个工程实现的肯定不可能只有单纯的服务器的功能,要不 不就太单纯了,人家也是商业软件,肯定要有自己的特色的,例如上面说的反向代理、负载平衡、HTTP 缓存

那么nginx平常用来干嘛?就比如一个项目,是一个网页,那么用nginx代理它,究竟nginx在其中扮演了什么角色?他是怎么代理的?

结合上面的nginx特性,首先它是个服务器,一个项目中,服务器的目的自然是接收客户端的请求request,nginx此时的作用就是反向代理,nginx此时负责接收客户端请求,如果有必要的设置,还会掺杂着负载均衡的功能,如果需要代理静态页面,则会用上HTTP代理的功能,其实可以看出来,nginx这些特性,当然除了正向代理比较少用外,其余的三个其实就是一个项目部署时经常用到的。

HTTP代理:其实就是承载了静态页面,使动静分离的一个东西,动态请求也就是向后端CURD的过程就走后面的流程,如果收到请求只是请求静态页面,则直接就从nginx返回,不经过后端服务器。

反向代理:表现就是一个机器,对外呈现的是nginx的端口,你可以通过nginx访问。此时可能你的真正后端服务比如是127.0.0.1:12345 但是经过nginx反向代理,你访问192.168.0.200:80就可以访问的到,这个ip之间的切换就是反向代理转发的结果。

这里插上一嘴,代理这个词要明白是什么意思,A和C交易,B代理了C,所以B是代表C的,A和C可能见不到面,甚至都不知道C的存在,因为B来和A交易了。同理,反向代理指的是  我这个nginx代理了服务器,我现在就代表服务器,客户端来访问,你甭管服务器在哪,给我就是了,是我来接收的,而不是真正的服务器。正向代理指的是 我这个nginx代理了客户端,我现在就代表客户端,你服务器甭管谁给你发的链接,也甭管回给谁,反正就交给我就完了。
理清了代理是什么,现在来说说负载均衡

负载均衡:当使用反向代理的时候,nginx支持 转发到多个服务器,而不是就认死了一个服务器可劲的发,配置中配置多个服务器IP的时候,通过配置负载均衡的选项,可以通过使用不同算法策略来实现负载均衡,这个算法根据实际需求可以进行灵活变更,比如你有两个服务器,第一个服务器有大量链接了,那么如果你配置了least_conn策略,则接下来的请求nginx会优先分配给第二个服务器,这个策略参考http://nginx.org/en/docs/http/load_balancing.html,如果想看具体算法,nginx也有源码可以研究一下。

这一块有些人可能是比较模糊的,尤其是些刚接触这些的同学会很困扰,为什么说部署的时候一定要比如 nginx+uWSGI+django?为什么有这么多?这么多东西都干了啥?那么接下来咱们来捋一捋

WSGI:全称是Web Server Gateway InterfaceWSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。serverapplication的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django
uwsgi:WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
uWSGI:是一个app服务器,实现了WSGI协议(规范)、uwsgi协议、http协议等。

上面这三个其实他们是三个不同的东西,WSGI是个大众化的协议,就好比TCP/IP协议,uWSGI是为了满足这个协议设计出来的一个server,就长得像了点,uwsgi是uWSGI的儿子,是uWSGI特有的协议,就这关系

JavaScript是Java吗?一个意思,人家叫啥你管得着(小声BB)

首先一个服务器的组成,大致分为web serverweb application两个部分

web server,就是web服务器,也就是上面的nginx,他的存在就是一个服务器,面向的是浏览器等客户端

web application,则又分为app serverapplication

app server也就是 上面提到的uWSGI,作用是啥?承载web application。

就好比用django,你有没有想过,如果不用runserver这些自带的测试服务器,django是怎么跑起来给你用的?runserver底层封装了简化的uWSGI而已,实质django你写的项目就是个web application,只不过人家django开发者好心的给你带了个app server runserver而已🤦‍当然django你设置好static_files直接用runserver就可以访问,那么此时其实充当的也有web server的作用,这个时候其实是django内部同时存在渲染静态文件的功能,把功能给合并了

那么在web服务器uWSGI中,发生了什么?这个我准备另开一篇来写,简单的说来,就是增加了并发,并且把nginx传来的HTTP请求解析成了WSGI协议,怎么解析的我先放一放,之后去主动的调用application中的Handler对象,生成request,这个request写web的应该都比较常见,这里我就不讲了,到此各个模块的作用就很清晰了

nginx:上面已经描述了,他就是个反向代理+静态文件承载,可能会用到负载均衡功能,对数据包不解析,只接收和传出

example:接收了一个客户端的包,这个包不是请求静态页面的,是请求application服务的,那么首先起了反向代理/负载均衡的作用,把包一个转身扔给了uWSGI

uWSGI:是一个承载web application的服务器,有一定的并发能力,和nginx的并发原理基本类似,但是再并发也是一台机子上的,肯定没有nginx这种负载均衡来的厉害,因为nginx到uWSGI是HTTP协议的,可以分到多个物理主机上面

example:看到nginx扔过来一个HTTP数据包,开开心心的收下了,把数据包里面需要的东西提取出来,然后经过一系列处理,生成了request,拉着自己承载的application(例如django)就一顿处理,等到django逻辑处理完,返回response,这个时候response依然是WSGI协议,uWSGI就把response给转换成HTTP格式的,然后回扔给nginx

本篇就到这里,这里大致讲了一下这几个的联系。当然不是全部,如果要深入,光nginx可能都可以说好多东西,这一篇可能更适合刚接触的同学,关于uWSGI部分我也是边查边写,并没有去看源码,所以如果有错误请大家指出。

补充一个:
为什么要使用WSGI协议?https://www.cnblogs.com/wss-1998/p/12094090.html

posted @ 2020-05-26 17:04  seas  阅读(148)  评论(0编辑  收藏  举报