![](/img/trans.png)
[英]Getting Error 522 with CloudFlare + AWS Application LoadBalancer
[英]HAProxy and AWS loadBalancer - 503 error
我們最近將我們的主要 Web 應用程序(在具有自動縮放功能的負載均衡器后面的 https 中的 EC2 上運行)拆分為兩個單獨的 Web 模塊。
主要基礎設施現在有一個負載均衡器和一個用於主模塊的 n-server ( main.elasticbeanstalk.com ) 和一個帶有 n-server 的負載均衡器用於輔助模塊 ( secondary.elasticbeanstalk.com )
我們創建了一個 HAproxy 專用實例,該實例由域 www.mycompany.com 解析並代理請求,如下所示:
- ://www.mycompany.com/ fancymodule - > secondary.elasticbeanstalk.com
-://www.mycompany.com/ -> main.elasticbeanstalk.com
我們將其投入生產,大約 12小時后.. http://www.mycompany.com/fancymodule開始獲得 503 服務不可用。 如果我手動重新啟動 HAproxy,一切都會開始正常運行。
我設法復制了更新與 secondary.elasticbeanstalk.com 關聯的 IP 地址的問題(即:從負載均衡器轉換為單個實例)。
似乎 HAproxy 沒有更新解析到 secondary.elasticbeanstalk.com 的 dns,因此它卡住了舊 IP,無法正確訪問 Web 服務器。
而且停機時間不短! 在我重新啟動服務之前,它無法正確路由!
負載均衡器是否有可能在 elasticIp 中與新的 ipaddress 相關聯,因此不再可訪問?
有人可以看看這個配置並告訴我我是否在做一些愚蠢的事情嗎?
global
log 127.0.0.1:514 local2 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
tune.ssl.default-dh-param 2048
defaults
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
mode http
option httplog
frontend mydomain
log global
bind *:80
bind *:443 ssl crt /etc/ssl/certificate.pem
acl isSsl ssl_fc
redirect scheme https if !isSsl
option dontlog-normal
mode http
acl secondaryDomain url_beg /fancymodule
acl liveDomain hdr_end(Host) -i www.mycompany.com
use_backend live_secondary if secondaryDomain liveDomain
use_backend live_main if liveDomain
default_backend live_main
backend live_main
rspadd Set-Cookie:\ module=main;Path=/
server main main.elasticbeanstalk.com:80
backend live_secondary
rspadd Set-Cookie:\ module=secondary;Path=/
server secondary secondary.elasticbeanstalk.com:80
listen stats :1234
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats
stats auth user:pswd
我發現,為了提高性能,HAproxy 只是在啟動時用實際的 IP 地址替換配置域。 之后沒有進行 dns 解析。
http://www.serverphorums.com/read.php?10,358605 https://serverfault.com/questions/681000/force-haproxy-to-lookup-dns-for-backend-server
因此,解決方案是使用 HAProxy 創建自動縮放負載均衡器,或者使用外部偵聽器在 dns ip 更改上自動重新加載服務
我在 AWS 中部署了后端服務器的設置中遇到了同樣的問題。 在我們的內部網絡中運行的 HAProxy 會突然關閉這個后端服務器,並給出 L7STS/503 檢查結果,而我們的監控正在(直接)訪問后端服務器就好了。 當我們運行 HAProxy 對(LB01 和 LB02)時,LB01 的重新加載立即起作用,后端服務器再次啟動。 在 LB02(不是故意重新加載)上,這個后端服務器仍然關閉。
所有這些似乎都與 AWS LB 的 DNS 更改以及 HAProxy 如何進行 DNS 緩存有關。 默認情況下,HAProxy 在啟動/重新加載時解析所有 DNS 記錄(例如后端)。 這些解析后的 DNS 記錄會保留在 HAProxy 自己的 DNS 緩存中。 因此,您必須重新加載 HAProxy 以更新 DNS 緩存。
另一個無疑更好的解決方案是定義 DNS 服務器和 HAProxy 內部 DNS 緩存 TTL。 這是可能的,因為 HAProxy 版本 1.6 具有如下配置片段:
global
[...]
defaults
[...]
resolvers mydns
nameserver dnsmasq 127.0.0.1:53
nameserver dns1 192.168.1.1:53
nameserver dns2 192.168.1.253:53
hold valid 60s
frontend app-in
bind *:8080
default_backend app-out
backend app-out
server appincloud myawslb.example.com:443 check inter 2s ssl verify none resolvers mydns resolve-prefer ipv4
因此,這樣做是使用以nameserver
開頭的條目定義的 DNS 服務器來定義名為mydns
的 DNS 名稱服務器集。 內部 DNS 緩存應保留 60 秒,由hold valid 60s
秒定義。 在后端服務器的定義中,您現在通過添加resolvers mydns
來引用此 DNS 名稱服務器集。 在此示例中,首選通過添加resolve-prefer ipv4
(默認使用 ipv6)來解析 IPv4 地址。
請注意,為了在后端服務器中使用resolvers
,還必須定義check
。 每當觸發后端服務器檢查時,就會發生 DNS 查找。 在此示例中,定義了check inter 2s
,這意味着 DNS 查找將每 2 秒發生一次。 這將是相當多的查找。 通過將內部hold
緩存設置為 60 秒,您可以限制 DNS 查找次數,直到緩存過期; 最遲在 62 秒后應進行新的 DNS 查找。
從 HAProxy 1.8 版開始,甚至還有一種稱為“DNS 服務發現”的高級可能性,它使用 DNS SRV 記錄。 這些記錄包含多個響應字段,例如優先級、權重等,可以被 HAProxy 解析並相應地更新后端。
更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.