大家的 Tornado 项目都是如何阿里云部署tornado的呢

rfyiamcool 的BLOG
用户名:rfyiamcool
文章数:423
评论数:2194
访问量:1312828
注册日期:
阅读量:5863
阅读量:12276
阅读量:356166
阅读量:1053162
51CTO推荐博文
前言: & &这两天搜文章的时候,发现不少人对tornado有些误解的。只是想说说自己对于这些框架的理解,和实际项目中的对比。 & &部分有文章说tornado性能很一般,我当时一瞅,很是郁闷,这些人是怎么测试的呢,就直接跑hello world。很直接就用tornado最最基本的功能,那他的性能也就和django flask一样了。这样没太多的意义,个人觉得,应该尽量施展他们的长处,当然也要把他的短处给扔出来。 & & & &我想说的是,在一定程度上,你没有用好。tornado最大的优点是大并发下的异步io,他有coroutine,这是个比thread线程切换开销更小的东西,可以让tornado那些回调的代码显得更同步顺眼。还有一个异步回调的东东,这些组成了tornado在高并发下也可以避免网络io堵塞。在用django、flask的时候,我也喜欢用gevent、Gunicorn、uwsgi。 现在更多的人喜欢用uwsgi,因为简单易用,借助于nginx可以做更多的东西。比如加上lua,就可以做数据接口,用location就可以做读写分离等。但是大家有没有发现,uwsgi在超过一定的连接数后,尤其是那种长连接,他就疯狂的报错,要不是socket pipe出错,要不就索性的502。 & & & & & &线程开启64个,我这里是特意开了64了,官方的推荐是你cpu核数的2-4倍,那是我觉得这个值不靠谱,还是往大了加。ab一个time.sleep(10)的接口,超过150个,就可以挑错。不信的朋友可以自己做做测试。原文:http://rfyiamcool./7495 & & & &而tornado就非常适合做这些个高并发,尤其是io堵塞,comet的东西了新版支持future做并发库,这里完全就可以写同步的代码了。50个线程数,不够那就加到200,200不够加到500、1000。 &我加到1000,每个连接耗时间30秒,照样很稳,不会报错。class&IndexHandler(tornado.web.RequestHandler):
&&&&executor&=&ThreadPoolExecutor(50)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&@tornado.gen.coroutine
&&&&def&get(self):
&&&&&&&&print&"begin"
&&&&&&&&#time.sleep(10)
&&&&&&&&yield&self.pin()
&&&&&&&&self.write('ok')
&&&&&&&&self.finish()
&&&&@run_on_executor
&&&&def&pin(self):
#&&&&&&&&os.system("ping&-c&10&")
&&&&&&&&time.sleep(2)当然他的缺点也很明显,就是需要你打造轮子。他的文档也特别的少,你会发现跑到官网做demo,他们连个cookie说的都不清不白的,结果还要到github去找几个例子,才搞懂。django是个好东西呀,你能想到的功能,都可以在django插件index看到你需要的。 &各种各样的都有, 做大项目还是需要用django这样较完成的框架。 &你要是有知乎那帮团队的实力,你也可以用tornado来支撑你的大项目。 &我不喜欢django的原因,只是因为他复杂,不简单而已。&推荐用tornado做接口,而django flask做前后端的开发。 tornado性能虽然高,但是部署有点繁琐( ningx + tornado * 4 的方式),写程序有点蛋疼,需要写异步回调。不像flask那样,你全部同步的写法,最后用nginx uwsgi一引入,就可以多进程了。他的配置如此的简单。。。http://xiaorui.cc
socket&=&127.0.0.1:9090
master&=&true&&&&&&&&&//主进程
vhost&=&true&&&&&&&&&&//多站模式
no-stie&=&true&&&&&&&&//多站模式时不设置入口模块和文件
workers&=&64&&&&&&&&&&&//子进程数
reload-mercy&=&10&&
vacuum&=&true&&&&&&&&&//退出、重启时清理文件
max-requests&=&30000
limit-as&=&2048
buffer-sizi&=&30000
pidfile&=&/var/run/uwsgi9000.pid
daemonize&=&/website/uwsgi9000.log
避免文件最大打开数限制
ulimit&-SHn&30000不管是tornaod、django、web.py、flask,他们静态处理能力都一般。最简单的方法测试,你用ab压一个静态文件,流量压根上不去,其次是出broken pipe的标准socket的error。 你正好开了10个uwsgi的worker后。你的页面有好几个css,js,那! 如果有10个人来访问,那就占用了uwsgi的10个线程。如果这个时候有很多用户来访问,你肯定会io堵塞的,你可以试试 ! & &&&&&在一些平台中,要避免静态文件的损耗,这些静态的文件最好是用url的方式引入,这样后期可以做cdn啥的,把这些静态的东西尽量扔给gninx lighttpd处理,如果程序已经成型了,那就用nginx的localtion来做静态文件的分离引入。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
23:14:48 19:43:28 22:56:33 15:53:35 07:45:15 11:02:15 11:02:47 11:03:13 07:51:28 20:43:38 12:22:31 12:23:10 10:16:35 19:21:10第八章:部署Tornado - Introduction to Tornado 中文翻译
第八章:部署Tornado
到目前为止,为了简单起见,在我们的例子中都是使用单一的Tornado进程运行的。这使得测试应用和快速变更非常简单,但是这不是一个合适的部署策略。部署一个应用到生产环境面临着新的挑战,既包括最优化性能,也包括管理独立进程。本章将介绍强化你的Tornado应用、增加请求吞吐量的策略,以及使得部署Tornado服务器更容易的工具。
8.1 运行多个Tornado实例的原因
在大多数情况下,组合一个网页不是一个特别的计算密集型处理。服务器需要解析请求,取得适当的数据,以及将多个组件组装起来进行响应。如果你的应用使用阻塞的调用查询数据库或访问文件系统,那么服务器将不会在等待调用完成时响应传入的请求。在这些情况下,服务器硬件有剩余的CPU时间来等待I/O操作完成。
鉴于响应一个HTTP请求的时间大部分都花费在CPU空闲状态下,我们希望利用这个停工时间,最大化给定时间内我们可以处理的请求数量。也就是说,我们希望服务器能够在处理已打开的请求等待数据的过程中接收尽可能多的新请求。
正如我们在讨论的异步HTTP请求中所看到的,Tornado的非阻塞架构在解决这类问题上大有帮助。回想一下,异步请求允许Tornado进程在等待出站请求返回时执行传入的请求。然而,我们碰到的问题是当同步函数调用块时。设想在一个Tornado执行的数据库查询或磁盘访问块中,进程不允许回应新的请求。这个问题最简单的解决方法是运行多个解释器的实例。通常情况下,你会使用一个反向代理,比如Nginx,来非配多个Tornado实例的加载。
8.2 使用Nginx作为反向代理
一个代理服务器是一台中转客户端资源请求到适当的服务器的机器。一些网络安装使用代理服务器过滤或缓存本地网络机器到Internet的HTTP请求。因为我们将运行一些在不同TCP端口上的Tornado实例,因此我们将使用反向代理服务器:客户端通过Internet连接一个反向代理服务器,然后反向代理服务器发送请求到代理后端的Tornado服务器池中的任何一个主机。代理服务器被设置为对客户端透明的,但它会向上游的Tornado节点传递一些有用信息,比如原始客户端IP地址和TCP格式。
我们的服务器配置如图8-1所示。反向代理接收所有传入的HTTP请求,然后把它们分配给独立的Tornado实例。
图8-1 反向代理服务器后端的Tornado实例
8.2.1 Nginx基本配置
代码清单8-1中的列表是一个Nginx配置的示例。Nginx启动后监听来自80端口的连接,然后分配这些请求到配置文件中列出的上游主机。在这种情况下,我们假定上游主机监听来自他们自己的环回接口上的端口的连接。
代码清单8-1
一个简单的Nginx代理配置
worker_processes 5;
error_log /var/log/nginx/error.
pid /var/run/nginx.
worker_connections 1024;
proxy_next_
upstream tornadoes {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
listen 80;
server_name www.example.org *.example.
location /static/ {
root /var/www/
if ($query_string) {
location / {
proxy_pass_header S
proxy_set_header Host $http_
proxy_set_header X-Real-IP $remote_
proxy_set_header X-Scheme $
proxy_pass http://
这个配置示例假定你的系统使用了epoll。在不同的UNIX发行版本中经常会有轻微的不同。一些系统可能使用了poll、/dev/poll或kqueue代替。
按顺序来看匹配location /static/或location /的请求可能会很有帮助。Nginx把位于location指令中的字符串看作是一个以行起始锚点开始、任何字母重复结束的正则表达式。所以/被看作是表达式^/.*。当Nginx匹配这些字符串时,像/static这样更加特殊的字符串在像/这样的更加的通用的字符串之前被检查。Nginx文档中详细解释了匹配的顺序。
除了一些标准样板外,这个配置文件最重要的部分是upstream指令和服务器配置中的proxy指令。Nginx服务器在80端口监听连接,然后分配这种请求给upstream服务器组中列出的Tornado实例。proxy_pass指令指定接收转发请求的服务器URI。你可以在proxy_pass URI中的主机部分引用upstream服务器组的名字。
Nginx默认以循环的方式分配请求。此外,你也可以选择基于客户端的IP地址分配请求,这种情况下(除非连接中断)可以确保来自同一IP地址的请求总是被分配到同一个上游节点。你可以在中了解更多关于这个选项的知识。
还需要注意的是location /static/指令,它告诉Nginx直接提供静态目录的文件,而不再代理请求到Tornado。Nginx可以比Tornado更高效地提供静态文件,所以减少Tornado进程中不必要的加载是非常有意义的。
8.2.2 Nginx的SSL解密
应用的开发者在浏览器和客户端之间传输个人信息时需要特别注意保护信息不要落入坏人之手。在不安全的WiFi接入中,用户很容易受到cookie劫持攻击,从而威胁他们在流行的社交网站上的账户。对此,大部分主要的社交网络应用都默认或作为用户可配置选项使用安全协议。同时,我们使用Nginx解密传入的SSL加密请求,然后把解码后的HTTP请求分配给上游服务器。
代码清单8-2展示了一个用于解密传入的HTTPS请求的server块,并使用代码清单8-1中我们使用过的代理指令转发解密后的通信。
代码清单8-2
使用SSL的server块
listen 443;
ssl_certificate /path/to/cert.
ssl_certificate_key /path/to/cert.
default_type application/octet-
location /static/ {
root /var/www/
if ($query_string) {
location = /favicon.ico {
rewrite (.*) /static/favicon.
location / {
proxy_pass_header S
proxy_set_header Host $http_
proxy_set_header X-Real-IP $remote_
proxy_set_header X-Scheme $
proxy_pass http://
这段代码和上面的配置非常相似,除了Nginx将在标准HTTPS的443端口监听安全Web请求外。如果你想强制使用SSL连接,你可以在server块中包含一个rewrite指令来监听80端口的HTTP连接。代码清单8-3是这种重定向的一个例子。
代码清单8-3
用于重定向HTTP请求到安全渠道的server块
listen 80;
rewrite /(.*) https://$http_host/$1
Nginx是一个非常鲁棒的工具,我们在这里仅仅接触到帮助Tornado部署的一些简单的配置选项。Nginx的是获得安装和配置这个强有力的工具额外信息的一个非常好的资源。
8.3 使用Supervisor监控Tornado进程
正如8.2节中埋下的伏笔,我们将在我们的Tornado应用中运行多个实例以充分利用现代的多处理器和多核服务器架构。开发团队大多传闻每个核运行一个Tornado进程。但是,正如我们所知道的,大量的传闻并不代表事实,所以你的结果可能不同。在本节中,我们将讨论在UNIX系统中管理多个Tornado实例的策略。
到目前为止,我们都是在命令行中运行Tornado服务器的,就像$ python main.py --port=8000。但是,在长期的生产部署中,这是不可管理的。因为我们为每个CPU核心运行一个独立的Tornado进程,因此有很多进程需要监控和控制。supervisor守护进程可以帮助我们完成这个任务。
Supervisor的设计是每次开机时启动其配置文件中列出的进程。这里,我们将看到管理我们在Nginx配置文件中作为上游主机提到的四个Tornado实例的Supervisor配置。典型的supervisord.conf文件中包含了全局的配置指令,并加载conf.d目录下的其他配置文件。代码清单8-4展示了我们想启动的Tornado进程的配置文件。
代码清单8-4
tornado.conf
[group:tornadoes]
programs=tornado-8000,tornado-8001,tornado-8002,tornado-8003
[program:tornado-8000]
command=python /var/www/main.py --port=8000
directory=/var/www
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info
[program:tornado-8001]
command=python /var/www/main.py --port=8001
directory=/var/www
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info
[program:tornado-8002]
command=python /var/www/main.py --port=8002
directory=/var/www
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info
[program:tornado-8003]
command=python /var/www/main.py --port=8003
directory=/var/www
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/tornado.log
loglevel=info
为了Supervisor有意义,你需要至少包含一个program部分。在代码清单8-4中,我们定义了四个程序,分别命名为tornado-8000到tornado-8003。program部分定义了Supervisor将要运行的每个命令的参数。command的值是必须的,通常是带有我们希望监听的port参数的Tornado应用。我们还为每个程序的工作目录、有效用户和日志文件定义了额外的设置;而把autorestart和redirect_stderr设置为true是非常有用的。
为了一起管理所有的Tornado进程,创建一个组是很有必要的。在这个例子的顶部,我们声明了一个叫作tornadoes的组,并在其中列出了每个程序。现在,当我们想要管理我们的Tornado应用时,我们可以通过带有通配符的组名引用所有的组成程序。比如,要重启应用时,我们只需要在supervisorctl工具中使用命令restart tornadoes:*。
一旦你安装和配置好Supervisor,你就可以使用supervisorctl来管理supervisord进程。为了启动你的Web应用,你可以让Supervisor重新读取配置,然后任何配置改变的程序或程序组将被重启。你同样可以手动启动、停止和重启被管理的程序或检查整个系统的状态。
supervisor& update
tornadoes: stopped
tornadoes: updated process group
supervisor& status
tornadoes:tornado-8000 RUNNING pid 32091, uptime 00:00:02
tornadoes:tornado-8001 RUNNING pid 32092, uptime 00:00:02
tornadoes:tornado-8002 RUNNING pid 32093, uptime 00:00:02
tornadoes:tornado-8003 RUNNING pid 32094, uptime 00:00:02
Supervisor和你系统的初始化进程一起工作,并且它应该在系统启动时自动注册守护进程。当supervisor启动后,程序组会自动在线。默认情况下,Supervisor会监控子进程,并在任何程序意外终止时重生。如果你想不管错误码,重启被管理的进程,你可以设置autorestart为true。
Supervisor不只可以使管理多个Tornado实例更容易,还能让你在Tornado服务器遇到意外的服务中断后重新上线时泰然处之。window7 下配置python2.7+tornado3.3开发环境 | 海鹏的博客
玩python的人大都在linux下进行开发,由于长期习惯在windows下开发代码,今天蛋疼尝试在,必然的中间遇到各种报错,但是最终还是配置成功了,发帖方便网友少走弯路.
前提: python2.7的安装比较简单,且网上也有大量文章可以找,这里就不再累述,直接进入tornado3.3安装.
我的python2.7是装在 D:\Python27
1.tornado下载
直接用Git工具从Github上下载tornado项目
对于 Python 2.6 以上的版本,因为标准库中已经包括了对 epoll 的支持,所以你可以不用 setup.py 编译安装,网上有人说直接将 tornado 的目录添加到 PYTHONPATH 就可以使用了.但是我还是采用把tornado源码直接安装到python安装入境中去.
运行-&CMD 然后到上图的tornado的路径下执行:
python setup.py install
python setup.py install
如图,我遇到个编译报错, vcvarsall.bat这个没找到,网上查了原因是 python在注册表中寻找到vs的目录,再去在vs目录下找vcvarsall.bat。但是问题我机器的vs版本比较低,python里面默认是vc9.0也就是vs2008所以它在注册表里面找不到键值,返回None,可以自己取安装一个vs2008以上版本,这个问题先忽略,因为不会影响后面的使用(我们不需要编译安装)
install执行完后会在pyhon的安装路径的\Lib\site-packages下多一个tornado文件夹,tornado的初步安装但是还未完成
Tornado 在 Python 2.5, 2.6, 2.7 中都经过了测试。要使用 Tornado 的所有功能,你需要安装
(7.18.2 或更高版本)
2.安装 PycUrl
到http://pycurl.sourceforge.net/download/地址下载
直接默认安装就 OK
安装完后同样在\Lib\site-packages下会多出点东西
通过网上文章研究到这来,以为就完成了,所以开始跑 经典 “helloworld.py”发现报错….偶的心拔凉拔凉的
很明显缺少backports.ssl_match_hostname依赖,好吧去网上找这个依赖
3 .下载 backports.ssl_match_hostname
到 https://pypi.python.org/pypi/backports.ssl_match_hostname下载backports.ssl_match_hostname 3.4.0.2,找不到win32直接安装版本,可就下载了源码,自己install喽
到backports.ssl_match_hostname-3.4.0.2路径下执行
python steup install
python steup install
又悲剧了,还是少依赖
setuptools
4.继续找依赖
setuptools
网上找了一下,在百度云盘 下载了一个 win32版本
地址是: /s/15R6w4
直接安装后再次执行install后 OK
最后再次运行 helloworld.py,尼玛成功了!!!!!!
吾将上下而求索!Centos 六 安装配置 Tornado - 操作系统当前位置:& &&&Centos 六 安装配置 TornadoCentos 六 安装配置 Tornado&&网友分享于:&&浏览:102次Centos 6 安装配置 Tornado
&&&&& 在本章中,我们来看一下怎么在CentOS 6.4上安装和配置Tornado Server服务器。&&&&& 首先让我们来看一下Tornado是什么?Tornado是使用Python编写出來的一个极轻量级、高可伸缩性和非阻塞IO的Web Server服务器软件,跟其他主流的Web服务器框架(主要是Python框架)不同是采用epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务。&&&&&& &&&&& 下面我们来看一下Tornado Server的安装步骤:&&&&& 第一步,先安装python和tornado文件,之前已经安装过python了,现在直接下载tornado:引用&&&&& # wget https://pypi.python.org/packages/source/t/tornado/tornado-3.1.tar.gz&&&&& # chmod +x tornado-3.1.tar.gz&&&&& # tar xzvf tornado-3.1.tar.gz &&&&& &&&&& 第二步,开始安装Tornado之前先安装gcc-c++:引用&&&&& # yum -y install gcc-c++&&&&& # cd tornado-3.1&&&&& # python setup.py build& //编译&&&&& &&&&& 然后开始安装:引用&&&&& #sudo python setup.py install&&&&& &&&&& 这就安装结束了!&&&&& 接下来我们来验证一下是否真的安装成功,启动其中内置的一个demo:引用&&&&& # ./demos/helloworld/helloworld.py&&&&& &&&&& 然后在浏览器中输入http://127.0.0.1:8888/看到“Hello, world”的页面就表示安装成功了!&&&&& 另外要想使用Tornado的全部功能,比安装PycURL:引用&&&&& # sudo yum install python-pycurl&&&&& &&&&& 对于Python 2.7之前的版本,使用Tornado还需要simplejson引用&&&&& # sudo yum install python-simplejson&&&&&& &&&&& 想要对Tornado做更多的了解,大家可以看Tornado官方文档。&&&&&&
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 tornado nginx 部署 的文章

 

随机推荐