我已经混乱了, Tornado是 Nginx、Django、Node.js 的结合体?又或是 Nginx * 20% + Django * 40% + Node.js * 40% ?
Tornado既是一个web server,也是web framework。而它作为web server 采用的是asynchronous IO的网络模型,这是一种很高效的模型。
web framework的定义( http://wiki.python.org/moin/WebFrameworks)A Web framework is a collection of packages or modules which allow developers to write Web applications or services without having to handle such low-level details as protocols, sockets or process/thread management.
Tornado作为web server,提供了web framework的api,可以来直接构建自己的web程序。同时,Tornado支持WSGI ( http://www.python.org/dev/peps/pep-0333/ ),也就是说它可以有能力其它的一些python的框架一起使用,比如django, bottle, flask等。不妨看下bottle在不同server下的性能评测,其中就有tornado( http://bottlepy.org/page/2009-12-19_Comparing_HelloWorld_Performance )。额外说的是,WSGI的框架是不支持异步的,所以如果有异步调用的逻辑的web程序,Tornado也是选择之一。
没有使用过Node.js,但官网说:Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications.
可以把Node.js理解成基于V8的javascript运行环境或工具包,它属于偏底层的抽象,扩展了javascript写服务端程序的能力。所以基于它也会有不同的web framework。从这个角度来看,Node.js和Tornado其实不在一个层次上。
不过相同的是 Node.js 和 Tornado都采用的的单进程单线程异步IO的网络模型。它们都可以写异步非阻塞的程序,不过我觉得因为javascript的语言特性,Node.js对异步回调非阻塞的风格坚持比Tornado更彻底一点。不过通常多进程时,一个进程的短时间阻塞也是可以接受的。
使用Nginx是因为一些单进程服务无法利用多核CPU,同时也会有单机的限制,所以通常会在多个服务器启动多个进程实例,使用Nginx在前端作为反向代理服务器来分发web请求,同时负载均衡。Nginx是C写的,有更好的并发性,可配置性,对静态文件也有更好的支持。当然这是Nginx的常用情景,其实也可以直接使用Nginx来构建web应用,可以参考OpenResty项目( http://openresty.org/ )。
其实网络模型、web server、web framework是三个不同层次,它们之间并不冲突,是选择的关系。理解前,不妨先理清概念:)大家的回答都有点片面,更多的关注web框架成,其实tornado远远不止这些,且听我慢慢到来
1.高性能的网络库,这可以和gevent,twisted,libevent等做对。提供了异步io支持,超时事件处理,在此基础上提供了tcpserver,httpclient,尤其是curlhttpclient在现有http客户端中肯定排第一。可以用来做爬虫,游戏服务器,据我所知业界已有使用tornado作为游戏服务器
2.web框架,这可以和django,flask对。提供了路由,模板等web框架必备组件。与其他区别是tornado是异步的,天然适合长轮训,这也是friendfeed发明tornado的原因,
当前flask也可以支持,但必须借住gevent等
3.较为完备的http服务器,这点可以和nginx,apache对比,但只支持http1.0,所以使用nginx做前段不仅是为了更好利用多核,也是让其支持http1.1
4.完备的wsgi服务器,这可以和gunicore,gevent wsgi server做对比,也就是说可以让flask运行在tornado之上,让tornado加速flask
5.提供了完备的websocket支持,这让html5的游戏等提供了便利。像知乎长轮训就是使用了websocket,但websocket手机支持的不是很好,前段时间不得不使用定时ajax发送大量请求,期待手机浏览器赶快奋起直追
1,web server是监听端口,负责HTTP链接管理、数据收发、HTTP协议实现等底层上的处理。
2,Web框架定义的是单个HTTP请求处理的流程。
3,nginx是反向代理服务器,是一个特殊的web server应用,和web server并不是同级的概念。
Tornado既是web server又是web框架,这两者并不矛盾。
举例来说,你写了一个tornado应用之后,直接把tornado端口跑在8000,这个时候,通过localhost:8000/foo就能访问到你的网页。这里分两步,tornado完成了底部IO事件的监听和数据接受等工作,这是tornado完成了其作为web server的使命。然后你通过按照tornado框架定义的流程,在对应的地方写了个get函数,实现了这个页面的具体内容,这是tornado作为web 框架体现了作用。
那么nginx有什么用?
他是个反向代理,反向代理顾名思义,其作用就是将接收到的HTTP请求按照一定的规则转发给后端其他服务器处理。
比如在你的一台机器上跑了三个tornado应用:foo1,foo2,foo3,端口分别为8000,8001,8003,你希望用户可以直接通过80端口来访问这些应用。这个时候你就可以用nginx来达到这个目的了。让nginx跑在80端口,当他接收到请求时,如果是/foo1,就转发给8000端口处理;如果是/foo2,就转发给8001端口处理,foo3类似。
所以,tornado和nginx并没有什么联系。实际上,很多框架都实现了一些简易web server,用于调试。tornado的web server是异步的,以可以处理大量的非活跃长连接著称。所以其web server是他的一个特性feature,在介绍的时候就会提及自己是一个很酷的webserver了。
回到主题,题主你在你机器上装装nginx、用tornado写个hello world就都清楚了。