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

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

更新时间:2017-06-29 14:25:57浏览次数:1+次

        前面13篇,已经讲解了TCP服务器的程序实现流程和Nginx服务器的默认配置。在实现静态网站方面,Nginx就可以了,而且Nginx对于静态网站的支持有着优异的表现。如果你只是想做一个静态网站,后续就不必再看了。当然,我们的目的肯定不是这么简单。

        为了支持更强大的功能,我们需要开发动态网站。而对于动态网站来说,Nginx并不是最好的。所以我们需要借助其他工具来实现。我们的整体的架构是Nginx+uWSGI+webpy。本篇就来讲讲这三者为什么要组合在一起,以及工作原理流程如何。

        先来看一张我制作的示意图:

    Nginx+uWSGI+webpy服务器架构原理

        这个图很简单,就是将几个东西串联在一起。具体怎么回事,看我慢慢分析。

        实线的双向箭头组成了一个通路。从浏览器开始,到Nginx,再到uWSGI、再到webpy。再回到浏览器,这样就是浏览器的一次HTTP请求的过程。这个流程就是我开发的这个项目的Web服务器部分的架构。

        那么几个东西又是什么呢?我们来看看。

    1.Nginx

        Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。     -----摘自百度百科

        Nginx作为HTTP服务器,可以提供静态网站的支持。当我们安装好Nginx时,就相当于搭建了一个静态网站,Nginx默认就支持了。但是如果你要写动态网站,Nginx就不能直接处理了。毕竟动态网站后台是要有web应用程序执行的。Nginx直接只是做静态网页的请求和回传。如果要搭建动态网站,就需要借助动态模块或者第三方支持了。

        我们使用的是第三方的支持,选择的是uWSGI。而Nginx则为我们提供静态网页的支持。我们的系统的网站运行方式是静态网站的模式。通过提供restful API来供前端脚本执行动态交互逻辑。而网页本身还是一个静态的页面,所以需要nginx。毕竟nginx对于静态网站的支持还是很不错的。而restful则是借助于动态网站支持的很好的uWSGI。

        另外,Nginx可以支持负载均衡,对于流量很大的网站,这个可以大大提高网站的性能。然后通过配置,和将HTTP请求转发到第三方动态网站服务器,配置很简单。我称之为扩展。相当于做了HTTP请求转发处理。然后处理完后,再返回给浏览器。第三方服务器处理了HTTP请求后,再将结果发给Nginx,然后Nginx再将结果返回给浏览器。对于浏览器来讲,只看得到Nginx服务器,而看不到背后的第三方服务器。所以看起来,第三方服务器好像是扩展了Nginx的能力一样,所以我叫成扩展。

        不过,扩展的方式有两种,专业的叫法为正向代理和反向代理。

        正向代理:就是我们说的翻墙,服务器作为跳转,帮助浏览器去访问不能访问的网站。如果我们要实现正向代理,我们需要在浏览器上设置代理服务器,然后代理服务器上要运行代理服务程序,如将Nginx配置正向代理。代理上网和普通的上网请求网页是有区别的,因为浏览器面对的不是web服务器,而是代理服务器,所以需要指定代理服务器的IP和端口。当浏览器再访问网页的时候,浏览器会将请求的URL发往代理服务器,而不是URL真正的服务器。代理服务器收到请求的URL之后,去真正访问URL对应的服务器,将数据取回来,返回给浏览器。

        正向代理需要用户去设置浏览器,未免也有点麻烦。一般正向代理就叫做代理。我们使用代理上网的时候,一般是用于访问那些地区访问受限或者网络通信质量不好的情况。比如访问国外被墙的网站,访问我们这里访问时网速很慢的网站。通信的线路不是每一条都很通畅的。当一些线路有大量流量的时候,会让访问变得缓慢,此时如果你使用代理访问,换一条线路,这样避开拥塞的线路,访问就更快了。

        反向代理:反向代理和正向代理,表现的有点相似,但是又有很大的不同。反向代理实际上就是建立了一个网站服务器。你访问反向代理服务器的时候,就跟访问正常网站一样。在浏览器这边你根本不需要设置什么。比如将服务器配置成反向代理服务器访问谷歌。你使用服务器指定的域名就可以正常访问谷歌网站了。但是你确实用的域名不是谷歌的域名。实际上你所有访问都是我们配置的这个反向代理服务器,就是一个真实的web服务器。只不过,你要访问的东西,都是后台自动识别,然后自动去从目标服务器取来数据,然后返回给浏览器的。

        反向代理服务器可不只是去翻墙,去镜像其他网站的。镜像其他网站属于不道德的行为。因为你就简单的镜像,就搞得跟原始网站一模一样了。这个也可能违法吧,具体的法律不清楚。不过,用户的访问都会去请求原始网站的,所以原始网站是可以检测的出来,也就可以屏蔽你这个反向代理服务器镜像站了。

        反向代理的用途很大,我们常说的CDN加速,就是用反向代理实现的。反向代理的时候,还会将数据缓存起来,从而不必每一次请求都回到原始服务器获取数据。这样就可以大大加速访问。而且分布在各地的反向代理服务器,按照就近原则来处理,这样让网络流量都在一个地区,也可以避免通信线路长了之后,中间各种不稳定造成的体验不佳。毕竟近距离的通信线路,可以大大降低通信不稳定的风险。

        另外,反向代理还可以实现负载均衡。CDN加速是让请求得到就近处理。但是当如果原始服务器压力过大,实在是扛不住了,CDN加速也效果不大。我们可以增加多个服务器来提供数据,然后通过反向代理,来均衡服务器的压力。服务器性能强的处理更多的请求,性能差的处理少一些的请求。而反向代理服务器则是进行请求分配,让整体性能更强。

        那么DDOS呢?听说过分流吗?听说过流量清洗吗?实际上也就是反向代理的功能。所谓CDN加速,所谓负载均衡,都是反向代理实现的处理请求的调整。当出现DDOS的大规模的请求时,我们使用反向代理进行请求的分流,将不同的请求转向很多的二级反向代理,如果流量还是很大,可以再转向三级反向代理,最后流量正常,转向正常服务器来处理。在分级的流量处理的过程中,可以进行请求的检查,将不合理的请求过滤掉,不再向后传递。只要你的反向代理服务器够多,层次够多,就可以将大量的请求不断的分流,然后过滤,分流,过滤,这样就可以抗击DDOS的大规模攻击。

        当然,这些用Nginx都可以实现哦。当然,在前面我们也讲过DDOS的一些简单的措施,但是属于局部优化。真正对于大面积的DDOS攻击,还是需要反向代理来实现分流过滤的。