upstream 블록 안에 server 를 여러 줄 쓰면 nginx 가 그 이름을 하나의 가상 서버처럼 다룹니다.
| 속성 | 뜻 |
|---|---|
weight=N |
가중치, 클수록 더 많이 받음 |
max_fails=N |
이 횟수 실패하면 잠시 제외 |
fail_timeout=Ns |
제외 유지 시간이자 실패 집계 기간 |
backup |
평소엔 안 쓰고 나머지가 다 죽으면 사용 |
down |
완전히 제외, 통계에도 안 잡힘 |
weight=3, weight=1 두 서버는 대략 3:1 비율로 요청을 받습니다. max_fails=2 fail_timeout=10s 는 10초 동안 2번 연속 실패하면 그 10초간 서버를 빼고, 시간이 지나면 다시 시도합니다.
backup 서버는 평소 요청을 받지 않다가 나머지가 전부 실패했을 때만 투입되는 예비 서버입니다. down 은 점검 중이거나 아직 준비 안 된 서버를 목록에는 남기되 완전히 빼는 용도입니다.
ip_hash 를 쓰면 같은 클라이언트 IP 는 항상 같은 서버로 갑니다. 로그인 세션을 서버 메모리에 두는 구식 앱에서 유용하지만, 사내망처럼 여러 사용자가 같은 NAT IP 를 쓰면 한 서버로 요청이 쏠립니다.
가능하면 세션을 Redis 같은 외부 저장소로 빼서 ip_hash 자체를 피하는 편이 낫습니다. 어쩔 수 없이 쓸 때만 예외로 남깁니다.
한 서버를 배포할 때는 server 줄에 down 을 추가하고 nginx -t 로 검증한 뒤 reload 합니다. reload 는 기존 연결을 끊지 않고 워커만 새로 띄우므로, 그 서버만 조용히 트래픽에서 빠집니다.
배포가 끝나면 down 을 지우고 다시 reload 합니다. 점검 페이지로 전체를 바꾸는 절차는 리눅스 운영 05 를 참조합니다.
log_format 으로 기본 형식에 업스트림 정보를 더합니다.
| 변수 | 의미 |
|---|---|
$upstream_addr |
요청을 처리한 실제 서버 |
$upstream_response_time |
백엔드 응답 시간 |
$request_time |
nginx 가 요청을 받아 응답까지 걸린 전체 시간 |
두 시간 값을 비교하면 느린 원인이 백엔드인지 nginx 앞단인지 갈라집니다. $upstream_addr 은 재시도가 있으면 콤마로 여러 개가 찍힙니다.
접근 로그는 계속 쌓이므로 압축·삭제(백업)가 필요합니다. logrotate 로 자동화하는 방법은 리눅스 운영 06 을 참조합니다.
텍스트 계열 응답만 압축 대상으로 지정합니다. 이미지·동영상은 이미 압축된 형식이라 넣어도 효과가 없고 CPU 만 더 씁니다.
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1024;
gzip_comp_level 5;gzip_min_length 보다 작은 응답은 압축하지 않습니다. 압축 자체의 오버헤드가 더 크기 때문입니다.
proxy_cache_path 로 캐시 저장 위치와 크기를 정하고, location 마다 캐시 정책을 다르게 줍니다. 정적 파일은 상태 200 이면 무조건 캐시하고, API 는 헤더로 우회할 수 있게 짧게만 캐시합니다.
| 위치 | 캐시 시간 | 우회 |
|---|---|---|
/static/ |
10분 | 없음, 항상 캐시 |
/api/ |
30초 | X-No-Cache 헤더로 가능 |
limit_req_zone 으로 IP 당 초당 요청 수 한도를 정의하고, location 에서 limit_req 로 적용합니다. burst 는 순간적으로 몰리는 요청을 큐에 잠깐 쌓아 주는 여유분입니다.
limit_req_zone $binary_remote_addr zone=applimit:10m rate=10r/s;
limit_req zone=applimit burst=20 nodelay;nodelay 없이 쓰면 큐에 쌓인 요청이 지연되며 순서대로 처리됩니다. nodelay 를 붙이면 burst 안에서는 즉시 처리하고, 넘는 순간부터 바로 429 로 거절합니다.
$BASE/nginx/conf 를 git 저장소로 관리하면 설정을 바꾸기 전에 git diff 로 무엇이 바뀌는지 미리 볼 수 있습니다. 실제 파일 교체·헬스체크 절차는 리눅스 운영 05 를 참조합니다.
증상별로 원인과 확인 명령을 정리해 두면 장애 때 순서대로 짚어 나갈 수 있습니다.
| 상태·증상 | 흔한 원인 | 확인 명령 |
|---|---|---|
| 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 |