WSGI 服务器进程管理¶
使用 SIGHUP 实现优雅关闭¶
Swift 一直支持通过 SIGHUP 实现 WSGI 服务器的优雅关闭。 这将导致管理器进程退出其确保所有工作进程都在运行的循环,关闭所有工作进程的监听套接字,并退出。 关闭监听套接字会导致所有新的 accept 调用失败,但不会影响任何已建立的连接。
工作进程将被重新父进程化,可能变为 PID 1,并且可以使用 swift-orphans 进行发现。 当 accept 调用失败时,它会等待处理连接的 GreenPool 完成,然后退出。 每个工作进程将继续处理当前请求,然后关闭连接。 请注意,如果客户端尝试重用连接进行进一步的请求,则会收到连接错误。
在无缝重载功能引入之前(见下文),一种常见的重载策略是执行优雅关闭,然后重新启动服务。
使用 SIGUSR1 实现无缝重载¶
从 Swift 2.24.0 开始,WSGI 服务器支持通过 SIGUSR1 实现无缝重载。 这允许服务器重启以获取配置或代码更改,同时最大限度地减少对客户端的干扰。 过程如下:
管理器进程接收到
USR1信号。 这将导致该进程退出其确保所有工作进程都在运行的循环,并开始重新加载。 工作进程将继续处理客户端请求,只要它们的监听套接字保持打开状态即可。
管理器进程进行 fork。 新的子进程了解所有现有工作进程及其监听套接字;它将负责关闭旧工作进程的监听套接字,以停止接受新的连接。
管理器进程重新执行自身。 它获取新的配置和代码,同时保持与旧管理器进程相同的 PID。 此时,只有套接字关闭器正在跟踪旧工作进程,但所有进程(包括旧工作进程)仍然是新管理器进程的子进程。 因此,旧工作进程无法使用
swift-orphans进行发现;swift-oldies可能会有用,但也会找到管理器进程。
新的管理器进程 fork 出新的工作进程,每个工作进程都有自己的监听套接字。 一旦所有工作进程都启动并可以接受新的连接,管理器进程就会通过管道通知套接字关闭器。 套接字关闭器关闭旧工作进程的监听套接字,以停止接受新的连接,将旧工作进程的列表传递给新的管理器进程,然后退出。
旧工作进程继续处理任何正在进行的连接,而新连接由新的工作进程处理。 一旦旧工作进程完成所有未完成的请求,它就会退出。 从 Swift 2.35.0 开始,如果任何工作进程持续时间超过
stale_worker_timeout,新的管理器进程将使用KILL信号清理它们。
所有旧工作进程现在都已退出。 只有新的代码和配置正在使用。
swift-reload¶
从 Swift 2.33.0 开始,包含一个新的 swift-reload 助手,以帮助验证重载过程。 给定一个 PID,它将:
验证 PID 似乎属于 Swift WSGI 服务器管理器进程,
检查该 PID 使用的配置文件是否当前有效,
发送
USR1信号以启动重载,并等待新的工作进程启动(指示重载完成)后退出。