디렉터리 구조 한 번에 이해하기
/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;
}'TIL' 카테고리의 다른 글
| L4 장비 l3 장비 이거 뭘까? 가볍게 정리! (0) | 2025.09.21 |
|---|---|
| Kubernetes 구축 시 서비스명 해결 문제와 NodePort 해결책 (0) | 2025.09.13 |
| Socket Admin UI 페이지 보는법 (0) | 2025.09.11 |
| Socket.IO에서 JWT 만료 시 아예 연결을 차단하는 방법 (0) | 2025.09.05 |
| Docker 로그와 PM2, Logger, 색상 출력 – 실무에서 겪은 이야기 (3) | 2025.08.15 |