nginx upstream 이상

6036 단어
이상 하 다
upstream server temporarily disabled while connecting to upstream
no live upstreams while connecting to upstream
max_fails 와 failtimeout
max_fails 기본 값 은 1, failtimeout 기본 값 은 10 초 입 니 다.
nginx 는 max 설정 을 통 해fails (최대 시도 실패 횟수) 와 failtimeout (실효 시간, 최대 시도 실패 횟수 에 도달 한 후 fail timeout 의 시간 범위 내 에서 노드 는 실효 로 설정 되 었 습 니 다. 모든 노드 가 효력 을 잃 지 않 는 한 이 시간 내 에 노드 는 회복 하지 않 습 니 다) 노드 가 실패 한 시도 횟수 와 실효 시간 을 설정 합 니 다. 최대 시도 횟수 를 초과 하거나 실효 시간 이 설정 의 실효 시간 을 초과 하지 않 으 면nginx 는 노드 모양 을 실효 상태 로 설정 하고 nginx 는 이 백 엔 드 를 연결 하지 않 습 니 다. 실효 시간 을 초과 하거나 모든 노드 가 효력 을 잃 을 때 까지 이 노드 를 다시 유효 하 게 설정 하고 다시 탐지 합 니 다.
upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

fail 의 표준
예 를 들 면
connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: , request: "POST /demo HTTP/1.1", subrequest: "/capture/getstatus", upstream: "http://192.168.99.100:8080/api/demo/

예 를 들 면
upstream timed out (110: Connection timed out) while reading response header from upstream

Nginx 기본 판단 실패 노드 상 태 는 connect refect 와 time out 상 태 를 기준 으로 HTTP 오류 상태 로 판단 하지 않 습 니 다. HTTP 가 상태 로 돌아 갈 수만 있다 면 이 노드 가 정상적으로 연결 할 수 있 기 때문에 nginx 는 생존 상태 인지 판단 합 니 다.proxy 를 추가 하지 않 는 한next_upstream 명령 설정 은 404, 502, 503, 504, 500, time out 등 오 류 를 준비 장치 로 옮 겨 처리 합 니 다. nextupstream 과정 에서 fails 를 누적 합 니 다. 예비 기기 처리 가 잘못 되 었 다 면 오류 정 보 를 직접 되 돌려 줍 니 다 (그러나 404 는 오류 수 를 기록 하지 않 고 오류 상 태 를 설정 하지 않 으 면 오류 상태 기록 을 하지 않 습 니 다). 종합 적 으로 보면 nginx 기록 오류 수량 은 timeout, connect refect, 502, 500, 503, 504 등 6 가지 상태 만 기록 합 니 다.timeout 과 connect refuse 는 오류 가 영원히 기록 되 어 있 으 며 502, 500, 503, 504 는 proxy 만 설정 되 어 있 습 니 다.next_upstream 후 nginx 는 이 4 가지 HTTP 오 류 를 fails 에 기록 할 수 있 습 니 다. fails 가 max 보다 크 면fails 시 이 노드 가 실 효 됩 니 다.
탐측 메커니즘
만약 에 모든 노드 가 효력 을 잃 고 예비 기기 도 효력 을 잃 을 때 nginx 는 모든 노드 를 효과 적 으로 회복 하고 효과 적 인 노드 를 다시 탐색 하려 고 시도 합 니 다. 만약 에 효과 적 인 노드 를 감지 하면 정확 한 노드 내용 을 되 돌려 줍 니 다. 만약 에 모든 오류 가 있 으 면 계속 탐색 합 니 다. 정확 한 정보 가 없 을 때 노드 가 효력 을 잃 을 때 기본 적 인 반환 상 태 는 502 입 니 다.그러나 다음 에 노드 를 방문 할 때 정확 한 노드 를 찾 을 때 까지 계속 탐지 합 니 다.
실험 로그
upstream test_server{
        server 192.168.99.100:80801;
        server 192.168.99.100:80802;
        server 192.168.99.100:80803;
    }
##for capture
location /api/test/demo{
            proxy_pass http://test_server/api/demo;
}    
location /api/demo{
            default_type application/json;
            content_by_lua_file conf/lua/demo.lua;
}

lua
local cjson = require "cjson.safe"
testres = ngx.location.capture("/api/test/demo",{
    method= ngx.HTTP_POST,
    body = "arg1=xxxx&arg2=xxxxx"
})
ngx.log(ngx.ERR,"status"..testres.status)
local testbody = cjson.decode(testres.body)
ngx.log(ngx.ERR,testbody==nil)

192.168.9.9.100: 8080 / api / demo 를 요청 합 니 다. 안에 있 는 lua 는 capture, 요청 / api / test / demo 를 시작 합 니 다.
한 번 부탁 하 다
2017/02/09 14:48:57 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80801/api/demo", host: "192.168.99.100:8080"
2017/02/09 14:48:57 [warn] 5#5: *1 upstream server temporarily disabled while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80801/api/demo", host: "192.168.99.100:8080"
2017/02/09 14:48:57 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80802/api/demo", host: "192.168.99.100:8080"
2017/02/09 14:48:57 [warn] 5#5: *1 upstream server temporarily disabled while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80802/api/demo", host: "192.168.99.100:8080"
2017/02/09 14:48:57 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80803/api/demo", host: "192.168.99.100:8080"
2017/02/09 14:48:57 [warn] 5#5: *1 upstream server temporarily disabled while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://192.168.99.100:80803/api/demo", host: "192.168.99.100:8080"
2017/02/09 14:48:57 [error] 5#5: *1 [lua] demo.lua:44: status502 while sending to client, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", host: "192.168.99.100:8080"

upstream 에 대한 요청 이 실 패 했 을 때 capture 의 subrequest 는 502 로 되 돌아 갑 니 다. client 에 대한 status code 는 lua 스 크 립 트 에 달 려 있 습 니 다.
다시 한 번 부탁 하 다
2017/02/09 15:09:34 [error] 6#6: *11 no live upstreams while connecting to upstream, client: 192.168.99.1, server: , request: "POST /api/demo HTTP/1.1", subrequest: "/api/test/demo", upstream: "http://test_server/api/demo", host: "192.168.99.100:8080"

이 upstream 아래 server 가 모두 끊 긴 상태 에서 no live upstreams while connecting to upstream 이 나타 납 니 다.
doc
  • ngx_http_upstream_module
  • nginx 에서 건강 검진 (health check) 메커니즘 깊이 분석
  • nginx upstream 용 착 메커니즘 오리지널 - 호 지 광
  • 온라인 nginx 의 'no live upstreams while connecting to upstream' 분석
  • 좋은 웹페이지 즐겨찾기