gpt4 book ai didi

c- Loadbalancer.拼接时修改http header?

转载 作者:行者123 更新时间:2023-11-30 17:29:48 26 4
gpt4 key购买 nike

更新:

我编辑了我的问题,使其更加关注问题。

上下文

编写代码以了解负载平衡的工作原理。Debian 64 位。

127.0.0.1:36001 上的负载均衡器后端位于 127.0.0.1:36000

curl 调用负载均衡器 (36001)。

问题

我用这段代码创建了我的套接字 socket code

我创建了一个非常简单的负载均衡器,一个服务器,并且我向负载均衡器发出了一个curl请求。我的问题是,我不明白如何在拼接时将客户端端口/ip传递给后端到anwser直接进行curl。

代码

curl 请求

curl localhost:36001 -d“致敬”

负载均衡器

        static int pool_of_conn[2],
pool_of_pipes[2][2];
int sentinel , efd;
struct epoll_event event;
struct epoll_event *events;
...

off64_t offset = 0;

pipe(pool_of_pipes[0]);

/* This splice works but sends the loadbalancer ip and port. How to put the client's here ? How to alter events[i].data.fd ? */
bytes = splice(events[i].data.fd, NULL, pool_of_pipes[0][1], NULL, 4096, SPLICE_F_MOVE);
if (bytes == 0)
break;
splice(pool_of_pipes[0][0], NULL, pool_of_conn[0], NULL, bytes, SPLICE_F_MOVE);

你能帮我一下吗?

最佳答案

您的问题的根本问题是 HTTP 通过 TCP,这是一种面向连接的协议(protocol)。因此,即使您可以使到后端的连接看起来来自客户端 IP 地址,负载均衡器和后端之间也会建立 TCP 连接。因此返回的 TCP 数据包也使用该连接。为了以某种方式解决这个问题,您需要 HTTP 使用不同的 TCP 连接来进行请求和回复,并操纵本地 IP 路由的行为,以便后端回复仍然发送到实际的客户端。

如果您的目的是创建一个 HTTP 负载均衡器,那么最简单的解决方案可能位于应用程序协议(protocol)(即 HTTP)级别。您可以使用 HTTP 重定向或更复杂的方法,例如在转发之前将客户端请求包装在某些 header 中。我确信现有的 HTTP 负载均衡器提供了大量的示例和想法。

也就是说,如果您想在 TCP 连接级别上解决这个问题,对应用程序协议(protocol)透明,这是可行的,但它确实需要相当多的额外代码。此外,后端回复仍然通过负载均衡器。我的建议是查看 IP 选项 IP_TRANSPARENT 。当连接到后端时,它将允许您的负载均衡器使用客户端 IP 地址作为源。 (请注意,返回流量也会经过负载均衡器,因此您的 splice() 会派上用场)

这是一个关于IP_TRANSPARENT的老问题Transparent proxying - how to pass socket to local server without modification?

这是它的 Linux 内核文档 https://www.kernel.org/doc/Documentation/networking/tproxy.txt

关于c- Loadbalancer.拼接时修改http header?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com