nginx 에서 건강 검사 (health check) 메커니즘 깊이 분석
먼저 제 테스트 환경 을 말씀 드 리 겠 습 니 다. CentOS release 6.4 (Final) + nginx 1.6.0 + tomcat 8.0.15 2 대 를 백 엔 드 서버 로 사용 합 니 다.
#user nobody;
worker_processes 1;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
upstream backend {
server localhost:9090 max_fails=1 fail_timeout=40s;
server localhost:9191 max_fails=1 fail_timeout=40s;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend;
proxy_connect_timeout 1;
proxy_read_timeout 1;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx 와 tomcat 의 설정 에 대한 기본 설정 은 설명 되 지 않 습 니 다. 공식 문 서 를 보 러 갈 수 있 습 니 다. upstream 명령 에 두 대의 server 를 설정 한 것 을 볼 수 있 습 니 다. 모든 server 는 max fails 와 fail timeout 값 을 설정 합 니 다.
지금부터 nginx 를 시작 하고 백 엔 드 서버 2 대 를 시작 합 니 다. 일부러 Tomcat Listener 에서 10 분 동안 Sleep 을 합 니 다. 즉, tomcat 를 시작 하 는 데 10 분 정도 걸 립 니 다. 포트 가 열 렸 지만 요청 을 받 지 않 았 습 니 다. 그리고 방문 합 니 다.http://localhost/response/ (response 이 인 터 페 이 스 는 제 가 tomcat 에서 쓴 servlet 인터페이스 로 기능 이 간단 합 니 다. 9090 의 server 수신 요청 이 라면 9090 으로 돌아 가 고 9191 포트 의 server 라면 9191 로 돌아 갑 니 다.) 지금 nginx 의 표현 을 관찰 하고 있 습 니 다.
nginx
## access.log ##
192.168.42.254 - - [29/Dec/2014:11:24:23 +0800] "GET /response/ HTTP/1.1" 504 537 720 380 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36" 2.004 host:health.iflytek.com
192.168.42.254 - - [29/Dec/2014:11:24:24 +0800] "GET /favicon.ico HTTP/1.1" 502 537 715 311 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36" 0.000 host:health.iflytek.com
## error.log ##
2014/12/29 11:24:22 [error] 6318#0: *4785892017 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.42.254, server: health.iflytek.com, request: "GET /response/ HTTP/1.1", upstream: "http://192.168.42.249:9090/response/", host: "health.iflytek.com"
2014/12/29 11:24:23 [error] 6318#0: *4785892017 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.42.254, server: health.iflytek.com, request: "GET /response/ HTTP/1.1", upstream: "http://192.168.42.249:9191/response/", host: "health.iflytek.com"
2014/12/29 11:24:24 [error] 6318#0: *4785892017 no live upstreams while connecting to upstream, client: 192.168.42.254, server: health.iflytek.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://health/favicon.ico", host: "health.iflytek.com"
(listener 에서 수면 10 분 을 설정 하 는 이 유 는 우리 업무 에서 캐 시 예열 을 해 야 하기 때문에 이 10 분 은 아 날로 그 서버 시작 과정 에서 10 분 동안 사용 할 수 없습니다.)
관찰 로 그 는 두 대의 tomcat 시작 과정 에서 한 번 의 요청 을 보 내 면 nginx 가 모든 백 엔 드 서버 를 자동 으로 다시 시도 해 주 고 마지막 으로 no live upstreams while connecting to upstream 오 류 를 보고 합 니 다. 이것 은 nginx 가 health check 을 하 는 방식 이 라 고 할 수 있 습 니 다. 특히 강조해 야 할 것 은 proxy read timeout 을 1 초 로 설정 하 였 습 니 다. 다음 에 중점 을 두 겠 습 니 다.이 매개 변 수 를 푸 는 것 은 매우 중요 하 다.
40s 를 기다 리 고 있 습 니 다. 현재 9090 서버 를 시작 하 였 으 나 9191 서버 는 여전히 시작 되 고 있 습 니 다. nginx 로그 표현 을 관찰 하고 있 습 니 다.
access.log
192.168.42.254 - - [29/Dec/2014:11:54:18 +0800] "GET /response/ HTTP/1.1" 200 19 194 423 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36" 0.210 host:health.iflytek.com
192.168.42.254 - - [29/Dec/2014:11:54:18 +0800] "GET /favicon.ico HTTP/1.1" 404 453 674 311 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36" 0.212 host:health.iflytek.com
error.log
인쇄 오류 없 음
브 라 우 저 는 9090 을 되 돌려 줍 니 다. nginx 가 정상적으로 요청 을 받 았 음 을 설명 합 니 다.
다시 한번 부탁 드 리 겠 습 니 다.
access.log
192.168.42.254 - - [29/Dec/2014:13:43:13 +0800] "GET /response/ HTTP/1.1" 200 19 194 423 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36" 1.005 host:health.iflytek.com
설명 정상 반환, 동시에 9090 반환
error.log
2014/12/29 13:43:13 [error] 6323#0: *4801368618 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.42.254, server: health.iflytek.com, request: "GET /response/ HTTP/1.1", upstream: "http://192.168.42.249:9191/response/", host: "health.iflytek.com"
nginx error. log 에 upstream time out 의 오류 가 추가 되 었 습 니 다. 그러나 클 라 이언 트 는 정상적으로 되 돌 아 왔 습 니 다. upstream 은 기본적으로 교대 훈련 부하 이기 때문에 이 요청 은 기본적으로 9191 이 기계 로 전 송 됩 니 다. 그러나 9191 이 시작 되 고 있 기 때문에 이번 요청 이 실 패 했 습 니 다. 그리고 nginx 는 9090 기계 로 다시 전 송 됩 니 다.
OK, 그런데 fail timeout = 40s 는 무슨 뜻 입 니까? 이 매개 변수의 중요성 을 재현 해 볼 까요? Let 's go! 지금 은 조용히 미남 이 되 어 9191 기계 가 작 동 할 때 까지 기 다 려 야 합 니 다! 몇 번 더 요청 을 보 내 주세요! 그리고 어, 9191 기계 가 9191 로 돌아 가 응답 하 는 것 을 발 견 했 습 니 다! fail timeout = 40s 는 사실 지난번 요청 에서 9191 이 정상적으로 돌아 오지 않 는 다 는 것 을 발견 하면...40s 시간 이 있 으 면 이 server 를 사용 할 수 없 지만 40s 요청 이 넘 으 면 다시 이 server 에 전 송 됩 니 다. 이 server 가 진정 으로 회복 되 었 든 없 든 간 에 nginx 커 뮤 니 티 판 helh check 체제 가 얼마나 약 한 지 알 수 있 습 니 다. 즉, 지연 차단 일 뿐 입 니 다. 이렇게 반복 되 는 것 입 니 다. nginx plus 를 사용 해 보면 nginx plus 가 제공 하 는 he 를 발견 할 수 있 습 니 다.alth check 메커니즘 이 더욱 강력 합 니 다. 몇 가지 키 워드 를 말 합 니 다. 직접 찾 아 보 세 요! zone slow start health check match! 이 slow start 는 캐 시 예열 문 제 를 잘 해결 합 니 다. 예 를 들 어 nginx 가 기계 가 재 부팅 된 것 을 발견 하면 slow starts 가 설정 한 시간 을 기 다 려 야 이 서버 에 다시 요청 을 보 낼 수 있 습 니 다. 이것 은 캐 시 예열 에 시간 을 제공 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.