Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 两个Unicorn服务器如何绑定到同一个Unix套接字?_Sockets_Nginx_Unicorn - Fatal编程技术网

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

Sockets 两个Unicorn服务器如何绑定到同一个Unix套接字?,sockets,nginx,unicorn,Sockets,Nginx,Unicorn,这(相当古老)似乎表明两个Unicorn主进程 可以绑定到相同的Unix套接字路径: 当老主人收到辞职通知时,它开始优雅地关闭它的工人。一旦 所有的工人都完成了服务请求,它就死了。我们现在有了新版本的 应用程序,完全加载,随时可以接收请求,没有任何停机时间:新老员工 所有人都共享Unix域套接字,因此nginx甚至不必关心转换 环顾四周,我不明白这怎么可能。据我所知,真正拥有零 停机您必须使用SO\u REUSEPORT让新旧服务器临时绑定到 同样的插座。但是,重用端口也是如此。 (我通过绑定到

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

当老主人收到辞职通知时,它开始优雅地关闭它的工人。一旦 所有的工人都完成了服务请求,它就死了。我们现在有了新版本的 应用程序,完全加载,随时可以接收请求,没有任何停机时间:新老员工 所有人都共享Unix域套接字,因此nginx甚至不必关心转换

环顾四周,我不明白这怎么可能。据我所知,真正拥有零 停机您必须使用
SO\u REUSEPORT
让新旧服务器临时绑定到 同样的插座。但是,
重用端口也是如此。
(我通过绑定到另一台服务器已经在使用的Unix套接字路径进行了测试,得到了
一个
EADDRINUSE

那么,如何实现本文描述的配置呢

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

我的最佳猜测是,第二个服务器在使用同一个套接字文件调用
bind
之前立即调用套接字文件上的
取消链接,因此实际上有一个小窗口,其中没有进程绑定到套接字,连接将被拒绝

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