1つのポート(8080)でhttpトラフィックをキャッチし、それを内部ポート(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はHost_rest ACLが有効な場合にのみ使用されます。
そのため、「mypublicserver.myhost.com」に一致しないホストヘッダーを含むリクエストはバックエンドにルーティングされず、503エラーが発生します。
default_backendディレクティブを追加するか、ACLをドロップ/編集します。
編集:ACLが一致しない場合、これはポート部分がないためです:8080
以下で試してください:
acl Host_rest hdr(Host)-i mypublicserver.myhost.com:8080
私は同様の問題に直面し、ログファイルに同様の文字列で503エラーが発生しました。 @MoEmEnへのThx私はそれを解決します。
回答の主なものは、「ACLが一致しないのは、ポート部分がないためです "
私にとって最良のことは、URLにポートを含めることができるかどうかのルールを記述することでした。これがHAproxyの私のルールです。
use_backend Host_rest if { req.hdr(Host),regsub(:[0-9]+$,) -i mypublicserver.myhost.com }
私の場合、問題はSSLパススルーを使用していたことですが、ヘッダーを復号化するために要求を終了する必要があるため、acl hdr(Host)はパススルーでは機能しません。そこで、SSLターミネーションを使用して、SSLリクエストをバックエンドサーバーに送信することにしました。
参照: https://discourse.haproxy.org/t/haproxy-not-switching-between-backends/1903/15