리버스 프록시 설정

LinuxBeginner
지금 연습하기

소개

이 실습에서는 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 ok
test 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.

방금 어떤 일이 일어났나요?

  1. 여러분이 /app/을 요청하여 Nginx(localhost:80) 에 접속했습니다.
  2. Nginx가 규칙을 확인하고 /app과 일치하는 항목을 찾은 다음 proxy_pass 지시어를 따랐습니다.
  3. Nginx가 포트 8000 의 Python Server에 요청을 보냈습니다.
  4. Python Server가“Hello...”페이지를 Nginx 에 반환했습니다.
  5. Nginx가“Hello...”페이지를 여러분에게 반환했습니다.

이 요청 흐름은 현대 인프라 곳곳에서 사용되므로 기억해 두는 것이 좋습니다.

브라우저 -> 리버스 프록시 -> 애플리케이션 서버 -> 리버스 프록시 -> 브라우저

리버스 프록시를 성공적으로 구축했습니다!

요약

이 실습에서는 Nginx 를 리버스 프록시로 성공적으로 구성했습니다. 다음 작업을 수행했습니다.

  1. Python 을 사용하여 간단한 백엔드 애플리케이션을 호스팅했습니다.
  2. 라우팅을 위한 location 블록으로 Nginx 를 구성했습니다.
  3. proxy_pass 지시어를 사용하여 트래픽을 전달했습니다.
  4. curl을 사용하여 프록시 요청 체인을 확인했습니다.

이 아키텍처는 현대 웹 애플리케이션의 기반입니다. 다른 애플리케이션이 백그라운드에서 로직을 처리하는 동안 Nginx 를 보안과 로드 밸런싱에 활용할 수 있습니다.