Configuration
重定向埠的 haproxy NOSRV 問題
我試圖在一個埠 (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。
沒有要使用的預設後端,僅當 host_rest ACL 有效時才使用 rest_cluster 。
因此,任何帶有與“mypublicserver.myhost.com”不匹配的 HOST 標頭的請求都不會被路由到任何後端,這會導致 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 }