[nginx] upstream 종료 와 keepalive 실현

4959 단어 nginx
  • upstream 요청 종료: 데이터 상호작용 오류, 백 엔 드 가 socket 을 닫 았 을 때 nginx 가 FIN, content - length 데 이 터 를 받 았 습 니 다
  • upstream 이 끝 난 주 함수: ngx_http_upstream_finalize_request()
  • keepalive 메커니즘: nginx 긴 연결
  • 1. upstream finalize
    upstream 요청 종료 3 가지 상황:
  • read (), write () 과정 에서 NGXERROR/NGX_ABORT 는 요청 과정 에서 이상 이 발생 했 음 을 나타 내 며 설정 p->upstream_error = 1;
  • read () 함수 시 백 엔 드 에서 socket 을 닫 고 백 엔 드 시스템 에서 FIN 분 절 을 nginx 로 보 내 며 이 신 호 를 받 으 면 설정 rev->ready = 0p->upstream_eof = 1 을 설정 합 니 다.
  • 정상 적 인 상황 에서 upstream 이 Header 를 받 을 때 content - length 를 기록 한 다음 body 를 받 을 때 p - > length 의 값 을 줄 이 고 모든 body 가 받 았 을 때 p - > length = 0 을 설정 합 니 다 p->upstream_done = 1.

  • 분석 ngx_http_upstream_finalize_request():
  • cleanup 지침 을 제거 합 니 다. upstream 의 앞 단계: create, init, 전송 요청, Headers 를 받 을 때 이상 이 발생 하면 호출 ngx_http_finalize_request() 하고 cleanup () 호출 을 실행 하기 때 문 입 니 다.그래서 여 기 는 먼저 cleanup 지침 을 제거 해 야 합 니 다.
  • u->finalize_request(), 실제 호출 ngx_http_proxy_finalize_request, 아무런 조작 도 없다.
  • u->peer.free(), 실제 호출 'ngxhttp_upstream_keepalive_close_handler () '는 peer 의' 닫 기 '동작 을 수행 합 니 다.
  • peer - > connection 이 비어 있 지 않 으 면 connection 을 닫 습 니 다. 이전 단계 에 keepalive 에서 connection 을 cache 에 넣 은 후에 비어 있 을 수 있 기 때문에 connection 을 닫 지 않 아 도 됩 니 다.
  • ngx_http_send_special() last 로고 가 있 는 특수 buffer 를 설정 하여 데이터 전송 절차 가 이전에 캐 시 되 지 않 은 buffer chain 을 보 내야 한 다 는 것 을 알려 줍 니 다.
  • ngx_http_finalize_request(), 종료 요청
  • 데이터 가 아직 전송 되 지 않 았 다 면 c->buffered 0 이 되 지 않 으 면 write 핸들 을 ngx_http_write 로 설정 하여 데 이 터 를 계속 보 내 겠 다 고 표시 하고 함수 ngx_http_write 에서 ngx_htt_finalize_request() 마지막 으로 실행 하여 재 귀 를 형성한다.
  • 데 이 터 를 보 내 면 이 줄 r->done = 1 까지 직접 합 니 다. 끝 을 표시 하고 client 의 write 핸들 을 닫 습 니 다
  • ngx_http_post_action() 후속 작업 이 없 으 면 실제 집행 이 없다
  • socket 이 닫 히 면 FIN 분 절, 태그 c->read->eof 를 보 내 고 실행 ngx_http_close_request() 을 실행 하여 socket 을 닫 습 니 다.????
  • ngx_http_finalize_connection(), 링크 닫 기
  • 검사 요청 의 인용 계수 기 는 1 과 같 지 않 습 니 다. 여러 동작 이 요청 을 조작 하고 있 습 니까??(생 성 요청 시 ngx_http_create_request() 이 값 은 1 입 니 다.
  • 인용 카운터 가 1 일 때 keepalive 가 시간 을 초과 하 는 지 확인 한 다음 keepalive 요청 을 끝내 고 돌아 갑 니 다.
  • 호출 ngx_http_set_lingering_close(), 기본 lingering 시간 초과 5s
  • 이벤트 읽 기 설정 ngx_http_lingering_close_handler() 클 라 이언 트 가 lingeringtimeout 시간 내 에 어떠한 조작 도 하지 않 으 면 클 라 이언 트 와 의 연결 을 닫 습 니 다. 조작 이 있 으 면 총 시간 lingering 도 있 습 니 다.시간 초과, 그리고 호출 ngx_http_close_request()
  • ngx_shutdown_socket(fd, NGX_WRITE_SHUTDOWN) socket 쓰기 단 을 닫 습 니 다.
  • 호출 ngx_http_lingering_close_handler() 은 요청 로 그 를 인쇄 하고 request 를 방출 합 니 다. ngx_http_free_request() 에서 connection 을 방출 하고 ngx_http_close_connection() 설명 자 를 회수 합 니 다.lingering 메커니즘 은 nginx lingering 참조close, 이와 관련 된 케이스: nginx 의 지연 닫 기 를 알 수 있 습 니 다.




  • 2. upstream keepalive
    nginx 를 upstream 의 keepalive 에 사용 하려 면 proxy http \ \ 1.1 과 덮어 쓰기 connection 을 비 워 야 합 니 다 (nginx 는 기본적으로 close 로 설 정 됩 니 다).
    2.1 데이터 전송
  • ngx_close_socket(fd) nginx 는 먼저 upstream 에 보 낼 데 이 터 를 준비 합 니 다.
  • 호출 ngx_http_proxy_create_request(), 실제 호출 uscf->peer.init() = > ngx_http_upstream_init_keepalive_peer(), 부하 균형 엔진 을 통 해 백 엔 드 서비스 노드 를 얻 습 니 다.
  • 이 서비스 노드 를 연결 할 지 여 부 는 keepalive queue 에서 cache 대기 열 에서 이 노드 를 선형 으로 찾 을 수 있 는 지 에 달 려 있 습 니 다. 찾 으 면 대기 열 에서 이 노드 를 옮 기 고 노드 를 남 은 대기 열 free 에 두 십시오.
  • ngx_http_upstream_init_round_robin_peer() 이 노드 에 데 이 터 를 보 냅 니 다.

  • 2.2 데이터 수신
  • upstream 에서 보 내 온 Header 를 받 고 받 으 면서 Header
  • 를 완전히 받 을 때 까지 분석 합 니 다.
  • nginx 는 즉시 Headers 를 client 에 보 내 고 바디 를 받 으 며 upstream 에서 받 으 면서 client 로 보 냅 니 다. 그러나 여기 밑 에 있 는 것 은 실제 적 으로 buffer 가 살 고 모든 데 이 터 를 받 은 후에 client 에 데 이 터 를 보 냅 니 다.
  • 그 중에서 p - > length 는 수신 할 데이터 의 길 이 를 기록 했다 (header 를 분석 할 때 content - length 로 u - > length 에 값 을 부여 한 다음 에 ngx http proxy input filter init () 로 p - > length 에 값 을 부여 한다). 받 을 때마다 데이터 가 줄 어 들 고 p - > length 가 0 일 때 까지 connection 를 판단 한다.close (http \ \ 1.0 에서 기본 값 은 1 이 고 그렇지 않 으 면 0 입 니 다) upstream 이 connection: close 로 돌아 갈 때 1 로 설정 하여 keepalive 여 부 를 결정 합 니 다.
  • readv () 가 0 으로 되 돌아 오 면 upstream 이 FIN 신 호 를 보 내 서 닫 힌 원 격 socket 을 나타 내 면 nginx 도 후속 으로 링크 를 닫 습 니 다.
  • 마지막 으로 상대방 의 socket 이 닫 히 지 않 고 socket 에 오류 가 없 으 며 keepalive 가 있 으 면 백 엔 드 노드 의 연결 대상 을 cache 대기 열 머리 에 저장 합 니 다. 대기 열 이 가득 차 면 줄 끝의 요 소 를 방출 하고 LRU 도태 정책 을 사용 합 니 다.
  • 좋은 웹페이지 즐겨찾기