2012-02-10 68 views
5

摘要/ Quesiton:我可以在Prefork MPM下使用Apache mod_proxy作爲連接池嗎?

我有Apache與Prefork MPM運行,運行php。我試圖使用Apache mod_proxy創建一個反向代理,我可以重新路由我的請求,以便我可以使用Apache來執行連接池。例如IMPL:

在httpd.conf:

SSLProxyEngine On 
ProxyPass /test_proxy/ https://destination.server.com/ min=1 keepalive=On ttl=120 

但是當我跑我的測試,這是一個循環以下命令:

curl -G 'http://localhost:80/test_proxy/testpage' 

它似乎並沒有重新使用連接。

經過一番進一步的閱讀,聽起來好像我沒有獲得連接池功能,因爲我使用的是Prefork MPM而不是Worker MPM。因此,每次向代理髮出請求時,都會使用自己的連接池(大小爲1)來啓動一個新進程,而不是使用維護其自己的池的單個worker。那個解釋是對的嗎?


背景信息:

有我做請求外部服務器,通過https,用於打在我運行一個網站的每一個頁面。

由於我使用php並且它似乎不支持連接池 - 如果我的網站有300個頁面請求,他們必須對外部服務器執行300次SSL握手,因此談判SSL握手的代價越來越高,因爲每個腳本完成運行後,連接會關閉。

所以我嘗試使用反向代理Apache下充當連接池,將持續整個PHP程序的連接,這樣我就不必經常做SSL握手。這給了我這個想法

來源:

回答

1

的prefork仍然可以集中每個後端服務器每處理1個連接。

的prefork不一定創建新的進程爲每個前端請求,服務器進程「彙集」本身和行爲例如取決於MinSpareServers/MaxSpareServers和朋友。

要最大化prefork進程爲您提供後端連接的頻率,請避免maxspareservers或非常高的minspareservers數量過多或過少,因爲這會導致「新鮮」進程接受新連接。

您可以登錄%P在LogFormat指令來幫助獲得一個想法,如果多久過程被重複使用。

+0

感謝您的回答。這幫助我瞭解了使用MPM_prefork是否可以實現連接池。 Apache文檔廣告甚至是調試級別的mod_proxy日誌記錄對於是否重新使用連接都不是很有說服力。 在我的情況下,原來不是反向代理服務器,但後端服務器是問題。它通過檢查'User-Agent'HTTP頭來檢測瀏覽器是MSIE,並因此在每個請求結束時關閉SSL連接。 這就是爲什麼反向代理從不重新使用到後端服務器的SSL連接。 – BertNase 2012-07-06 09:14:52

+0

500是你的,因爲你的評論幫助我理解發生了什麼, 我會發佈一個答案來指出,在我的情況下,問題的解決方案是什麼。 – BertNase 2012-07-06 09:15:40

2

首先,你的測試方法不能證明,因爲每次調用連接池,捲曲客戶端誕生了,然後死了。就像死去的人不會說很多,死亡的過程不能保持連接的活力。

您的客戶端困擾您的代理服務器。

Client ====== (A) =====> ProxyServer 

我們稱之爲連接A.您的代理服務器什麼也不做,它只是炫耀。帥氣而勤勞的服務員非常謙虛,他躲在後面。

Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer 

在這裏,如果我沒有錯,安全連接是A,而不是B,對嗎?

重複我的第一點,在您的測試中,您將爲每個請求創建一個單獨的客戶端。每個客戶需要一個單獨的連接。至少在兩方之間發生連接。一面離開,連接丟失。

好吧,現在讓我們忘記捲曲,一起看看我們真正想要做什麼。

我們希望A上有SSL,我們希望A方的流量儘可能快。爲了這個目的,我們已經分開了B面,所以它不會讓A更慢,對吧?

連接池?在A處沒有連接池這樣的事情。每個客戶都來來去去,造成很大的噪音。只有可以幫助你減少這種噪音的東西是「Keep-Alive」,意思是說,保持連接在客戶端上保持一段時間,因此這個客戶端可以請求這個請求所需的其他文件。當我們完成後,我們就完成了。

對於B上的連接,連接將被集中;但是這不會給你帶來任何性能,因爲在單服務器設置中你沒有這部分噪音產生。

我們如何幫助該系統運行更快?

如果這兩臺服務器在同一臺機器上,我們應該擺脫show-off服務器,並繼續我們的努力工作的網絡服務器。它增加了很多不必要的工作給系統。

如果這些是獨立的機器,那麼你對網絡服務器的態度很好,至少要從這個可憐的人那裏加載(對於ssl)加載。但是,你可以更好。

如果要繼續使用Apache,請從mpm_prefork切換到mpm_worker。如果有300多個併發請求,這會更好。我真的不知道你硬件的容量。但是如果處理300個請求很困難,我相信這個小小的改變會對你的系統有很大的幫助。

如果你想要一個更輕量級的系統,可以考慮將nginx作爲Apache的替代品。與PHP一起工作非常有效,它的性能會更好。

除了前端的東西外,還要考慮檢查你的數據庫服務器。連接池將在這裏發揮真正的作用。確保您的PHP安裝是否配置爲重用與數據庫的連接。

另外,如果你在同一系統上託管靜態文件,然後將它們移出或者其他Web服務器上或通過靜態文件移動到雲系統與CDN像做得更好AWS的S3 + CloudFrontRackspace's CloudFiles。即使沒有CloudFront,S3也會讓你開心。 Rackspace的解決方案隨附Akamai!

拿出靜態文件將使你的網絡服務器「哦,發生了什麼,這是什麼沉默?哦,天堂!」因爲你提到這是一個網站,大多數時候網頁都有很多動態生成的html頁面的靜態文件。

我希望你能拯救這個可憐的傢伙從殺手工作。

+0

感謝您對這個問題的長時間回答。 是的,問題是如何在(B)連接上建立連接池。 由於反向代理是一種將所有「工作」服務器隱藏在單個反向代理之後的安全概念,因此將代理退出遊戲不是一種選擇。 從代理服務器和後端服務器之間的(B)連接中刪除SSL也不是一個選項,因爲代理服務器是唯一允許連接到後端服務器的服務器,並且唯一的方法就是確保使用相互SSL身份驗證在bckend服務器上對代理進行身份驗證。 – BertNase 2012-07-06 08:53:36

+0

我想從Connection(B)上的連接池中獲得的好處是消除了SSL握手開銷。握手是昂貴的事情 - 300-500ms。通過已建立的共用SSL連接運行後續請求,僅在後端服務器的請求執行時間上增加了20ms。因此,我們的目標是在不使用池式連接時爲每個請求消除300-500毫秒的處罰。 – BertNase 2012-07-06 09:01:57

+0

實際上,我在最後幾天切換到了MPM_worker,並設法建立了連接池。所以我現在最初的問題已經解決了。 在我嘗試使用MPM_Prefork實現相同過程中遇到了一些問題,並且遇到了這個問題,並開始了一個賞金,給我一些關於如何使用MPM_Prefork構建的提示。 事實證明,原來的文章中提到的Apache Bug只適用於早期的Apache 2.2版本,並沒有出現在我的Apache 2.2.22中。因此,對於我而言,連接池在MPM_Prefork和MPM_worker中都可以工作,請參閱下面的註釋。 – BertNase 2012-07-06 09:09:58

0

我的問題是,反向代理和後端服務器之間的連接池沒有發生,因爲後端服務器Apache在每個HTTPS請求結束時關閉了SSL連接。

後端Apache服務器在做這個becuse以下指令存在於httpd.conf

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown 

該指令就沒有意義了當後端服務器通過反向代理連接,這可以被移除從後端服務器配置。

相關問題