[轉]Nginx主動式後端服務器健康檢查配置

環境:

SpringCloud微服務(eureka註冊中心);
nginx作爲負載均衡;

場景:

Nginx -> A服務
當流量高峯期時,kill A服務
A服務還沒有掛掉,但是註冊中心狀態爲OUT_OF_SERVICE,但是服務在Nginx的upstream中。
Nginx的流量還是會到達A服務,但是A服務Fegin接口調用其他服務時,會出現異常情況。

解決方案:

Nginx主動式調用服務器端的接口(自定義的監控檢查接口)。
自定義檢查接口:查詢Eureka的狀態,若狀態不是up狀態,那麼返回500異常。
Nginx收到500異常後,自動將ip:port在upstream中摘除。

代碼實現:
@RestController
@Slf4j
public class HealthController {

    @Autowired
    private EurekaClient eurekaClient;

    @RequestMapping(value = "/health/check/status", method = {RequestMethod.HEAD, RequestMethod.GET})
    public boolean checkStatus(HttpServletResponse response) {
        try {
            InstanceInfo.InstanceStatus instanceRemoteStatus = eurekaClient.getInstanceRemoteStatus();
            boolean up = InstanceInfo.InstanceStatus.UP.equals(instanceRemoteStatus);
            //設置http的響應碼
            if (!up) {
                response.setStatus(500);
            }
            return up;
        } catch (Exception e) {
            return true;
        }
    }
}
Nginx配置:
upstream student-service-api {
    server 172.26.34.101:9050;
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "HEAD /health/check/status HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}
  1. interval表示每隔3000毫秒向後端發送健康檢查包;
  2. rise表示如果連續成功次數達到2 服務器就被認爲是up;
  3. fail表示如果連續失敗次數達到5 服務器就被認爲是down;
  4. timeout表示後端健康請求的超時時間是1000毫秒;
  5. type表示發送的健康檢查包是http請求;
  6. check_http_send 表示http健康檢查包發送的請求內容。爲了減少傳輸數據量,推薦採用“head”方法;
  7. check_http_expect_alive 指定HTTP回覆的成功狀態,默認認爲2XX和3XX的狀態是健康的;
配置location,查看服務器的健康狀態
location ~* /status {
    check_status;
    access_log   off;
}

原文:https://www.jianshu.com/p/beb9d8d26464
參考:Nginx實戰系列之功能篇----後端節點健康檢查

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章