TIL

Nginx 설정 팁

하얀잔디 2025. 9. 11. 21:40
디렉터리 구조 한 번에 이해하기
/etc/nginx/nginx.conf

  • Nginx의 메인 설정. 전역 옵션, 공통 http {} 블록, include로 하위 설정을 불러온다.

 

/etc/nginx/conf.d/*.conf
  • 짧은 공통 설정(업스트림, 공용 변수, 보안 헤더 등)을 파일 단위로 쪼개 넣는다.

 

 

/etc/nginx/sites-available/ & /etc/nginx/sites-enabled/


  • 가상 호스트(도메인)별 설정을 sites-available에 두고, 실제로 쓸 것만 sites-enabled에 심볼릭 링크로 연결한다.
  • 장점: 환경 별 on/off가 쉽고, 롤백/관리 편함.

 

# /etc/nginx/nginx.conf (예시)
user  nginx;
worker_processes auto;

events { worker_connections 2048; }

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  # 공통 튜닝
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;

  # 하위 설정 include
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

 

 

Keep-Alive: 연결을 “계속” 쓰는 기술

 

Keep-Alive는 클라이언트와 Nginx가 TCP 연결을 재사용하도록 해서, 매 요청마다 3-way handshake를 반복하지 않게 해준다.
지연 감소, CPU/커넥션 부담 완화 효과.

 

 

http {
  # 클라이언트 ↔ Nginx
  keepalive_timeout 65s;     # 연결 유휴 최대 시간
  keepalive_requests 1000;   # 한 연결에서 허용할 최대 요청 수

  # Nginx ↔ 업스트림(백엔드) (proxy_pass 사용하는 경우)
  upstream api_upstream {
    server 10.0.0.10:3000;
    server 10.0.0.11:3000;
    keepalive 64;            # 업스트림 연결 풀
  }

  server {
    listen 443 ssl http2;    # HTTP/2면 커넥션 효율↑
    server_name example.com;

    location / {
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_set_header Host $host;
      proxy_pass http://api_upstream;
    }
  }
}

 

  • keepalive_timeout을 너무 크게 잡으면 유휴 커넥션이 점유만 하고 자원 낭비. 너무 작으면 재연결이 잦아짐. (60~75초 선호)
  • 업스트림에도 keepalive를 꼭 지정해야 백엔드와의 연결 재사용이 된다.
  • HTTP/2 사용 시 하나의 TCP 연결에서 동시 스트림이 가능해 효율적.

 

X-Real-IP / X-Forwarded-For: 진짜 클라이언트 IP를 보는 법

 

리버스 프록시(Nginx)가 앞단에 있으면, 백엔드가 보는 remote_addr는 프록시의 IP가 된다.
그래서 클라이언트의 실제 IP를 헤더로 넘겨줘야 한다.

차이점 간단 요약

 

  • X-Real-IP: 보통 “직전 프록시가 보기엔 클라이언트의 IP 하나”를 넣어준다. (단일 값)
  • X-Forwarded-For: 프록시를 거칠 때마다 앞에 IP가 누적된다. (가장 왼쪽이 원래 클라이언트 IP)

예) 프록시에서 헤더 세팅 (가장 기본형)

 

location / {
  proxy_set_header X-Real-IP        $remote_addr;
  proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for; # 누적
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Host $host;

  proxy_pass http://api_upstream;
}