2013-03-31 228 views
2

由於性能原因,我不得不重寫我們的Web基礎架構的一部分。HTTP服務器能夠代理請求

爲此,我將關鍵部分寫成了C++中的Web應用程序。此Web應用程序在給定端口上偵聽,一次只接受一個TCP連接,並處理當前連接上接收到的所有HTTP請求。

你可以象這樣開始到8080端口上監聽:

./webapp 8080 

雖然它完美的作品,並比以前更快,其侷限性是應用程序的一個連接,在一次一個性質。您只能通過一個應用程序實例通過多個連接同時提供HTML頁面,Javascript和圖像。

爲了克服這個限制,我想運行一個前端的反向代理HTTP服務器,它偵聽端口80,並在後臺運行我的web應用程序的多個實例上均勻地重定向傳入的HTTP請求。這些實例可以在系統啓動時創建這樣的:

./webapp 10000 
./webapp 10001 
./webapp 10002 
./webapp 10003 
./webapp 10004 
./webapp 10005 
./webapp 10006 
./webapp 10007 
./webapp 10008 
./webapp 10009 

的前端應配置建立在啓動時一個永久 HTTP連接到每個Web應用程序,再往前傳入的HTTP請求其中一個正在運行的Web應用程序,均勻分佈。

反向代理還應該支持從客戶端到自身的SSL。 SPDY的支持將是一個加號,但不是必須的。

我的問題是:哪個HTTP反向代理能夠在我的場景中作爲前端工作?如果你知道不止一個,每個人的利弊是什麼?

回答

0

您只有一臺連接服務器的動機是什麼?這聽起來像是一個網絡服務器的可怕選擇。當您的網站出現時,每個客戶端瀏覽器通常會並行發送數十個請求。

如果你通過TCP連接產生一個進程,你最終會得到糟糕的表現。真的,你在這裏尋找的是一個多線程的服務器,而不是多進程架構(什麼是具有不同工藝的地步呢?)

不過,也有幾條路徑,你可以下去,

  • 如果您真的想擁有單獨的流程,則每次收到請求時都會分叉您的webapp。它在性能方面不會很好,但它是您能想到的最初的問題中最接近的。

  • 你留在你的單線程webapp,但你維護你聽的套接字列表,並將它們與它們的「夥伴套接字」配對,這些套接字是它們將流量轉發到的套接字(注意它可以同時工作) 。儘管如此,這可能不是最佳的性能,因爲你可能是內核調用綁定的。

  • 您爲每個請求生成一個新線程,然後在此線程中處理此請求,就像處理單線程體系結構一樣。

如果我是你,我會直接轉向解決方案3,因爲它只是最好的選擇。它不會太麻煩,因爲它接近你的單線程方法(只有一對套接字),並且它沒有遍佈各處的分叉性能。

我不認爲你會找到適合您需求的Web服務器,因爲它不是以處理這種情況的標準方式,我懷疑任何人花時間去發展它:)

編輯:

好吧,我理解你的問題,從你的編輯。

對我來說,仍然需要解決的問題仍然是:您需要一個將流量分配給流程的流程。我不認爲你會找到這樣一個開箱即用的調度程序,所以你需要使用我提到的三種技術之一來實現它。

如果你仔細想想,你真的想要實現代理的一方,另一方面是轉發給你的webapp。所以你應該使用代理技術恕我直言。

+0

我很欣賞你的努力,但在所有誠實我甚至不認爲你讀過我的問題。擁有單一連接服務器的動機是我不想重新發明輪子。我只想重寫性能關鍵部分,並將連接池等留給更成熟,已經存在的Web服務器。我不想爲每個TCP連接產生一個新的進程。這就是爲什麼我說我想在啓動時產生我的進程*並且前端應該被配置爲在啓動時建立到每個Web應用程序的永久HTTP連接。 – JohnCand

+0

實質上,我在尋找一個很好的http://en.wikipedia.org/wiki/Reverse_proxy(請參閱右側的圖像和示例)。 – JohnCand

+0

我編輯了這個問題,使其更加清晰。我希望它有幫助。 – JohnCand

0

聽起來像你不一定需要反向代理,而是負載平衡器。我設置了HAProxy,以便每個webapp進程都計算爲一個後端,然後進行循環平衡,以便每個新連接都進入列表中的下一個進程。

Nginx也可以做這些事情,但我不確定它是否帶有開箱即用的負載平衡,或者如果這是一個額外的模塊。 Nginx的好處是它可以緩存靜態資產,如CSS和圖像。

0

的Nginx是一個不錯的選擇

優點:

  • 支持SSL終止
  • 支持load balancing開箱
  • Upstream keepalive連接
  • 有SPDY支持(無服務器雖然推) 。最新版本增加了httpd支持,刪除了spdy。

缺點:

  • 你會在你的nginx配置硬編碼上游服務器如下。如果您動態更新它們,則無法通過環境變量讀取上游服務器設置。

    http { 
        upstream myapp1 { 
         server localhost:10000; 
         server localhost:10001; 
         server localhost:10002; 
        } 
        server { 
         listen 443 ssl spdy; 
    
         location/{ 
          proxy_pass http://myapp1; 
         } 
        } 
    } 
    
相關問題