소개
이 실습에서는 Nginx 를 리버스 프록시로 구성하는 방법을 배웁니다.
리버스 프록시는 대기업의 안내 데스크와 비슷합니다. 대표 번호로 전화했을 때 CEO 나 지원 팀과 직접 통화하지 않습니다. 안내 데스크 직원에게 먼저 연결되어“무엇을 도와드릴까요?”라는 질문을 받고, 안내 데스크 직원이 적절한 담당자에게 전화를 연결합니다.
이 시나리오에서는 다음과 같습니다.
- Nginx는 안내 데스크입니다 (포트 80 에서 수신 대기).
- Python App은“지원 팀”입니다 (포트 8000 에서 수신 대기).
- 여러분은 전화를 거는 클라이언트입니다.
누군가 /app을 요청하면 Nginx 가 요청을 Python 서버로 전달하고, Python 서버의 응답을 클라이언트에게 반환하도록 Nginx 를 설정합니다.
리버스 프록시는 현대적인 웹 아키텍처의 핵심 요소입니다. 애플리케이션 서버 앞에서 안정적인 공개 진입점을 제공하며, TLS 종료, 로드 밸런싱, 캐싱, 요청 라우팅도 처리할 수 있습니다.
즉, Nginx 가 항상 직접 파일을 제공하는 것은 아닙니다. 경우에 따라 Nginx 의 주요 역할은 클라이언트 트래픽을 수신한 다음 뒤에 있는 다른 서비스로 전달하는 것입니다.
백엔드 애플리케이션 시작
먼저 요청을“프록시”할 대상이 필요합니다. Python 을 사용해 매우 간단한 웹 애플리케이션을 만듭니다.
애플리케이션이 파일을 제공할 전용 디렉터리를 만듭니다.
프로젝트 디렉터리 안에 app이라는 디렉터리를 만들고 그 안에 간단한 HTML 파일을 생성합니다.
mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html
이제 Python 서버를 시작합니다. 다음 명령은 Python 이 현재 디렉터리의 파일을 포트 8000에서 제공하는 웹 서버로 동작하도록 합니다.
이 Python 프로세스는 이 예제의 백엔드 애플리케이션 서버입니다. 실제 콘텐츠 생성을 담당하고, Nginx 는 앞단에서 외부 요청을 받는 진입점 역할을 합니다.
끝에 & 기호를 붙이면 서버가 백그라운드에서 실행됩니다. 서버가 조용히 실행되는 동안 터미널을 계속 사용할 수 있습니다.
cd ~/project
python3 -m http.server 8000 &
서버가 정상적으로 시작되었는지 확인합니다. 포트 8000 에서 수신 대기 중인 프로세스를 찾습니다.
netstat -tuln | grep 8000
0.0.0.0:8000 및 (LISTEN)이 표시된 출력을 확인할 수 있어야 합니다. 이는“백엔드 앱”이 포트 8000 에서 요청을 받을 준비가 되었다는 뜻입니다.
Nginx 리버스 프록시 구성
이 단계에서는 Python 앱을 사용하도록 Nginx 구성 파일을 수정합니다.
sudo와 nano 텍스트 편집기를 사용하여 기본 구성 파일을 편집합니다.
sudo nano /etc/nginx/sites-enabled/default
server { ... } 블록 안에서 아래쪽으로 이동합니다. 기존 location / { ... } 블록을 찾을 수 있습니다. 그 아래에 새로운 location /app 블록을 추가합니다.
파일에 다음 코드를 추가합니다. 중괄호 { }와 세미콜론 ;을 정확히 입력해야 합니다.
location /app {
proxy_pass http://127.0.0.1:8000;
}
이 설정은 무엇을 하나요?
location /app:/app으로 시작하는 요청을 Nginx 가 처리하도록 지정합니다.proxy_pass ...: 전화를 연결하는 버튼과 같은 역할을 합니다./app요청을 받으면 Nginx 가localhost(127.0.0.1) 의 포트 8000 으로 요청을 전달하도록 지정합니다.
이 전달 과정이 리버스 프록시의 핵심입니다. 클라이언트는 Nginx 와 통신하지만, Nginx 가 클라이언트를 대신하여 백엔드 서버의 클라이언트가 됩니다.
파일 구조는 다음과 비슷해야 합니다.
server {
listen 80 default_server;
...
location / {
try_files $uri $uri/ =404;
}
location /app {
proxy_pass http://127.0.0.1:8000;
}
}
Ctrl+O를 누른 다음 Enter 키를 눌러 파일을 저장하고, Ctrl+X를 눌러 nano를 종료합니다.
구성 확인 및 다시 로드
구성 파일은 수정했지만 Nginx 는 아직 이전 규칙을 사용하고 있습니다. 변경 사항을 적용하려면 서비스를 다시 로드해야 합니다.
먼저 다시 로드하기 전에 구성에 오타가 없는지 항상 테스트합니다. 잘못된 구성을 다시 로드하면 웹 서버가 완전히 작동하지 않을 수 있습니다.
다음 테스트 명령을 실행합니다.
sudo nginx -t
다음 메시지가 표시되어야 합니다.
syntax is oktest is successful
테스트가 통과하면 Nginx 를 다시 로드하여 변경 사항을 적용합니다.
sudo service nginx reload
이제 Nginx 가 새 설정을 적용했으며 요청을 전달할 준비가 되었습니다.
이 시점의 Nginx 는 디스크에서 파일을 읽어 제공하는 파일 서버뿐 아니라 URL 과 백엔드 서비스 사이에서 요청을 전달하는 라우터로 동작합니다.
프록시 테스트
마지막 단계에서는“안내 데스크”가 제대로 동작하는지 확인합니다.
Nginx(포트 80) 에 /app/을 요청하는 웹 요청을 보냅니다. Nginx 는 이 요청을 Python 서버 (포트 8000) 로 즉시 전달해야 합니다.
다음 명령을 실행합니다.
curl http://localhost/app/
백엔드 서버가 반환한 다음 메시지가 표시되어야 합니다.
Hello from the Python Backend.
방금 어떤 일이 일어났나요?
- 여러분이
/app/을 요청하여 Nginx(localhost:80) 에 접속했습니다. - Nginx가 규칙을 확인하고
/app과 일치하는 항목을 찾은 다음proxy_pass지시어를 따랐습니다. - Nginx가 포트 8000 의 Python Server에 요청을 보냈습니다.
- Python Server가“Hello...”페이지를 Nginx 에 반환했습니다.
- Nginx가“Hello...”페이지를 여러분에게 반환했습니다.
이 요청 흐름은 현대 인프라 곳곳에서 사용되므로 기억해 두는 것이 좋습니다.
브라우저 -> 리버스 프록시 -> 애플리케이션 서버 -> 리버스 프록시 -> 브라우저
리버스 프록시를 성공적으로 구축했습니다!
요약
이 실습에서는 Nginx 를 리버스 프록시로 성공적으로 구성했습니다. 다음 작업을 수행했습니다.
- Python 을 사용하여 간단한 백엔드 애플리케이션을 호스팅했습니다.
- 라우팅을 위한
location블록으로 Nginx 를 구성했습니다. proxy_pass지시어를 사용하여 트래픽을 전달했습니다.curl을 사용하여 프록시 요청 체인을 확인했습니다.
이 아키텍처는 현대 웹 애플리케이션의 기반입니다. 다른 애플리케이션이 백그라운드에서 로직을 처리하는 동안 Nginx 를 보안과 로드 밸런싱에 활용할 수 있습니다.



