为什么 Nginx 已经这么成熟,Python 还有各种如 web.py 等 web 框架?
程序员文章站
2022-05-29 16:59:30
...
回复内容:
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的东西 把自带的开发用的服务器当成生产用的了?