有没有办法在没有重新启动服务器的情况下使用Tornado / Python部署新代码?

时间:2011-11-10 21:54:30

标签: python tornado

我最近开始尝试使用Python和Tornado Web服务器/框架进行Web开发。以前,我在LAMP堆栈上使用PHP和我自己的框架。使用PHP,部署更新的代码/新代码就像上传到服务器一样简单,因为mod_php和Apache交互的方式。

当我在Python / Tornado中添加新代码或更新代码时,是否需要重新启动Tornado服务器?如果您有许多活跃用户,我可以看到这是有问题的。

(a)我是否必须重启服务器,还是有其他/更好的方式?

(b)如果是这样,我怎样才能避免用户断线/收到错误等。当它重新启动时(可能需要几秒钟)?

[一种可能的想法是使用页面翻转范例,Nginx指向服务器,使用更新的代码启动新的服务器实例,在那里重定向Nginx并取下原始服务器......?]

5 个答案:

答案 0 :(得分:9)

似乎最好的方法是将Nginx与多个Tornado实例一起使用,正如我在原始问题中提到的那样,正如Cole所提到的那样。 Nginx可以动态重新加载其配置文件。所以这个过程看起来像这样:

  1. 更新Python / Tornado Web应用程序代码
  2. 在不同的端口上启动应用程序的新实例
  3. 更新Nginx的配置文件以指向新实例(首先测试配置文件的语法)
  4. 使用kill -HUP命令重新加载Nginx配置文件
  5. 停止旧的Python / Tornado Web服务器实例
  6. 关于热交换配置文件的Nginx上有几个有用的资源:

    https://calomel.org/nginx.html(在“解释nginx.conf中的指令”部分中) http://wiki.nginx.org/CommandLine(在“使用信号加载新配置”部分中)

答案 1 :(得分:1)

使用HAProxyNginx代理多个Tornado进程,然后逐个重新启动。 Tornado docs cover Nginx,但它不支持websockets,所以如果你使用它们,你将需要HAProxy。

答案 2 :(得分:0)

您可以在tornado Web实例中使用debug = True开关。

T_APP = tornado.web.Application(<URL_MAP>, debug=True)

这反映了处理程序在发生时的变化。

答案 3 :(得分:0)

这是你在寻找什么?

修改模块时自动重启服务器的模块。 http://www.tornadoweb.org/en/branch2.4/autoreload.html

答案 4 :(得分:0)

如果您只想在开发过程中使用Tornado / python部署新代码而不重启服务器,则可以使用this GitHub存储库中的realtimefunc装饰器。