在AF_UNIX上的HTTP:连接到Unix套接字的HTTP。

28
我们有一个HTTP服务器,并且有基于Linux的HTTP客户端应用程序运行良好。但是现在我们需要从客户端应用程序监听Unix域套接字。那么是否可以通过Unix域套接字发送/接收http请求、http响应数据包?
场景1:当连接到本地主机时,需要通过将HTTP连接到Unix套接字而不是HTTPS连接到本地端口来消除SSL开销。
基本上是要寻找一种标准编码方法,将Unix套接字路径编码为HTTP URL。谢谢。
1个回答

24
只要您的套接字是流套接字(`SOCK_STREAM`而不是`SOCK_DGRAM`),那么从技术上讲是可能的。HTTP中没有要求TCP/IP,只需要一个可靠的双向流。
但我从未见过能够连接到这种套接字的HTTP客户端。我不知道任何适用的URL格式,如果您确实需要使用URL与服务器通信。
此外,请注意,一些正常的Web服务器依赖于一些东西(例如`getpeername()`,以标识客户端),当您不使用TCP/IP时,这些东西就毫无意义了。
编辑:我刚看到您有关将“localhost”映射到UNIX套接字的编辑。这是完全可行的,您只需要确保客户端知道如何找到应该使用的UNIX套接字的路径,而不是连接到127.0.0.1:xxx

4
据我所知(我已经查过了),HTTP没有定义URL方案可以允许您指定套接字路径而不是主机名。我知道一些应用程序(例如MySQL)采用的方法是将“localhost”简单转换为使用UNIX套接字而不是TCP/IP。 - Alnitak
28
现在Curl和Go都支持这个功能,例如在最近的curl上,执行curl -v --unix-socket /var/run/docker.sock http:/containers/json将会通过Unix Socket与Docker通信,而Docker有一个基于Go语言的实现。 - Justin Cormack
5
在Python中,存在用于此目的的库requests-unixsocket,使用非标准方案http+unix://%2Fpath%2Fto%2Fsocket/url-path - Jean Hominal
@Alnitak 我意识到这是一个旧的答案,但是我想提一下:反向代理设置通常使用Unix套接字,以避免浪费TCP端口,并且在资源使用和性能方面更低。例如,Nginx和Apache可以将HTTP请求代理到本地的Unix套接字上,另一个Nginx、Apache、PHP或其他服务正在监听该套接字。事实上,我公司的大多数内部Web应用程序在Linux服务器上都使用了这种设置。 - dodexahedron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接