2025년 6월 6일
이론
조회 : 47|3분 읽기
강력한 Nginx
실전으로 배우는 Nginx 설정과 구조 이해
들어가며
웹 개발을 하다 보면 한 번쯤은 Nginx를 마주치게 됩니다.
처음엔 단순히 정적 파일을 서빙하거나 리버스 프록시로만 쓰지만, 실무에 가까워질수록 SSL 인증서 적용, 로드밸런싱, 보안 설정, 요청 최적화 등 더 많은 책임이 생깁니다.
처음엔 단순히 정적 파일을 서빙하거나 리버스 프록시로만 쓰지만, 실무에 가까워질수록 SSL 인증서 적용, 로드밸런싱, 보안 설정, 요청 최적화 등 더 많은 책임이 생깁니다.
이 글에서는 “설정법”만이 아니라, 왜 그렇게 설정하는지, 그리고 실제로 문제를 해결하면서 깨달은 포인트를 중심으로 Nginx를 설명해보겠습니다.
1. Nginx는 어디에 쓰이는가? (아키텍처 이해)
✅ 주요 역할
- 정적 파일 서비스: HTML, JS, CSS 등 정적 자원은 Nginx가 직접 응답
- 리버스 프록시: Node, Spring 등 WAS 뒤에 위치해 요청을 전달
- SSL 종단점: HTTPS 처리와 인증서 관리
- 로드 밸런서: 여러 백엔드 서버 간 트래픽 분산
✅ 기본 요청 흐름 구조
2. 왜 Apache보다 Nginx가 더 많이 쓰일까?
| 항목 | Apache | Nginx |
|---|---|---|
| 아키텍처 | 프로세스/스레드 기반 | 이벤트 기반 비동기 처리 |
| 성능 | 동시 접속에 약함 | 높은 동시성 처리에 강함 |
| 메모리 사용량 | 비교적 큼 | 매우 적음 |
| 정적 파일 처리 | 느린 편 | 빠름 |
| 설정 구조 | 복잡한 편 | 명료하고 가독성 좋음 |
🧠 요약: Apache는 과거의 표준이지만, 고성능/경량화/현대적인 아키텍처로 인해 대부분의 신규 프로젝트는 Nginx를 선택합니다.
3. 설정 파일 구조 읽는 법
기본 구조
nginx.conf 예시
nginx1user nginx; 2worker_processes auto; 3 4events { 5 worker_connections 1024; 6} 7 8http { 9 include mime.types; 10 default_type application/octet-stream; 11 12 include /etc/nginx/conf.d/*.conf; 13}
설정 계층 시각화
4. 상황별 설정 예시 + 동작 설명
✅ A. 정적 자원 서빙 (SPA 대응)
nginx1server { 2 listen 80; 3 server_name example.com; 4 5 root /var/www/example/dist; 6 index index.html; 7 8 location / { 9 try_files $uri $uri/ /index.html; 10 } 11}
📌 설명
- root: 정적 파일 위치
- try_files: 없는 경로 요청 시 SPA 라우팅을 위해 index.html 반환
- index: 디폴트 문서
⚠️ 트랩
- alias와 root는 경로 계산 방식이 다름 → 디버깅 시 혼동 주의
✅ B. 리버스 프록시 설정
nginx1server { 2 listen 80; 3 server_name api.example.com; 4 5 location / { 6 proxy_pass http://localhost:8080; 7 proxy_set_header Host $host; 8 proxy_set_header X-Real-IP $remote_addr; 9 } 10}
📌 설명
- proxy_pass: 요청을 백엔드로 전달
- 헤더 설정은 WAS에서 real ip, host 정보 활용 가능하게 해줌
🔁 요청 흐름 시각화
⚠️ 트랩
- proxy_pass 경로 끝에 / 유무가 실제 요청 경로에 영향을 줌
✅ C. HTTPS 설정 + HTTP 리디렉션
nginx1server { 2 listen 443 ssl; 3 server_name example.com; 4 5 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 6 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 7 8 location / { 9 proxy_pass http://localhost:8080; 10 } 11} 12 13server { 14 listen 80; 15 server_name example.com; 16 return 301 https://$host$request_uri; 17}
📌 설명
- HTTPS 인증서 적용
- HTTP 요청은 HTTPS로 영구 리디렉션 (301)
⚠️ 트랩
- 백엔드가 이미 HTTPS 리디렉션 시 중첩 루프 발생할 수 있음
✅ D. 로드 밸런싱
nginx1upstream backend { 2 server 127.0.0.1:3000; 3 server 127.0.0.1:3001; 4} 5 6server { 7 listen 80; 8 server_name app.example.com; 9 10 location / { 11 proxy_pass http://backend; 12 } 13}
🌐 구조 시각화
📌 설명
- upstream으로 서버 그룹 정의
- 기본 라운드로빈 방식으로 분산 처리
⚠️ 트랩
- 서버 다운 시에도 트래픽을 보내므로 health check는 외부 도구로 보완 필요
5. 실무에서 마주치는 문제들
| 문제 상황 | 원인 | 해결 방법 |
|---|---|---|
| 413 Entity Too Large | 업로드 제한 | client_max_body_size 설정 |
| JS/CSS 느림 | Gzip 미설정 | gzip on;, gzip_types 지정 |
| 502 Bad Gateway | 백엔드 다운/포트 오류 | 로그 확인 + 백엔드 상태 체크 |
| CORS 오류 | 헤더 누락 | proxy_set_header Origin 명시 |
6. 운영 팁
- 설정 적용 전 항상 테스트:
bash
1nginx -t && nginx -s reload - 로그 경로
- Error 로그: /var/log/nginx/error.log
- Access 로그: /var/log/nginx/access.log
- 설정은 Git으로 버전 관리할 것
마무리
Nginx는 단순한 정적 서버를 넘어서 현대 웹 아키텍처의 핵심 구성요소입니다.
설정 파일 한 줄 한 줄을 복사해 쓰는 대신, 그 의도와 동작 방식을 이해하고 조절할 수 있다면 운영 능력이 비약적으로 향상됩니다.
설정 파일 한 줄 한 줄을 복사해 쓰는 대신, 그 의도와 동작 방식을 이해하고 조절할 수 있다면 운영 능력이 비약적으로 향상됩니다.