在Phoenix使用SO_REUSEPORT

rin*_*ter 8 erlang network-programming elixir phoenix-framework

我对零停机部署系统感兴趣,该系统不使用Elixir/Erlang热升级(由于代码运行时数据迁移的复杂性).

我听说我可以在将服务器绑定到适配器时使用SO_REUSEPORT选项,这样我就可以运行绑定到同一地址和端口的同一应用程序的两个实例.我的意图是在与运行版本1相同的服务器上部署版本2,启动版本2,然后优雅地停止版本1,这应该允许传入连接自然地开始专门连接到版本2.

无论这是否与我的计划完全一致 - 我的意图是测试这种配置,因为它知道它在不同的操作系统上的行为不同 - 我想知道配置Phoenix执行此操作所需的具体步骤,因为这似乎更低 - 内部的级别配置:gen_tcp.

或者,如果有一种方法可以配置OS或Erlang VM以默认启用此选项的所有连接,那就更好了.

r_b*_*ack 2

{:raw, protocol, option_num, value_bin}您应该以\n gen_tcp option/raw格式为套接字指定原始 SO_REUSEPORT 标志,并将其传递给底层传输。

\n\n

请注意,mac/linux 的标志是不同的。在你的 config.ex 中:

\n\n
so_reuseport =\n  case :os.type() do\n    {:unix, :linux} -> {:raw, 1, 15, <<1::32-native>>}\n    {:unix, :darwin} -> {:raw, 0xffff, 0x0200, <<1::32-native>>}\n  end\n\nconfig :yourapp, YourApp.Endpoint,\n  http: [port: {:system, "PORT"}, transport_options: [socket_opts: [so_reuseport]]]\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Phoenix 1.4.9 上测试过,但我想旧版本也应该没问题。\n这里是所使用选项的相应文档。

\n\n\n