有办法在不重启服务器的情况下用Tornado/Python部署新代码吗?
我最近开始尝试用Python和Tornado这个网络服务器/框架来做网页开发。之前我用的是PHP,搭配我自己的框架在LAMP环境下工作。用PHP的时候,更新代码或上传新代码非常简单,只需要把文件上传到服务器就行,因为mod_php和Apache的配合让这个过程很顺畅。
现在我在Python/Tornado中添加新代码或更新代码时,是否需要重启Tornado服务器呢?如果有很多用户正在使用,这样做可能会造成问题。
(a) 我需要重启服务器吗?还是有其他更好的方法?
(b) 如果需要重启,我该如何避免用户在重启期间断开连接或出现错误呢?因为重启可能需要几秒钟的时间。
[一个可能的想法是使用页面切换的方式,让Nginx指向一个服务器,启动一个新的服务器实例来运行更新后的代码,然后把Nginx的指向切换到新服务器,再把原来的服务器关闭……?]
5 个回答
你可以在tornado网页实例中使用一个debug=True的开关。
T_APP = tornado.web.Application(<URL_MAP>, debug=True)
这样一来,处理程序的变化会实时反映出来。
可以使用 HAProxy 或 Nginx 来管理多个 Tornado 进程,这样你就可以一个一个地重启它们。虽然 Tornado 的文档提到了 Nginx,但 Nginx 不支持 websockets,所以如果你在用 websockets,就需要选择 HAProxy。
看起来最好的方法是用Nginx配合多个Tornado实例,就像我在最开始的问题中提到的,Cole也提到了。Nginx可以实时重新加载它的配置文件。所以整个过程大致是这样的:
- 更新Python/Tornado网页应用的代码
- 在不同的端口上启动一个新的应用实例
- 更新Nginx的配置文件,让它指向新的实例(先检查一下配置文件的语法)
- 用一个
kill -HUP
命令重新加载Nginx的配置文件 - 停止旧的Python/Tornado网页服务器实例
这里有几个关于Nginx热更新配置文件的有用资源:
https://calomel.org/nginx.html (在“解释nginx.conf中的指令”部分)
http://wiki.nginx.org/CommandLine (在“使用信号加载新配置”部分)