Я пытаюсь поймать HTTP-трафик на одном порту (8080) и перенаправить его на внутренний порт (12345). В моем haproxy.cfg есть следующее
frontend rest_front
bind *:8080
#reqadd X-Forwarded-Proto:\ http
#reqadd X-Forwarded-Port:\ 12345
acl host_rest hdr(host) -i mypublicserver.myhost.com
stats uri /haproxy?stats
acl url_blog path_beg /blog
# figure out which one to use
use_backend rest_cluster if host_rest
backend rest_cluster
server rest_server_host myinternalserver.myotherhost.com:12345 check
Когда я проверяю соединение с mypublicserver.myhost.com, я вижу в файле журнала следующее ...
Aug 10 14:18:35 myproxy haproxy[30258]: <IP_ADDRESS>:56779 [10/Aug/2017:14:18:35.309] rest_front rest_front/<NOSRV> -1/-1/-1/-1/2 503 213 - - SC-- 1/0/0/0/0 0/0 "GET /somepage.html HTTP/1.1"
Я не могу понять, почему задняя часть не поражена. Я использую URL http://mypublicserver.myhost.com:8080/somepage.html который должен запускать acl.
Бэкэнд по умолчанию не используется и rest_cluster используется только тогда, когда ACL host_rest действителен.
Таким образом, любой запрос с заголовком HOST, не совпадающим с mypublicserver.myhost.com, не будет перенаправлен на какой-либо сервер, и это приведет к ошибке 503.
Итак, вы можете добавить default_backend директиву или удалите / отредактируйте ACL.
РЕДАКТИРОВАТЬ: если ACL не соответствует, это потому, что отсутствует часть порта: 8080
Попробуйте:
acl host_rest hdr(host) -i mypublicserver.myhost.com:8080
Я столкнулся с аналогичной проблемой и получил ошибку 503 с аналогичной строкой в файле журнала. Спасибо @MoEmEn, я разрешаю это.
Главное в ответе "ACL не соответствует этому, потому что в нем отсутствует часть порта"
Лучше всего для меня было написать правило, в котором url может содержать порт или нет. Итак, это мое правило для HAproxy:
use_backend host_rest if { req.hdr(Host),regsub(:[0-9]+$,) -i mypublicserver.myhost.com }
в моем случае проблема заключалась в том, что я использовал SSL-Passthrough, однако acl hdr (host) не работает с проходом, потому что ему нужно завершить запрос для расшифровки заголовков. поэтому я решил использовать SSL-Termination, а затем сделать SSL-запрос к внутренним серверам.
ссылка : https://discourse.haproxy.org/t/haproxy-not-switching-between-backends/1903/15
для меня мне пришлось отключить HTTP-проверку, так как мой сайт возвращает ошибку 404, а haproxy думает, что она не работает