Tornado + Supervisor + nginx 怎样优雅地重启?

2012-12-14 16:34:30 +08:00
 keakon
先描述下遇到的问题吧:
我在服务器上跑了 4 个 Tornado 进程,分布在 4 个不同的端口,用 nginx 映射到 80 端口。
当代码改动过后,我需要重启所有的 Tornado 进程。
使用 supervisorctl restart myapp:all 这种方式来重启时,大概有 10 秒的时间所有的访问都会出现 502 错误。
此外,由于 Supervisor 在结束进程时传递的是 TERM 信号,那些未处理完的请求可能也被直接扼杀了。

解决第一个问题的话,似乎可以依次重启每个 Tornado 进程,虽然有点麻烦。
或者是配置两组进程,先启动一组备用的,然后替换 nginx 配置到新端口,再干掉老的。

第二个问题似乎有点麻烦。我看 tornado.autoreload._reload(),其实也只是简单地关闭所有 sockets,然后 os.spawnv() 一个进程,再 exit 自己。
有没有办法让 Tornado 处理完现有的请求(最多等 10 秒),并且不接收新的请求,然后再退出?
10194 次点击
所在节点    Tornado
8 条回复
liuxurong
2012-12-14 16:37:41 +08:00
同疑問。 Supervisor 控制重啟可以不可以用 nginx 的 reopen 而不直接kill
zuroc
2012-12-14 16:48:21 +08:00
keakon
2012-12-14 16:58:28 +08:00
@zuroc 这只是解决了第一个问题
keakon
2012-12-14 16:59:49 +08:00
@liuxurong stopsignal 设为 HUG 试试
zuroc
2012-12-14 17:03:07 +08:00
@keakon nginx会重发请求吧 只是会有请求被打断
keakon
2012-12-14 17:39:25 +08:00
发现一个办法,先 server.stop() 这样会停止接收新请求,再每隔一段时间判断 not ioloop._callbacks,然后调用 ioloop.stop():
https://groups.google.com/forum/?fromgroups=#!topic/python-tornado/VpHp3kXHP7s
sdjl
2012-12-25 22:44:23 +08:00
同问, webpy怎么做到?
zuroc
2012-12-26 11:27:25 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/54908

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX