2013-03-31 5 views
2

성능상의 이유로 웹 인프라의 일부를 다시 작성해야했습니다.요청을 프록시 할 수있는 HTTP 서버

이 목적으로 C++에서 웹 응용 프로그램으로 중요한 부분을 작성했습니다. 이 웹 응용 프로그램은 주어진 포트에서 수신 대기하고 한 번에 정확히 하나의 TCP 연결을 허용하며 현재 연결에서 수신하는 모든 HTTP 요청을 처리합니다.

당신은 포트 8080에서 수신하도록 다음과 같이 시작할 수 있습니다 : 그것은 완벽 훨씬 이전보다 빠르게 작동하지만

./webapp 8080 

, 그 제한은 응용 프로그램의 한 연결에서-A-시간 본성 . 하나의 응용 프로그램 인스턴스로 둘 이상의 연결을 통해 HTML 페이지, 자바 스크립트 및 이미지를 동시에 제공 할 수 없습니다.

이 제한을 극복하기 위해 포트 80에서 수신 대기하는 프런트 엔드 역방향 프록시 HTTP 서버를 실행하고 배경에서 실행중인 웹 응용 프로그램의 여러 인스턴스에서 들어오는 HTTP 요청을 고르게 리디렉션합니다. 이 인스턴스는 다음과 같이 부팅시에 작성할 수 있습니다 :

프론트 엔드는 시작 시간 각 웹 응용 프로그램 영구적 HTTP 연결을 설정하도록 구성하고 앞으로 들어오는 HTTP 요청을해야

./webapp 10000 
./webapp 10001 
./webapp 10002 
./webapp 10003 
./webapp 10004 
./webapp 10005 
./webapp 10006 
./webapp 10007 
./webapp 10008 
./webapp 10009 
실행중인 웹 앱 중 하나인데,이를 균등하게 퍼뜨립니다.

리버스 프록시는 클라이언트에서 자체 SSL을 지원해야합니다. SPDY의 지원은 더할 나위없이 좋지만 반드시 필요한 것은 아닙니다.

제 질문은 : 어떤 HTTP 역 프록시가 내 시나리오에서 프론트 엔드로 작동 할 수 있습니까? 당신이 하나 이상의 것을 알고 있다면, 각각의 장단점은 무엇입니까?

답변

0

단일 연결 서버 만 사용하려는 동기는 무엇입니까? 그것은 웹 서버에 대한 끔찍한 선택 인 것 같습니다. 사이트가 나타날 때마다 각 클라이언트 브라우저는 일반적으로 수십 개의 요청을 병렬로 전송합니다.

TCP 연결로 프로세스를 생성하면 성능이 저하됩니다. 정말, 당신이 여기 찾고있는 대신 멀티 프로세스 기반의 다중 스레드 서버 (? 다른 프로세스를 가지고있는 점은 무엇인가) 아직

, 여러 경로가 당신이 아래로 갈 수있다이다 :

  • 실제로 별도의 프로세스가 필요한 경우 요청을받을 때마다 webapp을 포크합니다. 성능면에서 좋은 것은 아니지만 생각할 수있는 초기 질문과 가장 비슷합니다.

  • 당신은 싱글 스레드 webapp으로 머무르고 있지만 수신 대기 소켓 목록을 유지 관리하고 트래픽을 전달하는 "버디 소켓"과 쌍을 이룹니다 (두 가지 방법으로 모두 작동 함) . 그래도 커널 호출로 인해 최적의 성능을 발휘하지 못합니다.

  • 각 요청에 대해 새 스레드를 생성 한 다음 단일 스레드 아키텍처와 마찬가지로이 스레드에서만이 요청을 처리합니다.

나는 당신 이었지만 단순히 해결책 3으로 바뀌 었습니다. 왜냐하면 그것이 최선의 선택 이었기 때문입니다. 단일 쓰레드 방식 (소켓 쌍)에 가깝기 때문에 문제가 많지 않으며 모든 곳에서 프로세스를 포크하는 성능이 떨어집니다.

나는 그것이 이러한 상황을 처리 할 수있는 표준적인 방법이 아니기 때문에 당신이 당신의 요구에 맞는 웹 서버를 찾을 생각하지 않는다, 나는 누군가가 그것을 :) 개발하기 위해 시간이 걸렸 의심

편집 :

좋아요, 편집하신 후 문제가 발생했습니다.

아직 해결해야 할 문제는 여전히 동일합니다. 프로세스에 트래픽을 보내는 프로세스가 필요합니다. 나는 당신이 상자에서 그런 디스패처를 찾을 것이라고 생각하지 않는다. 그래서 내가 언급 한 세 기술 중 하나를 사용하여 구현해야 할 것이다.

당신이 그것에 대해 생각한다면, 당신은 실제로 프록시의 한면을 구현하려고 노력하고 있고 다른면은 당신의 webapp으로 전달하는 것입니다. 그래서 IMHO 프록시 기술을 사용해야합니다.

+0

나는 당신의 노력에 감사하지만, 모든 정직에서 난 당신이 내 질문을 읽고 생각하지 않습니다. 단일 연결 서버를 사용하려는 동기는 휠을 다시 발명하고 싶지 않았기 때문입니다. 필자는 성능에 중요한 부분을 다시 작성하고 연결 풀링 등을 기존의 웹 서버보다 성숙한 상태로 유지하려고했습니다. 모든 TCP 연결마다 새 프로세스를 생성하고 싶지 않습니다. 그래서 부팅 할 때 * 프로세스를 생성하고 프론트 엔드를 구성하여 시작시 각 웹 응용 프로그램에 영구적 인 HTTP 연결을 설정해야한다고 말한 것입니다. – JohnCand

+0

본질적으로, 좋은 http://en.wikipedia.org/wiki/Reverse_proxy를 찾고 있습니다 (오른쪽 및 예제 이미지 참조). – JohnCand

+0

질문을 수정하여 더 명확하게했습니다. 나는 그것이 도움이되기를 바랍니다. – JohnCand

0

리버스 프록시가 반드시 필요한 것은 아니지만로드 밸런서가 필요합니다. HAProxy을 설정하여 각 webapp 프로세스가 하나의 백엔드로 계산 된 다음 모든 새로운 연결이 목록의 다음 프로세스로 이동하도록 라운드 로빈 균형 조정을 수행합니다.

Nginx도이 작업을 수행 할 수 있지만로드 밸런싱과 함께 제공되는지 또는 추가 모듈인지는 확실하지 않습니다. Nginx의 장점은 CSS 및 이미지와 같은 정적 자산을 캐시 할 수 있다는 것입니다.

0

Nginx에 좋은 옵션

장점입니다 :

  • 가 상자 밖으로 load balancing 지원 SSL 종료를 지원
  • Upstream keepalive 연결
  • 는 SPDY 지원이에게 (비록 어떤 서버 푸시 없음) . 최신 버전은 spdy가 제거 된 상태로 http2 지원을 추가합니다.

단점 :

  • 당신은 아래의 nginx 구성에서 업스트림 서버를 하드 코딩해야합니다. 환경 변수를 통해 동적으로 업 스트림 서버 설정을 읽는 쉬운 방법은 없습니다.

    http { 
        upstream myapp1 { 
         server localhost:10000; 
         server localhost:10001; 
         server localhost:10002; 
        } 
        server { 
         listen 443 ssl spdy; 
    
         location/{ 
          proxy_pass http://myapp1; 
         } 
        } 
    } 
    
관련 문제