- nginx는 새로 들어오는 모든 요청에 대해 upstream(backend) 서버에 대한 새 연결(incoming request)→ 안전하지만 비효율적
- nginx와 upstream(backend) 서버가 연결을 설정하려면 패킷 3개를 교환
- nginx와 upstream(backend) 서버가 연결을 종료하려면 패킷 3~4개를 교환
- 트래픽이 많을 경우 모든 요청에 대해 새 연결을 열면 시스템 리소스가 고갈되어 연결을 열지 못 함
- nginx에서 upstream 서버로 연결하는 경우 source address, destination address, and destination port 는 고정되어 있고 source port만 변수
- nginx 연경은 source address, source port, destination address, and destination port 4가지 요소로 구성
- nginx에서 upstream 서버와 연결이 닫히면 linux 소켓은 2분 동안 TIME-WAIT 상태가 됨
- 트래픽이 많으면 사용 가능한 source port가 소진될 가능성이 높아짐 → nginx는 upstream 서버에 대한 새 연결을 열 수 없는 상태가 됨
- source port가 고갈되는 것을 막기 위해 요청이 완료되면 연결이 닫히는 대신 추가 요청에 사용할 수 있도록 연결을 열어두는 keep-alive 연결을 nginx와 upstream 간에 활성화
- 각 worker process의 캐시에 보존되는 upstream 서버에 대한 idle keep-alive 연결 수를 설정하려면 upstream{} 블록에 keepalive 지시어 사용
- keepalive 지시어는 worker process가 열 수 있는 upstream 서버에 대한 총 연결 수(total number of connections)를 제한하지 않음
- keepalive 지시어는 upstream{} 블록에 나열된 서버 수의 두 배로 설정하는 것이 좋음
- 두배 설정은 nginx가 upstrem 모든 서버와의 keep-alive 연결을 유지하기에 충분히 크며, upstream 서버에 새로 들어오는 연결도 처리 가능하도록 작음
- upstream{} 블록에서 hash, ip_hash, least_conn, least_time, random 지시어를 사용하여 load‑balancing algorithm 을 지정
- hash, ip_hash, least_conn, least_time, random 지시어가 keepalive 지시어 위에 표시 필요(필수)
- 요청을 upstream으로 전달하는 location{} 블록에 proxy_pass 지시어와 함께 아래 지시어를 포함
- nginx는 upstream 서버에 대한 연결에 HTTP/1.0을 사용 → 서버로 전달되는 요청에 Connection: close 헤더를 추가
- upstream{} 블록에 keepalive 지시어가 있음에도 불구하고 요청이 완료되면 각 연결이 닫힘
- proxy_http_version 지시어는 nginx가 HTTP/1.1을 대신 사용하도록 지시 → proxy_set_header Connection "" 헤더를 통해서 close 값을 제거함
proxy_http_version 1.1; proxy_set_header Connection "";
- proxy_http_version 지시자
- 프록시 서버를 위한 HTTP 프로토콜 버전을 설정
- 기본적으로 버전 1.0이 사용
- keep-alive 연결 및 NTLM 인증과 함께 사용하려면 버전 1.1을 사용하는 것이 좋음
구문 : proxy_http_version 1.0 | 1.1; 기본 : proxy_http_version 1.0; 문맥 : http, server, location
- proxy_set_header Connection "" 설정
- nginx서버에서 upstream으로 요청을 프록시할 때 HTTP 버전을 1.0으로, Connection 헤더를 close로 바꿔서 보냄
- upstream으로 keepalive 커넥션을 사용하기 위해서는 프록시 HTTP 버전을 1.1로 변경해야 한다고 권장
- 추가적으로 proxy_set_header Connection "" 설정을 통해 Connection 헤더를 없애주는 설정 진행
- upstream 서버로 HTTP 버전을 1.0, Connection 헤더를 close으로 전송
- upstream 서버로 HTTP 버전을 1.1, Connection 헤더를 초기화하여 전송
참고 자료 : Avoiding the Top 10 NGINX Configuration Mistakes - NGINX
참고 자료 : https://seungtaek-overflow.tistory.com/10
'Nginx > NGINX 설정 에러' 카테고리의 다른 글
error_log에 off 사용 불가 → error_log /dev/null emerg으로 비활성화 (0) | 2024.03.31 |
---|---|
Worker Process당 File Descriptors가 충분하지 않음 → File Descriptors 증가 (0) | 2024.03.31 |