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,尤其是HttpProxyModule和HttpRewriteModule
归档时间: |
|
查看次数: |
5386 次 |
最近记录: |