
Я использую HAProxy для балансировки нагрузки нескольких веб-серверов (режим HTTP). Веб-серверы строго динамические, т.е. нет никакого статического контента, только веб-сервисы.
URL-адреса типа (аналогичные)
http://192.168.5.10:8080/small
http://192.168.5.10:8080/medium
http://192.168.5.10:8080/large
Теперь, когда я настраиваю HAProxy для пересылки входящих запросов на эти 3 URL-адреса на нескольких машинах, я указываю url_path с помощью acl
и path_end
/ 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
Возможно ли отправить запрос с HAProxy на web_server с url_path?.
Если HAProxy получает его как http://192.168.5.2:80/small
, то отправляет запрос на веб-сервер какhttp://192.168.5.10:8080/small
решение1
Поскольку ваш путь содержится в начале URL, почему бы не использовать path_beg? Рекомендуется использовать path_end для расширений имен файлов.
acl is_small путь_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
опции, см.документациядля получения подробной информации.