我正在尝试找出处理 HTTP 请求动态代理的最佳方法。
基本上,我想采用动态主机名的形式myname.cust.mydomain.example
,然后将请求转发到从主机名中获取名称为“myname”的 HTTP 后端服务器。
我一直在绞尽脑汁试图找出处理这个问题的最佳方法,以及 HAProxy 是否能胜任这项任务。
我正在考虑的另一个选择是像 Lighttpd 和 LUA 甚至 Nginx 之类的东西。
答案1
最简单的解决方案是使用 DNS 映射foo.cust.mydomain.example
到特定服务器 IP,正如 womble 所建议的那样。这将跳过整个代理服务器。也许这对您来说是不可能的,例如如果您没有后端服务器的公共 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;
}
}
这会重定向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;
}
}
现在重定向从 变为http://myserver.cust.mydomain.example/foo/
。http://myserver.private.mydomain.example/foo/
DNS 服务器可以保存不同域下的私有地址,并且proxy_pass
可以修改指令以匹配所需的名称服务器配置。
我仍然认为这种代理可能不是解决整个问题的最简单方法,但这毕竟是一种可能性。如果这能有所帮助,我会很高兴。