Nginx集羣的故障遷移

首先能夠確定的是Nginx在一個tomcat節點徹底宕機的狀況下,是不會再去把請求分發過去的。html

它是由upstream中server的參數決定的nginx

server address [weight=number] [max_fails=number] [fail_timeout=time] [slow_start=time] [backup] [down];web

其中max_fails默認爲1,fail_timeout=time默認爲10s,這兩個參數配置起來使用.含義是:在fail_timeout的時間內,nignx與upstream中某個server的鏈接嘗試失敗了max_fails次,則nginx會認爲該server已經失效。在接下來的 fail_timeout時間內,nginx再也不將請求分發給失效的server。
可是若是我寫一段延遲很是長的模擬代碼會如何呢tomcat

@RestController
public class TestController {

    @GetMapping("/set")
    public String home() throws InterruptedException {
        Thread.sleep(600000);
        return "Two! Yes";
    }
}

其配置端口號爲9090app

配合一段正常代碼server

@RestController
public class TestController {

    @GetMapping("/set")
    public String home() {
        return "One!"+new Date();
    }
}

配置端口號爲8080htm

對Nginx的配置爲io

upstream web_services {
        server       172.18.98.46:9090;
        server       172.18.98.47:8080;
    }class

server {
        listen       8090;
        server_name  localhost;stream

        location ~ /set {
           proxy_pass http://web_services;
        }
        error_page  404              /;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

此時咱們訪問8090端口,Nginx的負載到8080端口時

One!Fri Feb 15 18:10:26 CST 2019

可是當負載到9090端口時,會無響應。

此時咱們須要在nginx增長配置

server {
        listen       8090;
        server_name  localhost;

        location ~ /set {
           proxy_pass http://web_services;
           proxy_connect_timeout       2s;
           proxy_read_timeout          3s;
           proxy_send_timeout          5s;
        }
        error_page  404              /;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

其中proxy_read_timeout 3s指的是當響應超過3秒後,會從新負載到新的Server上去,在咱們這裏就是9090沒法響應,3秒後會負載到8080端口上去,並默認在10秒後纔會從新訪問9090端口,以此循環。固然這些時間能夠根據實際狀況自由搭配的。

相關文章
相關標籤/搜索