【问题标题】:How can two Unicorn servers bind to the same Unix socket?两个 Unicorn 服务器如何绑定到同一个 Unix 套接字?
【发布时间】:2016-11-03 16:15:44
【问题描述】:

这个(相当老的)article 似乎表明两个独角兽主进程 可以绑定到同一个 Unix 套接字路径:

当旧的 master 收到 QUIT 时,它开始优雅地关闭它的 worker。一次 所有的工人都完成了服务请求,它死了。我们现在有一个新版本的 应用程序,完全加载并准备好接收请求,没有任何停机时间:新旧工人 都共享 Unix 域套接字,因此 nginx 甚至不必关心转换。

四处阅读,我不明白这怎么可能。据我了解,真正做到零 停机时间你必须使用SO_REUSEPORT让新旧服务器临时绑定到 同一个插座。但是SO_REUSEPORTnot supported on Unix sockets。 (我通过绑定到已被另一台服务器使用的 Unix 套接字路径对此进行了测试,我得到了 一个EADDRINUSE。)

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

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

【问题讨论】:

    标签: sockets nginx unicorn


    【解决方案1】:

    我最好的猜测是第二台服务器在使用相同的套接字文件调用bind之前立即在套接字文件上调用unlink,所以实际上有一个小窗口,没有进程绑定到套接字和连接会被拒绝。

    有趣的是,如果我绑定到一个套接字文件然后立即删除该文件,那么到该套接字的下一个连接实际上会被接受。第二个和后续连接按预期被ENOENT 拒绝。因此,当一个进程正在控制由另一个进程绑定的套接字时,内核可能会为您提供一些帮助。 (顺便说一句,这是在 Linux 上。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多