
Estoy usando HAProxy para equilibrar la carga de un par de servidores web (modo HTTP). Los servidores web son estrictamente dinámicos, es decir, no hay ningún contenido estático, sólo servicios web.
Las URL del tipo (análogas)
http://192.168.5.10:8080/small
http://192.168.5.10:8080/medium
http://192.168.5.10:8080/large
Ahora, cuando configuro HAProxy para reenviar las solicitudes entrantes a estas 3 URL en un par de máquinas, estoy especificando url_path usando acl
y path_end
/ path_beg
, pero al realizar la solicitud aparece Not Found on Accelerator
un error, lo que hace que sea más difícil identificar el problema.
A continuación se muestra la configuración que estoy usando. Además, no registra ningún error.
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
¿Es posible enviar la solicitud desde HAProxy al servidor web con la ruta_url?
Si HAProxy lo recibe como http://192.168.5.2:80/small
, envíe la solicitud al servidor web comohttp://192.168.5.10:8080/small
Respuesta1
Como su ruta está contenida al inicio de la URL, ¿por qué no usar path_beg? El uso recomendado para path_end es para extensiones de nombres de archivos.
acl is_small ruta_comienzo -i /small acl is_medium ruta_comienzo -i /medio acl es_grande ruta_inicio -i /grande
Respuesta2
La ruta de una solicitud HTTP essiempreentregado al servidor backend, es decir
GET /small HTTP/1.1
será visible detrás de HAproxy solo como esa solicitud. Si sospecha que esto de alguna manera está truncado a
GET / HTTP/1.1
en el servidor detrás de HAproxy, debe verificar esto usando
tcpdump -i any port 8080 -As1024 | grep GET
en ese servidor y observe las GET
solicitudes entrantes.
Me estoy arriesgando y asumo que esperas que HAproxyinsertaralgo en frente del URI, como
server web_1 192.168.5.14:8080/my/path check
convertiría una solicitud de /small
en una solicitud de /my/path/small
. Esto se puede lograr usando la reqrep
opción, consulte ladocumentaciónpara detalles.