新浦京81707con > 功能介绍 > Web框架Tornado运行和部署,用户指南

原标题:Web框架Tornado运行和部署,用户指南

浏览次数:112 时间:2019-06-12

正文实例为大家享受了Python Web框架Tornado运维和配备的详实内容,供我们参谋,具体内容如下

Python Web框架Tornado运维和布局,pythontornado

本文实例为大家大快朵颐了Python Web框架Tornado运营和铺排的详尽内容,供大家参照他事他说加以考查,具体内容如下

1、运转和配置 因为Tornado内置了和谐的HTTPServer,运转和布局它与其余Python web框架不太同样。你须要写二个main()函数来运营服务,而不是安顿一个WSGI容器来运行你的使用:

def main():
  app = make_app()
  app.listen(8888)
  IOLoop.current().start()

if __name__ == '__main__':
  main()

配置你的操作系统大概经过管理器来运营那几个程序以运营服务。注意,扩张每种进程允许张开的最大文件句柄数是也许是须求的(为了防止“Too many open files” 的谬误)。为了扩大那个上限(举个例子设置为四千0 ) 你能够选用ulimit命令,修改/etc/security/limits.conf 恐怕安装minfds 在你的supervisord配置中。

二、进度和端口
出于Python的GIL(全局解释器锁),为了足够利用多CPU的机器,运维多个Python 进度是很有必不可缺的。平常,最好是每一种CPU运营二个经过。

Tornado包蕴了叁个停放的多进度格局来二次开发银行多个进度,那亟需多少个在main 函数上做点壹线的变动:

def main():
  app = make_app()
  server = tornado.httpserver.HTTPServer(app)
  server.bind(8888)
  server.start(0) # forks one process per cpu
  IOLoop.current().start()

那是最简便的方法来运维多进度并让他俩共享一样的端口,就算它有一些局限性。首先,各个子进度将有它和睦的IOLoop,所以fork在此以前,不接触全局 IOLoop 实例是不可或缺的(以至是直接的)。其次,在那一个模型中,很难做到零停机 (zero-downtime)更新。最终,因为具备的长河共享同样的端口,想单独监控它们就更是困难了。

对更目眩神摇的配备,提议运行单独的经过,并让它们各自监听不一样的端口, supervisord 的“进度组(process groups)”功用是二个很好的诀要。当每种进程使用差别的端口,一个外部的负荷均衡器,比方HAProxy或nginx日常供给对外向访客提供贰个纯粹的地方。

三、运维在负载均衡器前面
当运转在二个载重均衡器比如nginx,建议传递xheaders=True 给 HTTPServer 的构造器。那将告诉Tornado使用类似 X-Real-IP 那样的HTTP头来得到用户的IP地址而不是把富有流量都感觉来自于负载均衡器的IP地址。

那是壹份原始的nginx配置文件,在结构上类似于我们在FriendFeed所使用的配置。这是只要nginx和Tornado server运维在平等台机器上的,并且多个 Tornado server 正运营在七千 - 800三端口:

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
  worker_connections 1024;
  use epoll;
}

http {
  # Enumerate all the Tornado servers here
  upstream frontends {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
  }

  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  access_log /var/log/nginx/access.log;

  keepalive_timeout 65;
  proxy_read_timeout 200;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  gzip on;
  gzip_min_length 1000;
  gzip_proxied any;
  gzip_types text/plain text/html text/css text/xml
        application/x-javascript application/xml
        application/atom xml text/javascript;

  # Only retry if there was a communication error, not a timeout
  # on the Tornado server (to avoid propagating "queries of death"
  # to all frontends)
  proxy_next_upstream error;

  server {
    listen 80;

    # Allow file uploads
    client_max_body_size 50M;

    location ^~ /static/ {
      root /var/www;
      if ($query_string) {
        expires max;
      }
    }
    location = /favicon.ico {
      rewrite (.*) /static/favicon.ico;
    }
    location = /robots.txt {
      rewrite (.*) /static/robots.txt;
    }

    location / {
      proxy_pass_header Server;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Scheme $scheme;
      proxy_pass http://frontends;
    }
  }
}

4、静态文件和文件缓存
Tornado中,你能够因此在应用程序中钦点非常的 static_path 来提供静态文件服务:

settings = {
  "static_path": os.path.join(os.path.dirname(__file__), "static"),
  "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
  "login_url": "/login",
  "xsrf_cookies": True,
}
application = tornado.web.Application([
  (r"/", MainHandler),
  (r"/login", LoginHandler),
  (r"/(apple-touch-icon.png)", tornado.web.StaticFileHandler,
   dict(path=settings['static_path'])),
], **settings)

那些设置将活动的把具备以 /static/ 起头的伸手交由static目录,比方 将会通过点名的static目录提供 foo.png 文件。大家也会自动从static目录提供 /robots.txt 和 /favicon.ico (固然它们并不曾以 /static/ 前缀起先)。

在地方的设置中,大家一览了解的安插Tornado从 StaticFileHandler 根下获得apple-touch-icon.png 文件,固然文件在static文件目录中。(正则表达式捕获组必须告诉 StaticFileHandler 请求的文件名,调用捕获组把文件名作为艺术的参数字传送递给管理程序) 你能够做一样的政工,举例从网址的根提供 sitemap.xml 文件。 当然,你也足以因而在你的HTML中使用 <link /> 标签来防止伪造根目录的 apple-touch-icon.png 。

为了精雕细琢质量,日常情形下,让浏览器主动缓存静态能源是个好主意, 那样浏览器就不会发送不须要的可能在渲染页面时打断的 If-Modified-Since 或 Etag 请求了, Tornado使用 静态内容版本(static content versioning) 来援救此项功用。

为了选取那么些效用,在你的沙盘中使用 static_url 方法,而不是一直在您的HTML中输入静态文件的U凯雷德L:

<html>
  <head>
    <title>FriendFeed - {{ _("Home") }}</title>
  </head>
  <body>
    <div><img src="{{ static_url("images/logo.png") }}"/></div>
  </body>
</html>

static_url() 函数将把相对路线翻译成1个UTiggoI类似于 /static/images/logo.png?v=aae5四.个中的 v 参数是 logo.png 内容的哈希(hash),并且它的存在使得Tornado服务向用户的浏览器发送缓存头,那将使浏览器无有效期的缓存内容。

因为参数 v 是依据文件内容的,假使你更新二个文书同等对待启服务,它将发送八个新的 v 值,所以用户的浏览器将会自动的拉去新的文书。要是文件的剧情从未变动,浏览器将会三番五次运用本地缓存的别本,而不会从服务器检查更新,显然的滋长了渲染品质。

在生养中,你大概想提供静态文件通过二个更优的静态服务器, 举个例子nginx,你能够配备任何web服务器度和胆识别通过 static_url() 提供的版本标签并相应的安装缓存头。下边是大家在 FriendFeed 使用的nginx相关配置的1部分:

location /static/ {
  root /var/friendfeed/static;
  if ($query_string) {
    expires max;
  }
 }

五、Debug格局和机动重载
设若传递 debug=True 配置给 Application 的构造函数,应用程序将会运行在debug/开采情势。 在这些格局下,为了方便于付出的1对功能将被启用( 每二个也能够视作单身的标签使用,假使它们都被特别内定,这它们都将获取独立的优先级):

1、autoreload=True: 应用程序将会观察它的源文件是还是不是变动,并且当其余公文字改进变的时候便重载它和谐。这收缩了在支付中需求手动重启服务的需要。可是,在debug格局下,有个别错误(比方import的时候有语法错误)会变成服务 关闭,并且不能活动还原。
2、compiled_template_cache=False: 模板将不会被缓存。
3、static_hash_cache=False: 静态文件哈希 (被 static_url 函数使用) 将不会被缓存。
4、serve_traceback=True: 当一个不行在 RequestHandler 中并未捕获,将会变卦1个含有调用栈新闻的谬误页。
自动重载(autoreload)形式和 HTTPServer 的多进度形式不包容,你不可能给 HTTPServer.start 传递 一 以外的参数(也许调用 tornado.process.fork_processes) 当你采取机关重载形式的时候。

debug情势的活动重载功效可用作二个独门的模块位于 tornado.autoreload。以下两个能够结合使用,在语法错误之时提供额外的健壮性: 设置 autoreload=True 能够在app运营时检查评定文件修改,还应该有运行 python -m tornado.autoreload myserver.py 来捕获放肆语法错误也许别的的运维时错误。

重载会丢掉任何Python解释器命令行参数(-u). 因为它选拔 sys.executable 和 sys.argv 重新实施Python。别的,修改这么些变量将产生重载错误。

在有的阳台(蕴含Windows 和Mac OSX 10.6事先),进度不能够被“原地”更新,所以当检测到代码更新,旧服务就能够脱离然后运行一个新服务。那早已被公知来混淆视听一些IDE。

六、WSGI和Google App Engine
Tornado平常是单身运转的,不须求贰个WSGI容器。然则,在有的情状中 (举个例子谷歌(Google) App Engine),只运转WSGI,应用程序不能够独立运维自身的服务。在这种情况下,Tornado协助四个有限定的操作情势,不帮忙异步操作但允许叁个Tornado's作用的子集在仅WSGI意况中。以下职能在WSGI情势下是不帮助的,包涵协程,@asynchronous 装饰器,AsyncHTTPClient,auth 模块和WebSockets。

您能够运用 tornado.wsgi.WSGIAdapter 把二个Tornado Application 转变到WSGI应用。在那一个例子中, 配置你的WSGI容器发 现 application 对象:

import tornado.web
import tornado.wsgi

class MainHandler(tornado.web.RequestHandler):
  def get(self):
    self.write("Hello, world")

tornado_app = tornado.web.Application([
  (r"/", MainHandler),
])
application = tornado.wsgi.WSGIAdapter(tornado_app)

以上就是本文的全体内容,希望对大家的就学抱有协助。

译者说

Tornado 4.3于20一五年一月22日公告,该版本正式补助Python3.5async/await器重字,并且用旧版本CPython编写翻译Tornado一样能够应用这五个主要字,那毋庸置疑是1种进步。其次,那是最终二个支撑Python2.6Python3.2的本子了,在持续的版本了会移除对它们的特别。将来网络上还从来不Tornado4.3的汉语文书档案,所认为了让更多的爱人能接触并学习到它,小编早先了这一个翻译项目,希望感兴趣的小友人能够同步参加翻译,项目地址是tornado-zh on Github,翻译好的文书档案在Read the Docs上直接能够看来。招待Issues or P陆风X8。

1、运转和安顿 因为Tornado内置了团结的HTTPServer,运转和配备它与别的Python web框架不太1致。你供给写二个main()函数来运转服务,而不是陈设三个WSGI容器来运转你的运用:

您恐怕感兴趣的篇章:

  • Python Web框架Pylons中使用MongoDB的例子
  • 在python的WEB框架Flask中利用三个布局文件的消除方式
  • python常用web框架轻易品质测试结果分享(包蕴django、flask、bottle、tornado)
  • Python Web框架Flask时限信号机制(signals)介绍
  • Python Web框架Flask中运用微博SAE云存款和储蓄实例
  • Python Web框架Flask中动用七牛云存款和储蓄实例
  • Python Web框架Flask下网址开辟入门实例
  • 简短介绍Python的简便web框架Bottle
  • 编写制定Python的web框架中的Model的课程
  • 简轻易单介绍Python下团结编写web框架的某些要义

Web框架Tornado运转和安插,pythontornado 本文实例为大家享用了Python Web框架Tornado运转和配备的详实内容,供大家参谋,具体内容如下 一、...

运营和布局

因为Tornado内置了和煦的HTTPServer, 运转和配备它与别的Python web框架不太同样. 你供给写三个main()函数来运转服务, 而不是布局贰个WSGI容器来运营你的应用:

    def main():
        app = make_app()
        app.listen(8888)
        IOLoop.current().start()

    if __name__ == '__main__':
        main()

布署你的操作系统可能经过管理器来运营这么些顺序以运行服务. 请小心, 增添每种进度允许张开的最大文件句柄数是唯恐是必备的(为了幸免"Too many open files"的谬误). 为了扩充这么些上限(比方设置为60000 ) 你能够运用ulimit命令, 修改/etc/security/limits.conf 大概安装minfds 在你的supervisord配置中.

def main():
  app = make_app()
  app.listen(8888)
  IOLoop.current().start()

if __name__ == '__main__':
  main()

经过和端口

鉴于Python的GIL(全局解释器锁), 为了丰硕利用多CPU的机械, 运转多少个Python
经过是很有供给的. 平时, 最棒是种种CPU运维八个进程.

Tornado包涵了1个置于的多进度格局来三次开发银行八个进度. 那亟需1个在main
函数上做点1线的改观:

    def main():
        app = make_app()
        server = tornado.httpserver.HTTPServer(app)
        server.bind(8888)
        server.start(0)  # forks one process per cpu
        IOLoop.current().start()

那是最简单易行的方法来运行多进度并让他俩共享同样的端口, 纵然它有一点点受制性. 首先, 每一种子进度将有它和睦的IOLoop, 所以fork从前, 不接触全局IOLoop实例是关键的(以至是直接的). 其次, 在这一个模型中, 很难成功零停机(zero-downtime)更新. 最后, 因为具有的长河共享一样的端口, 想单独监控它们就愈加费劲了.

对更复杂的安插, 提议运转单独的进度, 并让它们各自监听不相同的端口. supervisord的"进程组(process groups)"效率是2个很好的措施来配置那些. 当每种进度使用区别的端口, 叁个外表的负荷均衡器举个例子HAProxy 或nginx平常必要对外向访客提供贰个十足的地址.

配备你的操作系统也许经过管理器来运作那些程序以运维服务。注意,扩张各个进度允许展开的最大文件句柄数是唯恐是必需的(为了制止“Too many open files” 的谬误)。为了充实那些上限(比方设置为50000 ) 你能够行使ulimit命令,修改/etc/security/limits.conf 可能设置minfds 在您的supervisord配置中。

运营在负载均衡器后边

当运转在三个载重均衡器比方nginx, 建议传递xheaders=True.HTTPServer 的协会器. 那将告诉Tornado使用类似 X-Real-IP那般的HTTP头来收获用户的IP地址而不是把装有流量都觉着来自于负载均衡器的IP地址.

这是壹份原始的nginx配置文件, 在结构上类似于我们在FriendFeed所利用的配置. 那是假诺nginx和Tornado server运维在同一台机器上的, 并且多个Tornado server正运营在7000 - 800三端口:

    user nginx;
    worker_processes 1;

    error_log /var/log/nginx/error.log;
    pid /var/run/nginx.pid;

    events {
        worker_connections 1024;
        use epoll;
    }

    http {
        # Enumerate all the Tornado servers here
        upstream frontends {
            server 127.0.0.1:8000;
            server 127.0.0.1:8001;
            server 127.0.0.1:8002;
            server 127.0.0.1:8003;
        }

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        access_log /var/log/nginx/access.log;

        keepalive_timeout 65;
        proxy_read_timeout 200;
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        gzip on;
        gzip_min_length 1000;
        gzip_proxied any;
        gzip_types text/plain text/html text/css text/xml
                   application/x-javascript application/xml
                   application/atom xml text/javascript;

        # Only retry if there was a communication error, not a timeout
        # on the Tornado server (to avoid propagating "queries of death"
        # to all frontends)
        proxy_next_upstream error;

        server {
            listen 80;

            # Allow file uploads
            client_max_body_size 50M;

            location ^~ /static/ {
                root /var/www;
                if ($query_string) {
                    expires max;
                }
            }
            location = /favicon.ico {
                rewrite (.*) /static/favicon.ico;
            }
            location = /robots.txt {
                rewrite (.*) /static/robots.txt;
            }

            location / {
                proxy_pass_header Server;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Scheme $scheme;
                proxy_pass http://frontends;
            }
        }
    }

贰、进度和端口
鉴于Python的GIL(全局解释器锁),为了丰富利用多CPU的机器,运维七个Python 进度是很有不能缺少的。平常,最棒是各类CPU运行二个进程。

静态文件和文书缓存

Tornado中, 你能够经过在应用程序中钦点非常的 static_path 来提供静态文件服务:

    settings = {
        "static_path": os.path.join(os.path.dirname(__file__), "static"),
        "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
        "login_url": "/login",
        "xsrf_cookies": True,
    }
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/login", LoginHandler),
        (r"/(apple-touch-icon.png)", tornado.web.StaticFileHandler,
         dict(path=settings['static_path'])),
    ], **settings)

这个设置将机关的把装有以 /static/ 开始的伸手从static目录进行提供,e.g.,http://localhost:8888/static/foo.png 将会因而点名的static目录提供 foo.png 文件. 我们也自行的会从static目录提供 /robots.txt/favicon.ico (即使它们并从未以 /static/ 前缀伊始).

在上面的安装中, 我们明显的布局Tornado 提供 apple-touch-icon.png文件从 .StaticFileHandler 根下, 纵然文件在static文件目录中.(正则表明式捕获组必须告诉 .StaticFileHandler 请求的公文名; 调用捕获组把文件名作为艺术的参数字传送递给管理程序.) 你能够做同样的作业 e.g.从网址的根提供 sitemap.xml 文件. 当然, 你也得以经过在您的HTML中利用<link /> 标签来幸免伪造根目录的 apple-touch-icon.png .

为了精雕细刻品质, 日常景况下, 让浏览器主动缓存静态能源是个好主意, 那样浏览器就不会发送不要求的可能在渲染页面时打断的 If-Modified-SinceEtag 请求了. Tornado使用 静态内容版本(static content versioning)来支撑此项作用.

为了选用这几个意义, 在您的模板中利用 ~.RequestHandler.static_url 方法而不是直接在您的HTML中输入静态文件的URubiconL:

    <html>
       <head>
          <title>FriendFeed - {{ _("Home") }}</title>
       </head>
       <body>
         <div><img src="{{ static_url("images/logo.png") }}"/></div>
       </body>
     </html>

static_url() 函数将把相对路线翻译成叁个U奥德赛I类似于/staticlogo.png?v=aae54. 其中的 v 参数是 logo.png内容的哈希(hash), 并且它的留存使得Tornado服务向用户的浏览器发送缓存头,那将使浏览器无有效期的缓存内容.

因为参数 v 是依照文件内容的, 倘使你更新三个文书仁同一视启服务, 它将发送三个新的 v 值, 所以用户的浏览器将会自动的拉去新的文件. 即使文件的剧情从未更换, 浏览器将会一而再选取本地缓存的别本, 而不会从服务器检查更新,显然的增进了渲染品质.

在生产中, 你或许想提供静态文件通过一个更优的静态服务器, 举例nginx. 你可以配备任何web服务器度和胆识别通过static_url() 提供的本子标签并相应的安装缓存头. 上面是我们在FriendFeed 使用的nginx相关配置的一片段:

    location /static/ {
        root /var/friendfeed/static;
        if ($query_string) {
            expires max;
        }
     }

Tornado包罗了叁个放到的多进度方式来二回开行多少个进度,那需求二个在main 函数上做点一线的转移:

Debug方式和活动重载

万1传递debug=True 配置给Application 的构造函数, 应用程序将会运维在debug/开荒方式. 在这几个方式下, 为了有利于于开垦的一些效果将被启用(每多个也能够当做单身的价签使用; 假设它们都被特意钦点, 那它们都将得到独立的优先级):

  • autoreload=True: 应用程序将会旁观它的源文件是还是不是改造, 并且当别的公文字改进变的时候便重载它自身. 那减弱了在付出中须要手动重启服务的需要. 但是, 在debug形式下, 有个别错误(比方import的时候有语法错误)会导致服务关闭, 并且无法活动苏醒.
  • compiled_template_cache=False: 模板将不会被缓存.
  • static_hash_cache=False: 静态文件哈希(被static_url 函数使用) 将不会被缓存
  • serve_traceback=True: 当二个不胜在 RequestHandler 中从未捕获,将会变动三个饱含调用栈新闻的谬误页.

活动重载(autoreload)方式和 .HTTPServer 的多进度情势不包容. 你不能够给HTTPServer.start <.TCPServer.start> 传递一以外的参数(只怕调用tornado.process.fork_processes) 当你选择机关心保养载方式的时候.

debug方式的全自动重载效率可看作2个独门的模块位于tornado.autoreload.以下两个能够构成使用, 在语法错误之时提供额外的健壮性: 设置autoreload=True 能够在app运转时检查实验文件修改, 还或者有运维python -m tornado.autoreload myserver.py 来捕获大4语法错误或许别的的运转时错误.

重载会丢掉任何Python解释器命令行参数(e.g. -u). 因为它接纳sys.executablesys.argv 重新实践Python. 其余, 修改这一个变量将导致重载错误.

在部分阳台(包涵Windows 和Mac OSX 10.陆在此以前), 进度不能够被"原地"更新,所以当检查实验到代码更新, 旧服务就能够退出然后运维三个新服务. 那1度被公众理解来混淆视听一些IDE.

def main():
  app = make_app()
  server = tornado.httpserver.HTTPServer(app)
  server.bind(8888)
  server.start(0) # forks one process per cpu
  IOLoop.current().start()

WSGI和Google App Engine

Tornado常常是单身运作的, 无需2个WSGI容器. 不过, 在部分遇到中(比方谷歌 App Engine), 只运营WSGI, 应用程序无法独立运作本人的服务. 在这种情况下, Tornado协理二个有限制的操作格局, 不帮助异步操作但允许二个Tornado's功能的子集在仅WSGI意况中. 以下职能在WSGI形式下是不支持的, 包涵协程, @asynchronous 装饰器,AsyncHTTPClient, auth 模块和WebSockets.

你能够利用 tornado.wsgi.WSGIAdapter 把一个TornadoApplication 调换来WSGI应用. 在那个例子中, 配置你的WSGI容器开采 application 对象:

    import tornado.web
    import tornado.wsgi

    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("Hello, world")

    tornado_app = tornado.web.Application([
        (r"/", MainHandler),
    ])
    application = tornado.wsgi.WSGIAdapter(tornado_app)

查看 appengine example application 以通晓AppEngine在Tornado上支付的全体功用.


能够因而上面贰维码订阅小编的篇章公众号【MoeLove】

图片 1

那是最简便的章程来运行多进度并让他俩共享一样的端口,即使它有一点点局限性。首先,每一个子进程将有它协调的IOLoop,所以fork此前,不接触全局 IOLoop 实例是器重的(以至是直接的)。其次,在那么些模型中,很难做到零停机 (zero-downtime)更新。最后,因为具备的长河共享一样的端口,想单独监察和控制它们就愈加困难了。

对更复杂的配备,提出运行单独的历程,并让它们各自监听不相同的端口, supervisord 的“进度组(process groups)”成效是三个很好的法子。当每一个进程使用差别的端口,一个外部的负荷均衡器,比方HAProxy或nginx平日须要对外向访客提供1个纯粹的地方。

叁、运营在负载均衡器前边
当运营在贰个载重均衡器比如nginx,建议传递xheaders=True 给 HTTPServer 的构造器。那将告诉Tornado使用类似 X-Real-IP 那样的HTTP头来取得用户的IP地址而不是把全体流量都以为来自于负载均衡器的IP地址。

这是一份原始的nginx配置文件,在结构上类似于我们在FriendFeed所利用的配备。那是假设nginx和Tornado server运转在持之以恒台机械上的,并且多个 Tornado server 正运营在7000 - 8003端口:

本文由新浦京81707con发布于功能介绍,转载请注明出处:Web框架Tornado运行和部署,用户指南

关键词: 新浦京81707con Tornado专题 Tech

上一篇:numpy中的高维数组转置实例,transpose对三维数组的

下一篇:没有了