jundev
개발
jundev
전체 방문자
오늘
어제
  • 분류 전체보기 (37)
    • 생각 (0)
    • 블록체인 (3)
      • 책 (0)
      • 블록체인개론 (0)
      • 논문 (1)
      • 기술 (2)
    • 개발 (6)
      • JavaScript (1)
      • Java (9)
      • SpringBoot (1)
      • Mysql , SQL (4)
      • Git (1)
      • Spring (0)
    • CS (7)
      • 컴퓨터구조 (3)
      • 운영체제 (1)
      • 자료구조 (1)
      • 알고리즘 (1)
      • 데이터베이스 (0)
    • 프로젝트 (3)
      • 야구어플 (2)
      • 스테이블코인 결제 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

티스토리

hELLO · Designed By 정상우.
jundev

개발

개발

Nginx 정리: 백엔드 개발자가 알아야 할 개념부터 실무 설정까지

2026. 4. 15. 11:06

들어가며

백엔드 개발을 하다 보면 Nginx라는 이름을 자주 보게 된다.
처음에는 단순히 “서버 앞에 두는 무언가” 정도로만 이해하기 쉽지만, 실제로는 웹서버, 리버스 프록시, 로드밸런서, SSL 종료 지점 등 다양한 역할을 수행하는 매우 중요한 소프트웨어다.

특히 Spring Boot, FastAPI, Node.js 같은 애플리케이션 서버를 운영할 때 Nginx는 거의 표준처럼 사용된다.
이 글에서는 백엔드 개발자가 실무에서 알아야 하는 Nginx의 핵심 개념과 기본 설정 방법을 한 번에 정리한다.


1. Nginx란 무엇인가

Nginx는 고성능 웹서버이자 리버스 프록시 서버다.

쉽게 말하면, 클라이언트의 요청을 가장 먼저 받아서 적절한 서버로 전달하거나, 정적 리소스를 직접 응답하거나, HTTPS를 처리하는 앞단 서버라고 보면 된다.

예를 들어 사용자가 브라우저에서 https://api.example.com에 접속하면, 실제 요청 흐름은 아래처럼 동작하는 경우가 많다.

사용자 -> Nginx -> Spring Boot / FastAPI

이 구조에서 Nginx는 앞단에서 요청을 받아서 내부 애플리케이션 서버로 전달한다.


2. 왜 Nginx를 사용할까

Spring Boot나 FastAPI도 직접 HTTP 요청을 받을 수 있다.
그런데도 실무에서 Nginx를 두는 이유는 분명하다.

2.1 표준 포트 처리

웹 서비스는 보통 80(HTTP), 443(HTTPS) 포트를 사용한다.
반면 Spring Boot는 보통 8080, FastAPI는 8000 같은 내부 포트에서 실행된다.

Nginx는 외부의 80, 443 요청을 받아서 내부 포트로 연결해준다.

2.2 리버스 프록시 역할

Nginx는 사용자의 요청을 대신 받아서 내부 서버로 전달한다.
즉, 애플리케이션 서버를 외부에 직접 노출하지 않고 앞단에서 감싸주는 역할을 한다.

2.3 HTTPS 처리

실무에서는 HTTPS가 기본이다.
Nginx는 SSL/TLS 인증서를 적용하고, 암호화된 연결을 처리하는 지점으로 자주 사용된다.

2.4 정적 파일 처리

HTML, CSS, JS, 이미지 같은 정적 파일은 Nginx가 매우 효율적으로 처리할 수 있다.
그래서 프론트엔드 정적 배포 시에도 많이 쓰인다.

2.5 요청 분기

하나의 도메인 아래에서 경로별로 다른 서버로 요청을 나눌 수 있다.

예시:

  • / -> 프론트엔드
  • /api -> Spring Boot
  • /ai -> FastAPI

2.6 로드밸런싱

같은 애플리케이션 서버가 여러 대 있을 때 요청을 분산할 수도 있다.


3. Nginx를 이해할 때 꼭 알아야 하는 개념

3.1 웹서버

웹서버는 HTTP 요청을 받아 응답하는 서버다.
정적 파일을 직접 응답하는 것이 대표적이다.

예:

  • HTML 파일 응답
  • 이미지 응답
  • CSS, JS 응답

Nginx는 웹서버로서 이 역할을 매우 잘 수행한다.

3.2 리버스 프록시

프록시는 “대신 처리해주는 중간 서버”라고 생각하면 된다.

  • 포워드 프록시: 클라이언트 대신 외부 서버에 접근
  • 리버스 프록시: 서버 대신 클라이언트 요청을 받음

Nginx는 대표적인 리버스 프록시다.
사용자는 Nginx와 통신하지만, 실제 비즈니스 로직은 뒤에 있는 Spring Boot나 FastAPI가 처리한다.

3.3 SSL/TLS 종료

HTTPS 통신을 처리하는 위치를 SSL 종료 지점이라고 한다.

Nginx가 HTTPS 연결을 받고, 내부 애플리케이션 서버와는 HTTP로 통신하는 구조가 흔하다.

즉:

사용자 -- HTTPS --> Nginx -- HTTP --> Spring Boot

이렇게 하면 애플리케이션 서버가 인증서 처리까지 직접 하지 않아도 된다.

3.4 업스트림(Upstream)

Nginx가 요청을 전달하는 대상 서버를 업스트림이라고 한다.

예를 들어 Spring Boot가 127.0.0.1:8080에서 실행 중이라면, 이 서버가 업스트림이다.

3.5 서버 블록(server block)

Apache의 VirtualHost와 비슷한 개념이다.
도메인별, 포트별 설정 단위를 의미한다.

예를 들어:

  • api.example.com용 설정
  • admin.example.com용 설정

이렇게 분리해서 관리할 수 있다.

3.6 location 블록

경로별 처리 규칙을 정의하는 영역이다.

예시:

location /api/ {
    proxy_pass http://127.0.0.1:8080;
}

location /static/ {
    root /var/www/html;
}

4. 실무에서 가장 흔한 구조

백엔드 개발자가 가장 자주 보게 되는 구조는 아래와 같다.

사용자 -> Cloudflare / ALB -> Nginx -> Spring Boot / FastAPI

혹은 단순하게는:

사용자 -> Nginx -> Spring Boot

이 구조의 장점

  • 외부에는 80, 443 포트만 노출 가능
  • 내부 애플리케이션 포트 보호 가능
  • HTTPS 처리 쉬움
  • 여러 애플리케이션을 한 서버에서 분기 가능
  • 로그, 헤더, 캐시, 압축 설정을 앞단에서 통합 관리 가능

5. Nginx와 AWS의 관계

많이 헷갈리는 부분이 이것이다.

AWS를 쓴다고 해서 Nginx가 자동으로 설치되거나 기본 제공되지는 않는다.

AWS는 인프라를 제공하는 플랫폼이고, Nginx는 그 위에 사용자가 직접 설치하는 소프트웨어다.

예시

  • EC2 사용 시: 직접 Nginx 설치 가능
  • ECS/EKS 사용 시: 컨테이너 내부에 Nginx 포함 가능
  • ALB 사용 시: 일부 역할을 AWS 서비스가 대신 수행 가능

즉, Nginx는 AWS의 기본 구성요소가 아니라 선택적으로 사용하는 앞단 소프트웨어다.


6. Nginx와 Cloudflare는 같은가

완전히 같지는 않다.
역할이 일부 겹치지만, 레이어가 다르다.

Nginx

  • 내 서버 앞에서 동작
  • 웹서버
  • 리버스 프록시
  • 로드밸런싱
  • SSL 종료
  • 정적 파일 처리

Cloudflare

  • 인터넷과 내 서버 사이에서 동작
  • CDN
  • DDoS 방어
  • WAF
  • DNS
  • 캐싱
  • 봇 차단

흐름으로 보면 보통 다음과 같다.

사용자 -> Cloudflare -> Nginx -> 애플리케이션

Cloudflare는 바깥쪽 보호막이고, Nginx는 서버 바로 앞단 제어 지점이다.


7. Nginx 기본 구축 흐름

우분투 서버 기준으로 가장 흔한 구축 순서는 아래와 같다.

7.1 설치

sudo apt update
sudo apt install nginx -y

7.2 실행 및 자동 시작 등록

sudo systemctl start nginx
sudo systemctl enable nginx

7.3 상태 확인

systemctl status nginx
nginx -v

7.4 애플리케이션 실행

예를 들어 Spring Boot가 8080에서 실행 중이어야 한다.

java -jar app.jar

또는 FastAPI라면:

uvicorn main:app --host 0.0.0.0 --port 8000

7.5 Nginx 설정 작성

보통 아래 경로 중 하나를 사용한다.

  • /etc/nginx/sites-available/서비스명
  • /etc/nginx/conf.d/서비스명.conf

7.6 문법 검사 및 반영

sudo nginx -t
sudo systemctl reload nginx

8. 가장 기본적인 설정 예시

Spring Boot가 8080 포트에서 실행된다고 가정해보자.

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        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;
    }
}

이 설정이 의미하는 것

  • 80 포트로 요청을 받음
  • api.example.com 도메인에 적용
  • 모든 요청을 127.0.0.1:8080으로 전달
  • 원래 클라이언트의 IP, Host, 프로토콜 정보를 헤더에 담아 전달

9. proxy_set_header를 왜 설정할까

처음 Nginx를 사용할 때 가장 자주 복붙하게 되는 설정이 바로 이것이다.

proxy_set_header Host $host;
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;

이 값들은 뒤에 있는 애플리케이션 서버가 원래 요청 정보를 알 수 있게 해준다.

각각의 의미

  • Host: 원래 요청 도메인
  • X-Real-IP: 실제 클라이언트 IP
  • X-Forwarded-For: 프록시 체인을 포함한 클라이언트 IP 목록
  • X-Forwarded-Proto: 원래 요청 프로토콜(http/https)

예를 들어 Spring Boot에서 HTTPS 여부나 클라이언트 IP를 올바르게 판단하려면 이 헤더가 중요하다.


10. 프론트엔드 + 백엔드 분기 예시

하나의 도메인에서 프론트엔드와 API를 함께 서비스할 수도 있다.

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        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;
    }
}

이 구조의 의미

  • / 경로는 정적 프론트엔드 파일 응답
  • /api/ 경로는 Spring Boot로 전달

SPA 프론트엔드와 백엔드를 함께 배포할 때 자주 보이는 구조다.


11. HTTPS 적용

실무에서는 HTTPS가 사실상 기본이다.
보통 Let’s Encrypt와 certbot을 함께 사용한다.

설치

sudo apt install certbot python3-certbot-nginx -y

인증서 발급 및 Nginx 자동 설정

sudo certbot --nginx -d api.example.com

이 명령은 Nginx 설정을 읽어서 인증서를 적용하고, 443 설정과 리다이렉트까지 자동으로 잡아주는 경우가 많다.


12. 자주 쓰는 명령어

버전 확인

nginx -v

설정 문법 검사

sudo nginx -t

재시작

sudo systemctl restart nginx

재로드

설정만 다시 반영할 때 주로 사용한다.

sudo systemctl reload nginx

상태 확인

systemctl status nginx

설정 파일 확인

ls /etc/nginx
ls /etc/nginx/sites-available
ls /etc/nginx/sites-enabled
cat /etc/nginx/nginx.conf

proxy_pass 사용 여부 확인

grep -R "proxy_pass" /etc/nginx

13. 실무에서 자주 겪는 문제

13.1 502 Bad Gateway

가장 흔한 에러 중 하나다.
보통 Nginx는 살아 있는데, 뒤에 있는 애플리케이션 서버가 죽어 있거나 연결이 안 될 때 발생한다.

확인 포인트

  • Spring Boot/FastAPI 프로세스가 실제로 떠 있는가
  • proxy_pass 대상 포트가 맞는가
  • 내부에서 curl http://127.0.0.1:8080이 되는가

13.2 403 Forbidden

파일 권한 문제나 root 경로 설정 오류일 수 있다.

13.3 설정 반영 안 됨

수정 후 reload를 안 했거나, 심볼릭 링크가 잘못되었을 수 있다.

13.4 HTTPS 리다이렉트 꼬임

Cloudflare, ALB, Nginx가 동시에 HTTPS 리다이렉트를 처리하면 충돌하는 경우가 있다.


14. 백엔드 개발자가 특히 이해해야 하는 포인트

Nginx를 인프라 전용 도구라고 생각하면 오히려 실무 이해가 부족해질 수 있다.
백엔드 개발자도 최소한 아래는 알아야 한다.

14.1 애플리케이션은 내부 포트에서 동작하고, 외부 요청은 Nginx가 받는다는 점

즉, 사용자는 443으로 접속하지만 실제 앱은 8080에서 돌 수 있다.

14.2 프록시 헤더를 이해해야 한다는 점

클라이언트 IP, HTTPS 여부, 원래 Host 정보는 프록시를 거치며 헤더로 전달된다.

14.3 배포 문제의 상당수가 Nginx 설정에서 발생한다는 점

코드는 멀쩡한데 502, CORS, 리다이렉트 문제는 Nginx 설정 문제인 경우가 많다.

14.4 경로 설계에 따라 Nginx 설정이 달라진다는 점

/api, /admin, /ai 같은 경로 전략은 운영 구조와 밀접하다.


15. 면접용 한 줄 정리

면접에서는 아래 정도로 정리하면 충분히 좋다.

Nginx는 웹서버이자 리버스 프록시 서버로, 클라이언트 요청을 먼저 받아 정적 리소스를 직접 처리하거나 내부 애플리케이션 서버로 전달합니다. 실무에서는 HTTPS 종료, 요청 라우팅, 정적 파일 서빙, 로드밸런싱 등의 목적으로 Spring Boot나 FastAPI 앞단에 자주 배치합니다.


16. 초보자가 기억하면 좋은 핵심 요약

딱 이것만 기억해도 처음 이해하는 데 충분하다.

  1. Nginx는 서버 앞단에서 요청을 받는 소프트웨어다.
  2. 웹서버이면서 리버스 프록시 역할도 한다.
  3. Spring Boot, FastAPI를 외부에 직접 노출하지 않고 Nginx 뒤에 두는 구조가 흔하다.
  4. HTTPS, 정적 파일, 요청 분기, 로드밸런싱에 강하다.
  5. 실무에서 502, 경로 분기, 헤더 전달 문제를 이해하려면 Nginx를 알아야 한다.

마무리

Nginx는 단순히 “설치해서 쓰는 툴”이 아니라, 백엔드 서비스의 외부 요청이 어떻게 내부 애플리케이션으로 도달하는지를 이해하게 해주는 중요한 도구다.

특히 서버 운영, 배포, HTTPS, 프록시, 로드밸런싱을 공부할수록 Nginx의 역할이 더 선명하게 보인다.
백엔드 개발자라면 복잡한 옵션을 모두 외울 필요는 없지만, 최소한 웹서버, 리버스 프록시, HTTPS 처리, 프록시 헤더, 기본 설정 흐름 정도는 확실히 이해하고 있어야 한다.


부록: 실무형 최소 설정 템플릿

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        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;
    }
}

이 템플릿은 Spring Boot나 FastAPI 앞단에 Nginx를 붙일 때 가장 기본이 되는 구조다.

'개발' 카테고리의 다른 글

[코드트리] 2차원배열 알고리즘 약점 극복 학습 후기  (1) 2026.05.24
[코드트리 후기] 오랜만에 코딩테스트 준비해보기 갭체크부터 시작!  (0) 2026.05.17
Spring Security 오픈소스 기여 후기  (0) 2026.01.22
AWS 크레딧 1000불 받는 방법 (승인 실패 후 재검토 받는법)  (0) 2025.11.05
RESTful API 완벽 가이드  (0) 2025.10.16
    '개발' 카테고리의 다른 글
    • [코드트리] 2차원배열 알고리즘 약점 극복 학습 후기
    • [코드트리 후기] 오랜만에 코딩테스트 준비해보기 갭체크부터 시작!
    • Spring Security 오픈소스 기여 후기
    • AWS 크레딧 1000불 받는 방법 (승인 실패 후 재검토 받는법)
    jundev
    jundev

    티스토리툴바