콘텐츠로 이동

Nginx Global 설정 (공통 기반)

Nginx를 Gateway 서버, 단독 서비스 서버, Reverse Proxy 환경을 구분하지 않는 환경에서, 공통으로 적용할 수 있는 최소한의 Global 설정을 정의함.

Git, SVN, API, Web, Media 등 서비스 성격에 따라 달라져야 하는 설정은 이 문서에 포함하지 않고 서비스별 문서로 분리 관리.

  • Global 설정은 서버 역할과 무관하게 공통
  • 서비스별 정책은 반드시 분리

Gateway와 단독 서버 모두에 적용 가능한 Nginx 운영의 공통 기반. 설정 예시를 나열하기보다, 어떤 설정을 Global에 둘지에 대한 판단 기준을 정의하는 기준 문서.


1. Nginx 설정의 3계층 구조 (정석)

Nginx 설정은 운영 관점에서 다음 3계층으로 나뉨.

하나의 설정이 어느 계층에 속하는지 명확히 인식하지 못하면 Global 과 Service 설정이 뒤섞이기 쉬움.

[ OS / systemd ] (서버 단위 공통)
    └─ 파일 디스크립터, 커널 한계, 서비스 실행 제약

[ Nginx Core ] (Nginx 인스턴스 단위 공통)
    └─ worker_processes, worker_connections

[ HTTP / Server / Location ] (반드시 분리)
    └─ 서비스 성격별 정책

계층별 의미

  • OS / systemd

    • 잘못되면 해당 서버 전체 장애
  • Nginx Core

    • 동시 접속 처리 능력
    • 서버 역할이 바뀌어도 설정은 거의 동일
  • HTTP / Server / Location

    • Git / SVN / API / Web / Media 등
    • 서비스 요구사항에 따라 반드시 달라짐

위 구조 중
HTTP 계층에서 “모든 서비스에 공통으로 적용 가능한 Global 설정”만 다룸.


2. Global 설정 선정 기준

아래 조건을 만족하는 설정만 Global로 둠.

  • 서비스 종류와 무관
  • 변경 주기가 낮음
  • 잘못 설정 시 서버 전체 안정성에 영향
  • 서비스별로 나누는 것이 오히려 혼란을 유발함

3. Nginx Core 공통 설정

아래 설정은 /etc/nginx/nginx.conf 최상위 또는 events {} 블록에 둠.

3.1 Worker 및 Event 설정

worker_processes auto;

events {
    worker_connections 4096;
    multi_accept on;
}

의도 - CPU 코어 수 기반 worker 자동 조정 - 동시 연결 처리 안정성 확보 - 서비스 종류와 무관한 서버 단위 기준 - 실제 허용 동시 연결 수는 worker_processes * worker_connections 기준임


4. Global (http context) 설정

아래 설정은 /etc/nginx/nginx.confhttp {} 내부에 둠.

4.1 Buffering 정책

아래 설정은 모든 서버의 Global 기본값으로 강제하지 않음.

# proxy_request_buffering off;
# proxy_buffering off;

원칙 - Nginx 기본 buffering 동작은 Global 기본값으로 유지함 - Git/SVN, 대용량 업로드, 실시간 API 등 buffering off 가 필요한 서비스만 server 또는 location 에서 개별 적용함 - 서비스 성격에 따라 이득과 손해가 분명히 갈리므로 공통 Global 기준으로 단정하지 않음 - 응답 캐시 또는 CDN 원본 서버처럼 buffering 특성이 중요한 역할은 별도 정책으로 관리함

4.2 Timeout 정책

proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
send_timeout 300s;
reset_timedout_connection on;

의도 - Backend 응답 지연 시 Nginx가 먼저 연결을 끊지 않도록 함 - 대용량 요청 및 장시간 처리 작업에 공통 대응 - send_timeout을 포함하여 클라이언트 응답 정체 상황 제어 - reset_timedout_connection on; 으로 timeout된 연결을 보다 명확히 정리하여 worker 자원 정체를 줄이도록 함

단, 특정 서비스(API 등)에서 더 짧은 timeout이 필요한 경우 server 또는 location 레벨에서 override 할 수 있음.

⚠️ 주의 이것은 proxy_*_timeout, send_timeout을 대체하는 옵션이 아님 timeout 시간을 늘리는 기능이 아니라, timeout 발생 후 연결 정리 방식에 가까움 서비스 특성에 따라 server 또는 location 레벨에서 더 짧은 timeout override 가능

4.3 Keepalive 정책

keepalive_timeout 65;
keepalive_requests 1000;

의도 - API, Web과 같은 짧은 요청 - Git, SVN과 같은 장시간 연결 - 단일 Nginx 인스턴스에서 혼합 처리 시 안정성 확보

4.4 기본 I/O 정책 (선택)

sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
server_tokens off;

의도 - Nginx 기본 동작의 안정성과 성능 확보 - 서비스 성격과 무관한 공통 정책

4.5 SSL 공통 정책

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

의도 - 취약 프로토콜 차단 - SSL 보안 기준 통일 - 서비스별 SSL 정책 분산 방지

4.6 Rate / Connection Limit Zone 정의 (공통 기반)

limit_req_zone  $binary_remote_addr zone=req_limit:20m rate=20r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

의도 - 서비스별 limit_req, limit_conn 설정을 위한 공통 zone 정의 - 서비스 문서에서 사용하는 zone 이름(req_limit, conn_limit)을 공통화 - 실제 제한 수치(burst, limit_conn 값)는 서비스 문서에서 결정 - 서비스별로 서로 다른 rate가 필요하면 zone을 분리(req_api, req_auth 등)하여 운영함

limit_req zone=req_limit ... 또는 limit_conn conn_limit ...를 사용하는 서비스 문서는
반드시 이 zone 정의가 선행되어야 하며, 없으면 nginx -t에서 오류가 발생함.

4.7 Limit 응답 코드 정책 (권장)

limit_req_status 429;
limit_conn_status 429;

의도 - 제한 발생 시 기본 503 대신 429를 반환하여 의미를 명확히 전달 - 클라이언트/모니터링/로그 분석에서 rate limit 이벤트 식별성을 높임

4.8 Dry-run 검증 모드 (운영 초기 권장)

limit_req_dry_run on;
limit_conn_dry_run on;

의도 - 초기 적용 시 실제 차단 없이 로그 기반으로 영향도 확인 - 오탐/과차단 없이 정책을 튜닝한 뒤 off 전환 가능

운영 안정화 후 실제 차단이 필요하면 dry_run off로 전환함.


5. 정리

  • Global 설정은 서버 안정성 기반”만 담당함
  • 트래픽 제어의 임계치(limit_req, limit_conn)는 서비스 문서에서 정의함
  • zone 정의, 응답 코드, dry-run 같은 공통 기반은 Global에서 관리함
  • 모든 Nginx 서버의 공통 기준선

Global이 무거워지면 운영이 흔들리고,
Global이 가벼우면 서비스 문서가 명확해짐.