Mic*_*zek 3 linux networking ip tcp not-root-user
我有一个应用程序可以侦听端口上的连接,但我偶尔会将其关闭以进行更新等。我想要一种配置系统的方法,如果该程序正在运行,则对该端口的请求将发送到该应用程序,但如果它没有运行,则请求将被定向到某个其他应用程序(可以返回“暂时不可用”)信息)。实现这一目标的最简单方法是什么?
我在目标机器上没有 root 访问权限,所以我宁愿避免像iptables. 我考虑过一个辅助应用程序,它只将连接路由到其他两个应用程序,但我希望有一种更简单的方法
您的问题意味着两个程序将在同一台机器上交替运行,并绑定到同一端口。这是一个坏主意。TIME_WAIT如果您尝试这样做,您将遇到(又名 2MSL)问题。这篇文章描述了这个问题。(它以 Windows 为中心,但它所谈论的大部分内容都适用于任何 TCP/IP 堆栈。)
BSD 套接字 API 确实提供了一种方法来破坏这种保护 ( setsockopt(SO_REUSEADDR)),但这不是这样做是合理的情况之一。
相反,以与高可用性人员相同的方式解决问题:在世界和您的“真实”后端服务器之间放置一个反向代理。
在 HTTP 世界中,这个问题的一种流行解决方案是nginx。您可以对其进行配置,以便在后端服务器关闭时,它向客户端提供静态内容。如果您的协议看起来像 HTTP、IMAP 或 POP,也许您可以按原样使用 nginx。如果没有,您可以构建自定义代理服务器。
您可能需要两个 TCP 端口才能工作。代理绑定到公共 IP 上面向公众的端口号。您的后端服务器绑定到辅助端口,仅在本地主机接口上。因此,流量只能通过代理从公共网络到达后端服务器。
如果编写的两个程序都允许,则可以避免将两者绑定到同一个端口。例如,如果您的公共 IP 是1.2.3.4并且您的公共服务端口是2345,2345如果反向代理仅绑定到 IP1.2.3.4而“真实”服务器仅绑定到 ,则两个程序都可以绑定到端口127.0.0.1。如果任一绑定到INADDR_ANY(0.0.0.0) 您需要不同的端口。
这解决了 2MSL 问题,因为您的客户端始终与同一个程序(代理服务器)通信。网络堆栈永远不会对如何处理在 2MSL 时间内扫过的任何杂散数据包感到困惑。
反向代理的一个变体是负载均衡器,它也可以在这里工作。负载均衡器旨在智能地将流量路由到不同的机器。如果您认为您的应用程序有一天可能需要水平扩展,那么这种代理将是有意义的。您会选择一个负载平衡器,当所有正常的应用程序服务器都关闭时,它知道如何将流量发送到一个特殊的“服务关闭”主机。
负载均衡器解决方案变体的主要问题是通用负载均衡器可能盲目地假设它代理的所有后端服务都使用相同的端口号,仅在 IP 上有所不同。不过,您也许可以获得更灵活的负载均衡器,或者为您的共享服务器获得多个 IP。