这个(相当旧的)article似乎暗示两个Unicorn主进程可以绑定到同一个Unix套接字路径:
当旧主人收到QUIT时,它会正常开始关闭其工作人员 . 一旦所有 Worker 完成了服务请求,它就会死亡 . 我们现在有一个新版本的应用程序,完全加载并准备好接收请求,没有任何停机时间:新旧工作者都共享Unix域套接字,因此nginx甚至不必关心转换 .
读书,我不明白这是怎么可能的 . 根据我的理解,要真正实现零停机,您必须使用 SO_REUSEPORT
让旧服务器和新服务器临时绑定到同一个套接字 . 但 SO_REUSEPORT
是not supported on Unix sockets . (我通过绑定到另一台服务器已经在使用的Unix套接字路径来测试它,我得到了 EADDRINUSE
. )
那么如何实现文章所描述的配置呢?
-
Nginx将HTTP请求转发到Unix套接字 .
-
通常,单个Unicorn服务器接受此套接字上的请求并处理它们(足够公平) .
-
在重新部署期间,新的Unicorn服务器开始接受此套接字上的请求并处理它们,而旧服务器仍在运行(如何?)
1 回答
我最好的猜测是第二个服务器在使用相同的套接字文件调用
bind
之前立即调用套接字文件上的unlink
,所以实际上有一个小窗口,没有进程绑定到套接字,连接将被拒绝 .有趣的是,如果我绑定到套接字文件然后立即删除该文件,则实际接受与套接字的下一个连接 . 第二次和后续连接被
ENOENT
拒绝,如预期的那样 . 因此,当一个进程控制另一个进程绑定的套接字时,内核可能会为您提供一些帮助 . (这是在Linux BTW上 . )