Configuration

重定向埠的 haproxy NOSRV 問題

  • August 29, 2019

我試圖在一個埠 (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 }

引用自:https://serverfault.com/questions/867973