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

6 投票
5 回答
4424 浏览
提问于 2025-04-17 06:04

我最近开始尝试用Python和Tornado这个网络服务器/框架来做网页开发。之前我用的是PHP,搭配我自己的框架在LAMP环境下工作。用PHP的时候,更新代码或上传新代码非常简单,只需要把文件上传到服务器就行,因为mod_php和Apache的配合让这个过程很顺畅。

现在我在Python/Tornado中添加新代码或更新代码时,是否需要重启Tornado服务器呢?如果有很多用户正在使用,这样做可能会造成问题。

(a) 我需要重启服务器吗?还是有其他更好的方法?

(b) 如果需要重启,我该如何避免用户在重启期间断开连接或出现错误呢?因为重启可能需要几秒钟的时间。

[一个可能的想法是使用页面切换的方式,让Nginx指向一个服务器,启动一个新的服务器实例来运行更新后的代码,然后把Nginx的指向切换到新服务器,再把原来的服务器关闭……?]

5 个回答

0

你可以在tornado网页实例中使用一个debug=True的开关。

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

这样一来,处理程序的变化会实时反映出来。

1

可以使用 HAProxyNginx 来管理多个 Tornado 进程,这样你就可以一个一个地重启它们。虽然 Tornado 的文档提到了 Nginx,但 Nginx 不支持 websockets,所以如果你在用 websockets,就需要选择 HAProxy。

9

看起来最好的方法是用Nginx配合多个Tornado实例,就像我在最开始的问题中提到的,Cole也提到了。Nginx可以实时重新加载它的配置文件。所以整个过程大致是这样的:

  1. 更新Python/Tornado网页应用的代码
  2. 在不同的端口上启动一个新的应用实例
  3. 更新Nginx的配置文件,让它指向新的实例(先检查一下配置文件的语法)
  4. 用一个 kill -HUP 命令重新加载Nginx的配置文件
  5. 停止旧的Python/Tornado网页服务器实例

这里有几个关于Nginx热更新配置文件的有用资源:

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

撰写回答