为什么nginx已经这么成熟,python还有各种如web.py等web框架?

回复内容:
nginx是服务器,web.py是web应用框架。简言之,前者封装对网络io的处理,后者负责具体应用的逻辑,解决的问题是不一样的。形象点呢,一个请求来了,nginx先把请求拦下来,发现要的是现成的东西(静态文件),它就直接把现成的静态文件返回给客户端,这样速度非常快,如果是其他的请求,再交给web.py解决,web.py解决完了之后,只是生成要返回的内容,并不自己做网络io,而是由nginx处理的。这样多好,一个安心处理网络、并发,顺便把遇到简单的请求直接ko掉。另一个专心处理应用的逻辑。当然nginx能做的不只是这些,而为了开发方便web.py等框架都是内置简单的web服务器的。至于tornado,它里面既有web应用框架,也有web服务器,而且这个服务器用的还是高性能单线程非阻塞异步的模型,是个例外。
nginx 是以静态内容和前端代理为主的服务器,python 的各种框架用来实现动态的逻辑。常见搭配是 nginx 监听客户端连接,直接响应静态请求(图片、css、js 等),然后将动态请求通过 fastcgi (web.py) 或者 proxy (tornado) 转发给后端的服务器进行处理。nginx 本身是 c 写的,代码效率高,支持动态平衡,比直接用 python 面对大规模请求要稳定高效一些。web.py 这些框架有时候会自带一个服务器用作开发,但是这个服务器(与 python 标准库的 simplehttpserver 一样)无法很好应对高负载情况,不应用于生产环境。真正与 nginx 形成竞争关系的是 tornado 和基于 twisted 的一些服务器。这些服务器本身就是为直接连接客户端设计的,并且支持 websocket 等一些 nginx 反向代理不支持的协议。在一个足够复杂的、模块繁多的项目中,可能出现 nginx 支持静态文件,tornado 支持 comet 服务,然后某一端代理更多的业务逻辑的组合形式。
nginx更多想做代理和均衡負載,而不大可能執行過於強大的邏輯。它就像一個家長,只有權力但是不具體做事情,然後它做好家長的角色。而衆多邏輯實現的框架比如web.py就是具體在後面跑的兒子,處理各種業務邏輯。爲什麼nginx不也把兒子的事情做了呢?估計做不好,因爲很難用一個程序來解決所有的業務,那時候就變成另外一個語言解釋器了……龐大而複雜,不大可行。而兒子也不大可能做了家長的事情,因爲處理業務邏輯重要的是擴展性和表達力。所以他們就分開了。。。。
一般使用 flask 或者 django这种应用框架都会使用uswgi这种服务器部署,但是uswgi本身并没有对直连客户端做优化,因此一般都会nginx+uswgi,使用nginx连接客户端向uswgi分发请求提高效率,这样对uswgi来说就不存在慢io问题,也可以做动静分离等等各种。关于tornado之类高排名答案也说清楚了。
web 服务器? nginx 的作者要哭了!!!!!!人家是一个好性能的io的东西
把自带的开发用的服务器当成生产用的了?

Posted in 未分类

发表评论