两个Unicorn服务器如何绑定到同一个Unix套接字?

时间:2016-11-03 16:15:45

标签: sockets nginx unicorn

这个(相当古老的)article似乎暗示了两个Unicorn主进程 可以绑定到相同的Unix套接字路径:

  

当旧主人收到QUIT时,它会正常开始关闭其工作人员。一旦   所有工人都完成了服务请求,它就死了。我们现在有一个新版本的   应用程序,满载并准备接收请求,没有任何停机时间:新老员工   所有人都共享Unix Domain Socket,因此nginx甚至不必关心过渡。

阅读,我不明白这是怎么可能的。从我的理解,到真正的零 停机时你必须使用SO_REUSEPORT暂时将旧服务器和新服务器绑定到 相同的插座。但SO_REUSEPORTnot supported on Unix sockets。 (我通过绑定到另一台服务器已经在使用的Unix套接字路径来测试它,我得到了 一个EADDRINUSE。)

那么如何实现文章所描述的配置呢?

  • Nginx将HTTP请求转发到Unix套接字。
  • 通常,单个Unicorn服务器接受此套接字上的请求并处理它们(足够公平)。
  • 在重新部署期间,新的Unicorn服务器开始接受此套接字上的请求并处理它们,而旧服务器仍在运行(如何?)

1 个答案:

答案 0 :(得分:1)

我最好的猜测是第二台服务器在使用相同的套接字文件调用https://jenkins_url/api/xml?tree=jobs[name,jobs[name,jobs[name,jobs[name,jobs[name,jobs[name]]]]]] 之前立即调用套接字文件上的unlink,所以实际上有一个小窗口没有进程被绑定到套接字和连接将被拒绝。

有趣的是,如果我绑定到套接字文件然后立即删除该文件,则实际接受与套接字的下一个连接。第二个及后续连接将按预期bind拒绝。因此,当一个进程控制另一个进程绑定的套接字时,内核可能会为您提供一些帮助。 (这是在Linux BTW上。)