Я использую 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
Поскольку ваш путь содержится в начале 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
Путь 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
вариант, см. документация для подробностей.