使用 haproxy 處理同一 vps 上多個站點的問題

使用 haproxy 處理同一 vps 上多個站點的問題

設定

我有一個VPS正在使用docker的。我目前有3個容器。 1 個用於 haproxy,另外 2 個容器包含各自的網站(在連接埠 8080 上執行 Nodejs http 伺服器)。

我有以下網域和子網域。

  • mydomain.com
  • deus.ex.machina.mydomain.com
  • fela.mydomain.com

我想mydomain.com轉到兩個節點伺服器中的第一個節點伺服器並fela.mydomain.com轉到另一個節點伺服器。第三個網域deus.ex.machina.mydomain.com應該轉到一個不存在的 IP 位址,以模擬伺服器停機,以便我可以確保顯示 503 頁面。

這是我的haproxy.cfg

global
    log 127.0.0.1 local0 notice
    maxconn 2000
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy

defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    retries 3
    option http-server-close
    timeout connect 5000
    timeout client  10000
    timeout server  10000

listen stats
    bind       :1988
    stats uri /

frontend http-in
        bind *:80

        # define hosts
        acl host_deusexmachina  hdr_beg(host) -i deus.ex.machina.mydomain.com
        acl host_fela           hdr_beg(host) -i fela.mydomain.com
        acl host_mydomain       hdr_beg(host) -i mydomain.com

        # figure out which one to use
        use_backend deusexmachina_cluster   if host_deusexmachina
        use_backend fela_cluster            if host_fela
        use_backend mydomain_cluster        if host_mydomain

backend deusexmachina_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server deusexmachina_s1 172.17.0.99:8080 check cookie deusexmachina_s1

backend fela_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server fela_s1 172.17.0.59:8080 check cookie fela_s1

backend mydomain_cluster

        balance roundrobin
        cookie SERVERID insert indirect nocache

        server mydomain_s1 172.17.0.50:8080 check cookie mydomain_s1
  • 172.17.0.50:8080正在工作(連接埠8080上的nodejs)
  • 172.17.0.59:8080正在工作(連接埠8080上的nodejs)
  • 172.17.0.99:8080 不起作用(模擬nodejs下來)

對所有三個的所有請求都來自同一 IP 位址(同一裝置),這就是我擁有option http-server-close.

問題

這就留下了一個問題:有什麼問題嗎?

他們大約 90% 的時間都能正確重定向。

  • 如果我連接到mydomain.com並點擊刷新按鈕 10 次中有 9 次,正確的頁面將顯示(172.17.0.50:8080),第 1 次將顯示 503(就好像它被定向到deus.ex.machina.mydomain.com或可能是伺服器?我不知道如何檢查這個)。

  • fela.mydomain.com點擊刷新按鈕時,十有八九會顯示正確的頁面 (172.17.0.59:8080),其中 1 次會顯示mydomain.com(不是 503 頁)頁 (172.17.0.50:8080)。

  • 當點擊刷新按鈕時也是如此deus.ex.machina.mydomain.com,十有八九會顯示正確的頁面(503 錯誤),其中 1 次會顯示mydomain.com(不是 503 頁)頁面(172.17.0.50:8080)。

添加後,option httpclose重定向到錯誤頁面的幾率會變得更糟(50/50)。

我在同一個 Chrome 瀏覽器的分頁中開啟了所有 3 個網域,我在它們之間切換並刷新它們。

我懷疑 haproxy 混淆了請求?也許快取 ip 請求應該發送到哪個後端?如所見,我使用的 cookie 應該將請求定向到正確的伺服器(我已經檢查了客戶端 cookie,它們都是按順序排列的)。我已經這樣做了幾個小時了,我真的不知道還能嘗試什麼。

相關內容