当前位置:C++技术网 > 精选软件 > 云平台开发架构分析系列:15 Nginx+uWSGI+webpy服务器架构原理2

云平台开发架构分析系列:15 Nginx+uWSGI+webpy服务器架构原理2

更新时间:2017-06-29 23:31:48浏览次数:1+次

        在文章《云平台开发架构分析系列14:Nginx+uWSGI+webpy服务器架构原理1》中,我们已经讨论了nginx服务器的作用,对于大型网站服务器,是非常有用的东西。

        下面接着上篇继续介绍。

    2.uWSGI

        但是我们需要处理的业务,都是需要动态网站支持的。所以,仅仅有Nginx是不够的。所以我们选择了uWSGI服务器。按照uWSGI官网的说法,uWSGIF是具备这样的特性的:

    通用性、高性能、低资源使用和可靠性是该项目的强项(也是唯一遵循的法则)。

        详情请访问网站:http://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/

        另外据网上网友的评价,是这样的:

    uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快。
uWSGI的主要特点如下:
- 超快的性能。
- 低内存占用(实测为apache2的mod_wsgi的一半左右)。
- 多app管理。
- 详尽的日志功能(可以用来分析app性能和瓶颈)。
- 高度可定制(内存大小限制,服务一定次数后重启等)。

        这样也大概应证了uWSGI的能力。

        我们先要了解几个概念。

        uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。其实uWSGI也是可以直接处理HTTP请求的,因为它已经实现了HTTP协议。如果说你不需要静态网页,也不需要负载均衡,是可以不需要nginx的。uWSGI可以搞定这一切。

        那么uWSGI和WSGI、uwsgi、http又分别是什么呢,他们又有什么关系呢?

        当一个HTTP请求到达服务器的时候,服务器肯定需要对http请求按照http协议进行解析,然后还有将结果按照http协议返回给浏览器。所以,我们应该都很清楚http是什么概念了。如果服务器实现了http协议的解析,就是HTTP服务器了。其实你也是可以解析Http协议的,你自己也可以写一个小小的http服务器,也不是多么难的事情。难就难在,有了这么多服务器,又有几个人愿意花时间去研究这么底层的解析工作呢?而且,如果要做好,做的功能强大,那还是要花不少精力和时间的。

        作为http服务器,只是做了最基础的http协议解析,对于Web业务还是没有办法处理。所以,我们要将http协议携带的内容,提取出来,然后针对性的做处理。如果是请求静态网页,像nginx就可以很高效的读取静态网页文件,然后马上返回给浏览器。然而如果是动态网页,则携带了各种请求参数,而这些参数代表的意义,http服务器是不知道的。如何处理这些参数,就需要有web程序来解析。我们写的web程序,就是处理这些请求参数的。这些参数是与业务密切相关的,属于上层的数据。

        我们一般都是采用分层的方式来实现http协议解析和上层业务处理。所以处理http请求的底层的http协议解析,则会做成单独的解析模块。然后处理完后,将相关的信息提取出来,再交给上层的程序处理。如果http服务器一气呵成,比如我们自己实现的微型http服务器,可能就从http协议解析到参数请求的处理都一次性做完了。这样虽然效率高,但是扩展性差。

        那么http服务器要将解析后的数据如何传递给上层应用呢?说到这里,我们需要区分一下概念。对于我们不是很深入了解服务器的同学,都搞不清楚http服务器和web服务器的关系。我们可以将它们当做一个概念,也可以区分开来。http服务器更偏重于http请求的监听、http协议的解析和打包回应等,做底层的工作。而web服务器则属于应用服务器,是专门处理解析http后的参数,做网站业务处理的。我们可以将两个服务器合并,也可以分开。所以,大家对于web服务器的印象也就主要是网页,也就是这么个道理。

        概念不是重要的,重要的是我们要将整个流程都理清楚。越是研究的深入,反而却搞不太清楚各种概念之间的界限。这个没有什么影响,只是一个叫法而已。

        那么http服务器将解析后的数据,比如请求的参数、请求的IP等等信息,都会传递给web服务器。按照什么格式传递呢?这就是我们上面提到的WSGI、fcgi 、uwsgi,都叫做网关协议。实际上也就是定义一个传递数据的格式而已。只要你的程序实现了网关协议,就可以和http服务器对接,也就可以做web服务器了。

        所以,你完全可以自己写一个http服务器和web服务器,然后再在两个服务器上实现网关协议,这样将两者打通。而web服务器使用说明语言来处理业务,你可以自己定义实现。用什么语言都行,比如C++、python、js。而我们这里用的就是python。

        那么具体网关协议如何定义格式,你可以自己网上搜搜。我就不在这讲了。本篇就讲到这里,先对uWSGI有个清晰的认识。