1. Reverse Proxy란?
정의 한 줄 요약
클라이언트(사용자) 대신 앞에서 요청을 받아서,
뒤에 숨겨진 서버들(앱 서버, gunicorn/Django 등)로 전달해 주는 서버
흐름은 이렇게 된다.
브라우저(사용자)
↓
Nginx (Reverse Proxy)
↓
Gunicorn / Django (백엔드 서버)
- 브라우저 입장에서는 Nginx만 보임
- 뒤에 어떤 서버가 몇 개 있는지, 포트가 뭔지는 모름
- Nginx가 요청을 보고 적절한 서버로 대신 보내준다
2. Forward Proxy vs Reverse Proxy 차이
헷갈리기 쉬운 개념이라 간단히만 비교.
Forward Proxy (정방향 프록시)
- 클라이언트 쪽에 붙어 있는 프록시
- 회사/학교에서 쓰는 인터넷 프록시, VPN 같은 느낌
- 서버는 “프록시를 통해 오는 사용자”만 본다
클라이언트 → Forward Proxy → 인터넷의 서버들
Reverse Proxy (역방향 프록시)
- 서버 쪽 입구에 붙어 있는 프록시
- 외부 요청을 대신 받아서 내부 서버로 전달
- 클라이언트는 뒤에 뭐가 있는지 모른다
클라이언트 → Reverse Proxy(Nginx) → 내부 서버들(gunicorn, Node, etc)
3. Nginx + Django 배포 구조에서 Reverse Proxy
Django를 “정석 배포”할 때 자주 쓰는 구조:
브라우저
↓
Nginx (80/443 포트, reverse proxy)
↓
Gunicorn (127.0.0.1:8000 같은 내부 포트)
↓
Django 앱
Nginx 설정 예시
upstream django_server {
server 127.0.0.1:8000; # gunicorn이 떠 있는 내부 주소
}
server {
listen 80;
server_name quizai.juwonpark.me;
location / {
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;
proxy_pass http://django_server;
}
}
여기서 reverse proxy 핵심은 이 한 줄이다.
proxy_pass http://django_server;
- Nginx가 받은 요청을
django_server(= 127.0.0.1:8000)로 대신 보내는 라인 - 클라이언트 → Nginx → gunicorn/Django 흐름이 여기서 연결된다
proxy_set_header 들은 “원래 요청 정보(Host, IP, 스킴)”를 Django 쪽에 넘겨주기 위한 헤더들이다.
Django 설정의 SECURE_PROXY_SSL_HEADER, USE_X_FORWARDED_HOST 같은 옵션과 연결된다.
4. 왜 Reverse Proxy를 쓰는가? (장점 정리)
-
보안 / 은닉
- 실제 앱 서버(gunicorn)는
127.0.0.1:8000같은 내부 주소에서만 열어두고 외부에는 Nginx(80/443)만 공개 → 직접 접근을 막을 수 있다.
- 실제 앱 서버(gunicorn)는
-
HTTPS(SSL/TLS) 처리
- HTTPS 암·복호화를 Nginx에서 처리하고 뒤의 gunicorn <–> Django는 HTTP로만 통신해서 설정이 단순해진다.
-
정적/미디어 파일 분리
/static/,/media/요청은 Nginx가 파일 시스템에서 바로 서빙- Django가 직접 파일을 서빙하는 것보다 훨씬 빠르고 효율적이다.
-
여러 서비스 라우팅
-
한 도메인에서 경로에 따라 다른 서비스로 라우팅 가능
/→ Django/blog→ Jekyll
-
“입구는 하나, 안에서는 여러 서비스” 구조를 만들 수 있다.
-
-
로드밸런싱(확장용)
- 같은 Django 서버를 여러 대 띄우고, Nginx가 요청을 분산시킬 수 있다.
5. 오늘 내용 한 줄 요약
- Reverse Proxy = “사용자 대신 앞에서 요청을 받아서, 뒤에 있는 백엔드 서버로 전달해 주는 서버(Nginx)”
- Django 배포에서의 구조 = 브라우저 → Nginx(reverse proxy) → gunicorn → Django
- 주소/포트는 보통
gunicorn: 127.0.0.1:8000, Nginx가 여기를proxy_pass로 물어준다.
결론
- reverse proxy는 서버로 들어오기 전 한번 걸러주는 곳이다 nginx가 그 역할을 한다