20.1.리버스 프록시란?

리버스 프록시란 * 네트워크에서 말하는 프록시는 네트워크상의 다른 구성 요소를 대신해 네트워크 트래픽을 처리하는 네트워크 구성 요소를 말한다. * 회사 네트워크에서 웹 브라우저에서 전달되는 요청을 가로채 허용된 사이트인지 확인하거나 빠른 속도를 위해 접근하려는 사이트의 캐시를 제공하는 용도로 사용될 수 있다. * 리버스 프록시도 이와 비슷하게 여러 웹 애플리케이션으로 통하는 관문 역할을 한다. * 모든 트래픽은 리버스 프록시를 거치며 해당 트래픽이 어떤 애플리케이션에서 출발한 것인지 판단한다. * 또한, 애플리케이션의 응답 내용을 캐시해 두었다가 적절하게 가공해 클라이언트에게 전달하기도 한다.

  • 리버스 프록시는 포트를 외부로 공개한 유일한 컨테이너다.
  • 외부에서 들어오는 모든 요청을 먼저 받고 그에 맞는 컨테이너로부터 응답을 받아 온다.
  • 리버스 프록시 덕분에 모든 애플리케이션 컨테이너는 외부에 노출될 필요가 없고, 그만큼 스케일링, 업데이트, 보안 면에서 유리하다.

실습 엔진엑스는 인터넷의 30%를 차지할 정도로 오랫동안 리버스 프록시로 널리 쓰였다. 매우 가볍고 빠르고 강력한 HTTP 서버 기능을 갖춰 콘텐츠 제공 성능 못지 않은 프록시 성능을 보인다.

001) # 예제 애플리케이션을 위한 네트워크 생성(리눅스 컨테이너)
002)  docker network create ch20
003) 
004)  cd ch20/exercises
005) 
006) # 설정 파일을 바인드 마운트로 주입한 엔진엑스 컨테이너를 실행(리눅스 컨테이너)
007)  docker-compose -f nginx/docker-compose.yml -f nginx/override-linux.yml up -d
008) 
009) # 웹 브라우저에서 http://localhost에 접근
  1. 007: 컨테이너로 엔진엑스를 실행한다. 이 컴포즈 오버라이드 파일에 로컬 디렉터리를 바인드 마운트로 지정하며, 이 디렉터리에 사이트별 설정 파일이 위치한다.

  2. 리버스 프록시로 사용하려면 사이트별 설정 파일을 하나 추가해야 한다.

  3. 같은 포트를 통해 여러 개의 애플리 케이션을 호스팅하려면 이들을 먼저 구별할 수 있어야 하는데, 대개 도메인이 이 역할을 한다.
  4. 로컬 컴퓨터의 hosts 파일에 도메인을 추가하면 된다.
  5. 이 파일은 도메인과 IP 주소의 짝으로 이뤄진 간단한 파일로, 엔진엑스 컨테이너를 통해 여러 애플리케이션에 접근할 수 있게 해 준다.

실습 간단한 웹 애플리케이션 who-am-I를 공개 포트 없이 실행해 이 애플리케이션에 whoami.local 도메인으로 접근할 수 있게 해 보자.

001) # 도메인 whoami.local을 hosts 파일에 추가(맥 또는 리눅스)
002)  echo $'\n127.0.0.1 whoami.local' | sudo tee -a /etc/hosts
003) 
004) # who-am-I 컨테이너 실행
005)  docker-compose -f whoami/docker-compose.yml up -d
006) 
007) # 애플리케이션 설정 파일을 엔진엑스 설정 파일 디렉터리로 복사
008)  cp ./nginx/sites-available/whoami.local ./nginx/sites-enabled
009) 
010) # 엔진엑스를 재시작해 설정 업데이트
011)  docker-compose -f nginx/docker-compose.yml restart nginx
012) 
013) # 웹 브라우저에서 http://whoami.local 에 접근
  1. 008: 사이트 설정 파일을 엔진엑스 디렉터리로 복사한다. 이 파일에는 whoami.local에 대한 요청을 who-am-I 컨테이너로 전달하라는 설정이 들어 있다.

  2. 웹 브라우저 주소창에 http://whoami.local 을 입력하면 hosts 파일에 추가한 도메인 정보를 통해 로컬 컴퓨터로 연결된다.

  3. 엔진엑스 컨테이너는 이 요청을 전달받아 헤더에 포함된 호스트 정보 Host=http://whoami.local 을 이용해 해당하는 사이트 설정을 찾는다.
  4. 일치하는 사이트 설정이 있으면 해당 애플리케이션 컨테이너에서 콘텐츠를 받아와 요청에 응답한다.

예제 20-1 who-am-I 사이트에 대한 엔진엑스 프록시 설정 파일 * 엔진엑스 컨테이너가 도커 네트워크를 통해 애플리케이션 컨테이너에서 콘텐츠를 받아 오도록 한다

server {
    server_name whoami.local; # 도메인

    location / {
        proxy_pass             http://whoami;    # 콘텐츠가 위치한 주소
        proxy_set_header       Host $host;       # 호스트 정보를 콘텐츠 위치로 설정
        add_header             X-Host $hostname; # 응답의 호스트 정보를 프록시 이름으로 변경
    }
}
  • 리버스 프록시가 꼭 웹 사이트만을 대상으로 하는 것은 아니다.
  • HTTP로 제공되는 콘텐츠라면 무엇이든 대상이 될 수 있다.
  • 당연히 REST API도 가능하며, 그 외 유형의 트래픽(일반 TCP/IP나 gRPC)도 가능한 경우가 있다.
  • 이 설정의 효과는 엔진엑스가 단순히 요청을 전달하는 매개자 역할을 하는 것이다.
  • 요청을 받을 때마다 이를 처리할 컨테이너('업스트림' 이라고 한다)를 호출하고, 그 응답을 다시 클라이언트('다운스트림' 이라고 한다)로 전달한다.
  • 업스트림에 해당하는 애플리케이션에 이상이 발생하면 엔진엑스는 실패 응답을 다운스트림에 전달한다.

실습 hosts 파일에 도메인을 하나 더 추가한다. 그리고 무작위 숫자 애플리케이션의 API를 실행하고 여기에 엔진엑스를 통한 프록시를 적용한다. 이 API는 몇 번 호출된 후에는 이상을 일으키므로 서버 오류 코드 500을 볼 수 있을 것이다.

001) # 도메인을 hosts 파일에 추가
002)  echo $'\n127.0.0.1 api.numbers.local' | sudo tee -a /etc/hosts
003) 
004) # API 컨테이너를 실행
005)  docker-compose -f numbers/docker-compose.yml up -d
006) 
007) # 사이트 설정 파일을 엔진엑스 설정 파일 디렉터리로 복사
008)  cp ./nginx/sites-available/api.numbers.local ./nginx/sites-enabled/
009) 
010)  docker-compose -f nginx/docker-compose.yml restart nginx
011) 
012) # 웹 브라우저로 http://api.numbers.local/rng 에 접속해 여러 번 새로 고침하며 오류를 일으키는지 확인

links

social