V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http://www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
keakon
V2EX  ›  Tornado

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

  •  
  •   keakon · 2012-12-14 16:34:30 +08:00 · 10355 次点击
    这是一个创建于 4366 天前的主题,其中的信息可能已经有所发展或是发生改变。
    先描述下遇到的问题吧:
    我在服务器上跑了 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 秒),并且不接收新的请求,然后再退出?
    8 条回复    1970-01-01 08:00:00 +08:00
    liuxurong
        1
    liuxurong  
       2012-12-14 16:37:41 +08:00
    同疑問。 Supervisor 控制重啟可以不可以用 nginx 的 reopen 而不直接kill
    keakon
        3
    keakon  
    OP
       2012-12-14 16:58:28 +08:00
    @zuroc 这只是解决了第一个问题
    keakon
        4
    keakon  
    OP
       2012-12-14 16:59:49 +08:00
    @liuxurong stopsignal 设为 HUG 试试
    zuroc
        5
    zuroc  
       2012-12-14 17:03:07 +08:00
    @keakon nginx会重发请求吧 只是会有请求被打断
    keakon
        6
    keakon  
    OP
       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
        7
    sdjl  
       2012-12-25 22:44:23 +08:00
    同问, webpy怎么做到?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:39 · PVG 01:39 · LAX 09:39 · JFK 12:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.