我有一个旧的遗留应用程序,我正尝试让它与我们半现代的网络一起工作。此应用程序以 HTTP 请求的形式发送日志消息(每个请求一个日志),但通过单个 TCP 连接发送。如果该 TCP 连接中断,日志就会变得混乱,因为没有队列。
我决定使用 socat 尝试保持 TCP 会话打开,同时分解另一端的 HTTP 请求以进行进一步处理。我有类似这样的内容:
socat tcp-listen:8888 tcp-connect:logserver:80
问题是,当监听“logserver”的 Web 服务器接受来自 socat 的 HTTP 连接时,它会拆除其 TCP 连接,这会导致 socat 拆除应用服务器想要打开的监听套接字。
当 socat 发生故障时,如何让它重新连接到上游,然后继续从侦听器推送数据?
我尝试在监听端使用“fork”,但仍然会断开连接。我差点想在 tcp-connect 端添加“fork”,但似乎不允许。
答案1
摘自 socat 手册页的顶部:“当其中一个流有效达到 EOF 时,关闭阶段开始。Socat 将 EOF 条件转移到另一个流 (…)”。查找“EOF”以找到更多这方面的有用提示。
因此,如果您希望 socat 继续保持监听功能,请添加fork,reuseaddr
。
如果日志服务器不能可靠地应答,您可以让 socat 使用例如重试连接retry,interval=.2,forever
。
socat tcp-listen:8888,fork,reuseaddr tcp-connect:logserver:80,retry,interval=.2,forever
我还喜欢socat -d -d -d
在尝试使它们正常工作时运行 socat 来调试。
答案2
我不明白您要解决的问题:logserver 是否无法处理多请求连接(并且应用程序仍然违反 HTTP 标准使用它们)?下面我假设有某种原因需要代理在客户端支持多请求连接,并在服务器端将它们转发为单请求连接。
无论如何,使用不支持 HTTP 的代理执行您想要执行的操作充其量是脆弱的:在 HTTP 标头中明确指定请求后保持连接打开的意图,因此简单地拆分请求并不是真正正确的,即使在不了解 HTTP 的情况下也很容易做到。我建议在其位置放置一个标准的 http 反向代理(例如 nginx)并正确配置它。