我正在使用 HAProxy 对几个 Web 服务器进行负载平衡(HTTP 模式)。Web 服务器是严格动态的,即没有任何静态内容,只有 Web 服务。
以下类型的 URL(类似)
http://192.168.5.10:8080/small
http://192.168.5.10:8080/medium
http://192.168.5.10:8080/large
acl
现在,当我配置 HAProxy 将传入请求转发到几台机器上的这 3 个 URL 时,我使用and path_end
/指定 url_path path_beg
,但在发出请求时出现Not Found on Accelerator
错误,这使得查明问题变得更加困难。
以下是我正在使用的配置。此外,它没有记录任何错误。
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 10000
srvtimeout 10000
frontend http_proxy
bind 192.168.5.9:8888
acl is_small path_end -i small
acl is_medium path_end -i medium
acl is_large path_end -i large
use_backend web_server_small if is_small
use_backend web_server_medium if is_medium
use_backend web_server_large if is_large
backend web_server_small
mode http
balance roundrobin
option httpclose
server web_1 192.168.5.10:8080 check
server web_2 192.168.5.11:8080 check
backend web_server_medium
mode http
balance roundrobin
option httpclose
server web_1 192.168.5.12:8080 check
server web_2 192.168.5.13:8080 check
backend web_server_large
mode http
balance roundrobin
option httpclose
server web_1 192.168.5.14:8080 check
server web_2 192.168.5.15:8080 check
是否可以使用 url_path 将请求从 HAProxy 发送到 web_server?
如果 HAProxy 收到如下内容http://192.168.5.2:80/small
,则将请求发送至 Web 服务器:http://192.168.5.10:8080/small
答案1
由于您的路径包含在 URL 的开头,为什么不使用 path_beg,建议将 path_end 用于文件扩展名。
acl is_small path_beg -i /small acl is_medium path_beg -i /medium acl is_large path_beg -i /large
答案2
HTTP 请求的路径是总是交给后端服务器,即
GET /small HTTP/1.1
将在 HAproxy 后面显示为该请求。如果您怀疑该请求以某种方式被截断为
GET / HTTP/1.1
在 HAproxy 后面的服务器上,你应该使用以下方法检查
tcpdump -i any port 8080 -As1024 | grep GET
在该服务器上并观察入站GET
请求。
我大胆假设你希望 HAproxy插入URI 前面的内容,例如
server web_1 192.168.5.14:8080/my/path check
会将 的请求转换/small
为 的请求/my/path/small
。这可以通过使用选项来实现reqrep
,请参阅文档了解详情。