티스토리 뷰

Infra Structure/.system

Reverse Proxy란?

가그린민트 2019. 4. 6. 19:05

이 포스팅은, 서버/인프라를 지탱하는 기술을 읽고 진행하는 스터디의 내용을 정리하였습니다.

왜 리버스 프락시를 도입해야 하는가?

  • Reverse Proxy란,
    Reverse Proxy는 클라이언트로부터의 요청을 받아서(필요하다면 주위에서 처리한 후) 적절한 웹 서버로 요청을 전송한다. 웹 서버는 요청을 받아서 평소처럼 처리를 하지만, 응답은 클라이언트로 보내지 않고 Reverse Proxy로 반환한다. 요청을 받은 Reverse Proxy는 그 응답을 클라이언트로 반환한다.
    통상의 프락시 서버는 LAN -> WAN의 요청을 대리로 수행하지만 Reverse Proxy는 WAN -> LAN의 요청을 대리한다.
    클라이언트로부터의 요청이 웹서버로 전달되는 도중의 처리에 끼어들어서 다양한 전후처리를 시행할 수가 있게 된다.

  • HTTP 요청 내용에 따른 시스템의 동작 제어
    mod_rewrite의 RewriteRule 기능

    • 클라이언트의 IP 주소를 보고 특정 IP 주소만 서버로의 접속을 허가한다.
    • 클라이언트의 User-Agent를 보고 특별한 웹서버로 접속되도록 유도한다.
      (봇의 경우 캐시서버로 전달)
  • 시스템 전체의 메모리 사용효율 향상
    동적 콘텐츠를 반환하는 웹서버는 통상 애플리케이션이 이용하는 프로그램을 메모리에 상주시킴으로써, 애플리케이션 기동시의 오버헤드를 회피할 수 있게 설계되어 있다. 통상 WAS 서버는 클라이언트의 하나의 요청에 대해 하나의 프로세스 또는 하나의 쓰레드를 할당해서 처리하는 방식을 취하고 있다. 각각의 프로세스/쓰레드는 다른 프로세스/쓰레드와는 독립적으로 동작한다. 이로 인해 애플리케이션 개발자는 리소스 경합을 신경쓰지 않고 프로그램을 개발할 수 있으므로, 애플리케이션 설계가 쉽고 편해진다는 장점이 있다. 그러나 이 경우 이미지나 자바스크립트, CSS와 같은 정적 컨텐츠를 반환하는, 즉 파일에 쓰인 내용을 그대로 반환하기만 하면 될 경우도 동일한 방식으로 반환하게 된다.

    Reverse Proxy를 사용하여 URL 기준으로 요청을 분기할 경우 이 문제를 해결하여 메모리 사용효율을 향상할 수 있다.  
    고 책에서는 말한다. 
    옛날에는 Tomcat의 정적 리소스 처리 성능이 낮았기에 Apache를 프록시로 붙여서 사용하는 케이스가 많았다.
    하지만 현재는 Tomcat의 정적 리소스 처리 성능이 나쁘지 않다. 
    또한 맨 앞단에 정적 리소스 처리를 위한 캐시 서버를 두는 경우엔 더더욱 영향이 적을 것으로 예상된다. 
    게다가 정적 리소스 처리(보통은 이미지나 js, css 등임)만을 위해 Proxy를 두는 것은 구조상의 복잡함을 야기하게 된다.
    * 캐시서버 동작방식
      - 클라이언트로부터 송신된 If-Modified-Since의 갱신 일시 수신
      - 로컬 문서의 날짜 비교
      - 클라이언트가 저장한 문서는 갱신되지 않았다고 판단 (304 Not Modified)
  • 웹 서버가 응답하는 데이터의 버퍼링의 역할
    HTTP의 Keep-Alive
    서버측이 Keep-Alive OK라는 지시를 HTTP 헤더로 브라우저에 알리면, 브라우저는 서버와의 접속을 계속 유지해서 Keep-Alive 사양을 따라 하나의 접속으로 여러 파일을 다운로드한다.
    Keep-Alive는 한번 연결된 접속을 당분간 유지하는 특성상, 웹 서버에 다소 부하를 야기한다. 구체적으로는 특정 클라이언트로부터 요청을 받은 프로세스/스레드는 그 시점으로부터 일정 시간 동안 해당 클라이언트로의 응답을 위해서 점유되는 것을 들 수 있다.
    Reverse Proxy의 경우 프로세스당 메모리 소비량이 그다지 많지 않으므로 하나의 호스트 내에 1000~10000 프로세스를 실행할 수도 있다. 이 경우에는 일부 프로세스가 Keep-Alive연결을 유지하기 위해 소비된다고 해도 문제가 되지 않는다.
    결국 클라이언트와 Reverse Proxy 사이에만 Keep-Alive on, Reverse Proxy와 백엔드 사이에는 Keep-Alive OFF로 설정한다.

  • tcp keep-alive관련하여 해당 글을 같이 읽어보자
    https://brunch.co.kr/@alden/9#comment

  • 아파치 모듈을 이용한 처리의 제어
    mod_deflate: 백엔드로부터 수신한 HTTP 응답을 클라이언트에 압축해서 보냄
    mod_ssl: 응답을 SSL로 암호화
    mod_dosdetector: 특정 클라이언트로부터 과도한 접속이 있을 경우 일시적으로 차단
    mod_proxy_balancer로 여러 호스트로 분산하기

    압축을 하여 성능향상이 큰지, 압축에 들어가는 리소스가 큰지 테스트를 먼저 하여야 한다.  
    SSL 암복호화는 CPU 리소스가 많은 작업이므로 proxy에 위임하는 것도 좋은 방법이다.

'Infra Structure > .system' 카테고리의 다른 글

네트워크(L1,L2)의 다중화(Bonding 드라이버, RSTP)  (1) 2019.04.10
MySQL Replication이란?  (0) 2019.04.07
다중화란?  (0) 2019.03.24
bufferbloat과 buffer overflow  (0) 2019.02.24
Elastic Stack #1  (0) 2019.02.10
댓글
링크
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday