From 2564dd4b7f35caa728cc7036b8e8fc90b02f099b Mon Sep 17 00:00:00 2001 From: Masahiro Nakagawa Date: Tue, 21 Jan 2020 14:36:38 +0900 Subject: [PATCH] socket_manager_unix: Support REUSEPORT option via envvar --- lib/serverengine/socket_manager_unix.rb | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/serverengine/socket_manager_unix.rb b/lib/serverengine/socket_manager_unix.rb index 4498a44..625a831 100644 --- a/lib/serverengine/socket_manager_unix.rb +++ b/lib/serverengine/socket_manager_unix.rb @@ -50,11 +50,23 @@ module ServerModule private def listen_tcp_new(bind_ip, port) - # TCPServer.new doesn't set IPV6_V6ONLY flag, so use Addrinfo class instead. - # TODO: make backlog configurable if necessary - tsock = Addrinfo.tcp(bind_ip.to_s, port).listen(::Socket::SOMAXCONN) - tsock.autoclose = false - TCPServer.for_fd(tsock.fileno) + if ENV['SERVERENGINE_USE_SOCKET_REUSEPORT'] == '1' + # Based on Addrinfo#listen + tsock = Socket.new(bind_ip.ipv6? ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0) + tsock.ipv6only! if bind_ip.ipv6? + tsock.setsockopt(:SOCKET, :REUSEPORT, true) + tsock.setsockopt(:SOCKET, :REUSEADDR, true) + tsock.bind(Addrinfo.tcp(bind_ip.to_s, port)) + tsock.listen(::Socket::SOMAXCONN) + tsock.autoclose = false + TCPServer.for_fd(tsock.fileno) + else + # TCPServer.new doesn't set IPV6_V6ONLY flag, so use Addrinfo class instead. + # TODO: make backlog configurable if necessary + tsock = Addrinfo.tcp(bind_ip.to_s, port).listen(::Socket::SOMAXCONN) + tsock.autoclose = false + TCPServer.for_fd(tsock.fileno) + end end def listen_udp_new(bind_ip, port)