使用 HAProxy 的动态后端

Jez*_*Jez 5 proxy dynamic haproxy

我试图找出处理 HTTP 请求动态代理的最佳方法。

基本上,我想以 的形式获取动态主机名myname.cust.mydomain.example,然后将请求转发到 HTTP 后端服务器,名称为“myname”,取自主机名。

我一直在绞尽脑汁想找出处理这个问题的最佳方法,以及 HAProxy 是否能胜任这项任务。

我正在考虑的另一个选择是带有 LUA 甚至 Nginx 的 Lighttpd。

Mik*_*kko 12

foo.cust.mydomain.example正如 womble 建议的那样,最简单的解决方案是使用 DNS 映射到特定的服务器 IP。这将跳过整个代理服务器。也许这对您来说是不可能的,例如,如果您没有后端服务器的公共 IP 地址。

将所有请求定向到一台服务器(使用通配符 DNS),然后根据 Host 标头动态转发请求有点复杂,而且 HAProxy 似乎无法做到这一点,因为必须在 HAProxy 配置中明确定义每个后端服务器。

然而,Nginx 是不同的,通过正确的配置 Nginx 可以使用 Host 头来选择后端。当然,Nginx 需要一个将名称映射到后端地址的 DNS 服务器。

这是配置的一个小例子:

server {
    listen 80 default;

    location / {
        # You might need to send some headers to the backend server
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;

        resolver 192.0.2.1; # DNS server IP
        # Forward all requests to the backend server using $http_host
        # (this is the 'Host:' header value)
        proxy_pass http://$http_host$request_uri;
    }
}
Run Code Online (Sandbox Code Playgroud)

这重定向http://myserver.cust.mydomain.example/foo/http://myserver.cust.mydomain.example/foo/. 乍一看似乎不是很有帮助。但是,如果您设置了将这些名称映射到后端服务器地址的私有 DNS 服务器,则请求实际上会被转发到私有地址上的正确后端服务器。

但是,这种 DNS 服务器设置可能不受欢迎,并且在某些情况下可能会导致问题。因此,通过对 Nginx 配置进行一些添加,我们可以采取另一种方法:

location / {
    # headers...

    resolver 192.0.2.1;

    # A regex to get the first part (hostname) from the Host header
    if ($http_host ~* "([a-z0-9-]+)(\.[a-z0-9-]+)*") {
        # Save a captured part from the regex to a variable
        set $redirect_hostname $1;
        # Pass the request to a desired backend
        proxy_pass   http://$redirect_hostname.private.mydomain.example$request_uri;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在重定向从http://myserver.cust.mydomain.example/foo/http://myserver.private.mydomain.example/foo/。DNS 服务器可以保存不同域下的私有地址,并且proxy_pass可以修改指令以匹配所需的名称服务器配置。

我仍然认为这种代理可能不是解决整个问题的最简单方法,但毕竟是一种可能性。如果这有任何帮助,我很高兴。

参考资料:Nginx Wiki,尤其是HttpProxyModuleHttpRewriteModule