공공부하자개발 · 영어 학습 노트
리눅스
웹 서버Tomcat · Nginx 설치와 설정0/8 완료
  • 01Tomcat 설치
  • 02Tomcat server.xml 설정
  • 03Tomcat 인스턴스와 JVM 옵션
  • 04Tomcat 보안과 운영 점검
  • 05nginx 설치
  • 06nginx 리버스 프록시
  • 07nginx HTTPS
  • 08nginx 로드밸런싱과 운영
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 웹 서버 › 08 / 8

nginx 로드밸런싱과 운영

섹션 7진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

2. 핵심 원리

2.1 upstream 여러 서버

upstream 블록 안에 server 를 여러 줄 쓰면 nginx 가 그 이름을 하나의 가상 서버처럼 다룹니다.

속성 뜻
weight=N 가중치, 클수록 더 많이 받음
max_fails=N 이 횟수 실패하면 잠시 제외
fail_timeout=Ns 제외 유지 시간이자 실패 집계 기간
backup 평소엔 안 쓰고 나머지가 다 죽으면 사용
down 완전히 제외, 통계에도 안 잡힘

2.2 가중치 분산과 장애 감지

weight=3, weight=1 두 서버는 대략 3:1 비율로 요청을 받습니다. max_fails=2 fail_timeout=10s 는 10초 동안 2번 연속 실패하면 그 10초간 서버를 빼고, 시간이 지나면 다시 시도합니다.

2.3 backup 과 down 을 구분해서 쓰기

backup 서버는 평소 요청을 받지 않다가 나머지가 전부 실패했을 때만 투입되는 예비 서버입니다. down 은 점검 중이거나 아직 준비 안 된 서버를 목록에는 남기되 완전히 빼는 용도입니다.

2.4 세션 고정(ip_hash) 과 주의

ip_hash 를 쓰면 같은 클라이언트 IP 는 항상 같은 서버로 갑니다. 로그인 세션을 서버 메모리에 두는 구식 앱에서 유용하지만, 사내망처럼 여러 사용자가 같은 NAT IP 를 쓰면 한 서버로 요청이 쏠립니다.

가능하면 세션을 Redis 같은 외부 저장소로 빼서 ip_hash 자체를 피하는 편이 낫습니다. 어쩔 수 없이 쓸 때만 예외로 남깁니다.

2.5 무중단 배포 연계

한 서버를 배포할 때는 server 줄에 down 을 추가하고 nginx -t 로 검증한 뒤 reload 합니다. reload 는 기존 연결을 끊지 않고 워커만 새로 띄우므로, 그 서버만 조용히 트래픽에서 빠집니다.

배포가 끝나면 down 을 지우고 다시 reload 합니다. 점검 페이지로 전체를 바꾸는 절차는 리눅스 운영 05 를 참조합니다.

2.6 접근 로그 형식

log_format 으로 기본 형식에 업스트림 정보를 더합니다.

변수 의미
$upstream_addr 요청을 처리한 실제 서버
$upstream_response_time 백엔드 응답 시간
$request_time nginx 가 요청을 받아 응답까지 걸린 전체 시간

두 시간 값을 비교하면 느린 원인이 백엔드인지 nginx 앞단인지 갈라집니다. $upstream_addr 은 재시도가 있으면 콤마로 여러 개가 찍힙니다.

2.7 로그 백업

접근 로그는 계속 쌓이므로 압축·삭제(백업)가 필요합니다. logrotate 로 자동화하는 방법은 리눅스 운영 06 을 참조합니다.

2.8 gzip 압축

텍스트 계열 응답만 압축 대상으로 지정합니다. 이미지·동영상은 이미 압축된 형식이라 넣어도 효과가 없고 CPU 만 더 씁니다.

nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1024;
gzip_comp_level 5;

gzip_min_length 보다 작은 응답은 압축하지 않습니다. 압축 자체의 오버헤드가 더 크기 때문입니다.

2.9 proxy_cache 로 캐시하기

proxy_cache_path 로 캐시 저장 위치와 크기를 정하고, location 마다 캐시 정책을 다르게 줍니다. 정적 파일은 상태 200 이면 무조건 캐시하고, API 는 헤더로 우회할 수 있게 짧게만 캐시합니다.

위치 캐시 시간 우회
/static/ 10분 없음, 항상 캐시
/api/ 30초 X-No-Cache 헤더로 가능

2.10 limit_req 로 rate limit

limit_req_zone 으로 IP 당 초당 요청 수 한도를 정의하고, location 에서 limit_req 로 적용합니다. burst 는 순간적으로 몰리는 요청을 큐에 잠깐 쌓아 주는 여유분입니다.

nginx
limit_req_zone $binary_remote_addr zone=applimit:10m rate=10r/s;
limit_req zone=applimit burst=20 nodelay;

nodelay 없이 쓰면 큐에 쌓인 요청이 지연되며 순서대로 처리됩니다. nodelay 를 붙이면 burst 안에서는 즉시 처리하고, 넘는 순간부터 바로 429 로 거절합니다.

2.11 설정 버전 관리

$BASE/nginx/conf 를 git 저장소로 관리하면 설정을 바꾸기 전에 git diff 로 무엇이 바뀌는지 미리 볼 수 있습니다. 실제 파일 교체·헬스체크 절차는 리눅스 운영 05 를 참조합니다.

2.12 문제 해결 표

증상별로 원인과 확인 명령을 정리해 두면 장애 때 순서대로 짚어 나갈 수 있습니다.

상태·증상 흔한 원인 확인 명령
502 백엔드 죽음·응답 형식 오류 tail access.log, curl 127.0.0.1:8080
504 백엔드가 timeout 안에 응답 못 함 grep urt= access.log
413 client_max_body_size 초과 grep 413 access.log
403 파일 권한·SELinux·location 거부 ls -l, getenforce
연결 거부 nginx 미기동·포트 막힘 systemctl status nginx, ss -ltnp
핵심 원리
  • 2.1 upstream 여러 서버
  • 2.2 가중치 분산과 장애 감지
  • 2.3 backup 과 down 을 구분해서 쓰기
  • 2.4 세션 고정(ip_hash) 과 주의
  • 2.5 무중단 배포 연계
  • 2.6 접근 로그 형식
  • 2.7 로그 백업
  • 2.8 gzip 압축
  • 2.9 proxy_cache 로 캐시하기
  • 2.10 limit_req 로 rate limit
  • 2.11 설정 버전 관리
  • 2.12 문제 해결 표
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제