2025년 6월 6일
이론
조회 : 47|3분 읽기

강력한 Nginx






실전으로 배우는 Nginx 설정과 구조 이해

들어가며

웹 개발을 하다 보면 한 번쯤은 Nginx를 마주치게 됩니다.
처음엔 단순히 정적 파일을 서빙하거나 리버스 프록시로만 쓰지만, 실무에 가까워질수록 SSL 인증서 적용, 로드밸런싱, 보안 설정, 요청 최적화 등 더 많은 책임이 생깁니다.
이 글에서는 “설정법”만이 아니라, 왜 그렇게 설정하는지, 그리고 실제로 문제를 해결하면서 깨달은 포인트를 중심으로 Nginx를 설명해보겠습니다.

1. Nginx는 어디에 쓰이는가? (아키텍처 이해)

✅ 주요 역할

  • 정적 파일 서비스: HTML, JS, CSS 등 정적 자원은 Nginx가 직접 응답
  • 리버스 프록시: Node, Spring 등 WAS 뒤에 위치해 요청을 전달
  • SSL 종단점: HTTPS 처리와 인증서 관리
  • 로드 밸런서: 여러 백엔드 서버 간 트래픽 분산

✅ 기본 요청 흐름 구조


2. 왜 Apache보다 Nginx가 더 많이 쓰일까?

항목ApacheNginx
아키텍처프로세스/스레드 기반이벤트 기반 비동기 처리
성능동시 접속에 약함높은 동시성 처리에 강함
메모리 사용량비교적 큼매우 적음
정적 파일 처리느린 편빠름
설정 구조복잡한 편명료하고 가독성 좋음
🧠 요약: Apache는 과거의 표준이지만, 고성능/경량화/현대적인 아키텍처로 인해 대부분의 신규 프로젝트는 Nginx를 선택합니다.

3. 설정 파일 구조 읽는 법

기본 구조

nginx.conf 예시
nginx
1user 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 대응)

nginx
1server {
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: 디폴트 문서
⚠️ 트랩
  • aliasroot는 경로 계산 방식이 다름 → 디버깅 시 혼동 주의

✅ B. 리버스 프록시 설정

nginx
1server {
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 리디렉션

nginx
1server {
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. 로드 밸런싱

nginx
1upstream 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는 단순한 정적 서버를 넘어서 현대 웹 아키텍처의 핵심 구성요소입니다.
설정 파일 한 줄 한 줄을 복사해 쓰는 대신, 그 의도와 동작 방식을 이해하고 조절할 수 있다면 운영 능력이 비약적으로 향상됩니다.