博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python tornado

Posted on 2017-03-01 12:00  bw_0927  阅读(202)  评论(0)    收藏  举报

https://www.safaribooksonline.com/library/view/introduction-to-tornado/9781449312787/ch01s02.html

http://luokr.com/p/2

https://mirrors.segmentfault.com/itt2zh/ch1.html

https://weilaihui.gitbooks.io/tornado-web/content/new-tornado/try/first-web.html

 

最近几天闲来无事,用Python的Tornado框架写了个应用(螺壳网),应用本身的实现很简单,代码也已经开源了,有兴趣的同学可以查看 http://luokr.com/about,里面有更加具体的介绍。今天顺便写一下如何在Linux下部署一个简单的基于Nginx+Tornado+Supervisor的Python web服务。

Tornado:官方介绍,是使用Python编写出来的一个极轻量级、高可伸缩性和非阻塞IO的Web服务器软件,著名的 Friendfeed 网站就是使用它搭建的。官方网站:http://www.tornadoweb.org/

Supervisor:一个服务(进程)管理工具,主要用于监控我们的服务器上的服务,并且在出现问题时重启之。

Nginx:没什么好说的啦,作为Web服务器,在这里主要利用它做反向代理

整个的工作流程就是客户端访问Nginx主机,由Nginx反向代理到后端Tornado进程的服务器,而Tornado进程则由Supervisord管理。和其它常见的web服务架构相似,比如Nginx + PHP-FPM

以下示例都是基于Linux发行版CentOS 6.x。

Tornado安装和配置:

首先让我们来实现一个简单的基于Tornado web server的应用。Tornado可以在命令行中直接 pip 或者 easy_install 安装,或者在官网下载源代码的压缩包,解压后整个包放入Python的库目录中即可。

现在我们来新建一个index.py文件,假定该文件位于 /var/www,编辑代码如下:

import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
 
application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/index.py", MainHandler),
])
 
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

  

index.py文件作为应用入口,可以直接在命令行使用python解释器执行之:

  1. $ python index.py

这个时候,我们就可以用服务器IP+端口8888的方式访问到我们的Hello world应用了,比如127.0.0.1:8888。

假如执行上述命令的时候出错,比如报:ImportError: No module named pkg_resources,那么可能你的Python安装路径不正确,可以尝试重新配置,执行:

  1. $ curl http://python-distribute.org/distribute_setup.py | python

Supervisor安装和配置:  http://liyangliang.me/posts/2015/06/using-supervisor/

每次手动在命令行启动应用是比较麻烦的,我们还需要一个能够方便的管理服务进程的工具,包括自动重启进程等,而Supervisor的作用在这里就可以体现了。我们使用它来管理这个Tornado web server相关的进程。首先安装之:

  1. $ yum install supervisor

安装完毕后,生成Supervisor的配置文件并编辑:

  1. echo_supervisord_conf > /etc/supervisord.conf
  2. $ vim /etc/supervisord.conf

在文件末尾加入:

  1. [program:hello]
  2. command=python /var/www/index.py --port=8888
  3. directory=/var/www
  4. autorestart=true
  5. redirect_stderr=true

 

其作用就是:发现'cmmand'挂了,就重新拉起

这段配置主要作用就是在Supervisor启动的时候自动启动我们的hello应用对应的Tornado web server进程并纳入管理,具体配置项的意义,可以参考Supervisor官方文档http://supervisord.org/。配置完毕后,我们就可以启动管理了:

  1. $supervisord -c /etc/supervisord.conf
  2. $ supervisorctl start all   

Nginx安装和配置:

首先安装Nginx,如果已安装可以忽略:

  1. $ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
  2. $ yum install nginx

接下来是Nginx的配置,我们需要使用Nginx来将web请求代理到Tornado web server,新建配置文件:

  1. $ vim /etc/nginx/conf.d/tornado.conf

输入如下内容(参考螺壳网的配置):

upstream tornado {
    server 127.0.0.1:8888;
}
 
server {
    listen   80;
    root /var/www;
    index index.py index.html;
 
    server_name server;
 
    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.py/$1 last;
        }
    }
 
    location ~ /index\.py {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://tornado;
    }
}

  

重启Nginx:

  1. $ service nginx restart

现在就可以使用Nginx配置中指定的域名直接访问我们的hello应用了。