Назад | Перейти на главную страницу

проблема haproxy NOSRV с перенаправленным портом

Я пытаюсь поймать 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 думает, что она не работает