2013-12-20 70 views
2

背景信息Apache代理是不是做連接的再利用有兩種prefork的或工人MPM

我們有一個戴爾R620電信基礎的企業應用服務器運行在部署了兩個Apache Web服務器& OCCAS RHEL 5平臺&應用服務器。我們擁有連接到應用程序服務器的專用電話,因爲客戶端&會針對所有基於HTTP的請求點擊Apache。 Apache服務器被配置爲代理/轉發請求到OCCAS。

的問題

專有的手機將發送35秒即內大約350的HTTP請求(在啓動期間),每秒約10個請求。我們可以清楚地看到電話& Apache之間的連接正在重新使用連接,而Apache之間的連接(即mod_proxy & OCCAS )沒有重複使用連接,最終爲每個請求創建一個連接。在服務請求後,OACAS的Apache &之間的連接被Apache /代理關閉(因爲我們看到來自代理的FIN)。因此,在處理所有350個請求後,我們可以看到TIME_WAIT狀態下的350個套接字。我們的系統應該可以處理500個這樣的電話。現在,如果您可以想象當所有500個手機同時發出350個請求時,它將需要175,000(350 * 500)個臨時端口!因此,我試圖使連接重用在Apache代理& OCCAS之間工作,爲此我面臨着問題。

我在下面發佈了我們的配置&我們試過的不同東西&未能使連接重用工作。

我們的配置

1)prefork的&工人MPM配置在我們的系統中/etc/httpd/conf/httpd.conf中是如下&我們使用默認的prefork的MPM。

<IfModule prefork.c> 
StartServers  8 
MinSpareServers 5 
MaxSpareServers 20 
ServerLimit  256 
MaxClients  256 
MaxRequestsPerChild 4000 
</IfModule> 

<IfModule worker.c> 
StartServers   8 
MaxClients   150 
MinSpareThreads  5 
MaxSpareThreads  20 
ThreadsPerChild 256 
MaxRequestsPerChild 4000 
</IfModule> 

2)在/etc/httpd/conf/httpd.conf中的Keepalive相關的參數如下:

[[email protected] ~]# grep -i keepalive /etc/httpd/conf/httpd.conf | grep -v "#" 
KeepAlive On 
MaxKeepAliveRequests 100 
KeepAliveTimeout 15 
BrowserMatch "Mozilla/2" nokeepalive 
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 
[[email protected] ~]# 

3)代理配置如下:

<VirtualHost *:80> 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

<Location /ds-webservice> 
ProxyPass   http://{IP address of local host}:8001/ds-webservice retry=0 
ProxyPassReverse http://{IP address of local host}:8001/ds-webservice 
</Location> 
. 
. 
# Few more similar ProxyPass 
. 
. 
</VirtualHost> 

4)我們使用默認的prefork Apache:

[[email protected] ~]# httpd -l 
Compiled in modules: 
    core.c 
    prefork.c 
    http_core.c 
    mod_so.c 

測試嘗試,但未能實現連接重用

測試1)我們注意到的mod_proxy正在發送「連接:保持活動」標頭(但不是「保活」頭本身)在轉發的請求而OCCAS不會以「連接」或「保持活動」標題進行響應。我們最初的懷疑是Apache不喜歡沒有這些頭文件的響應。因此,作爲一個實驗,我們將請求轉發給另一個Apache,在這個Apache中,我們從其他Apache返回了「Connection」或「Keep-alive」頭文件,以迴應mod_proxy,但mod_proxy沒有執行連接重用。所以,我們確認了它的mod_proxy存在問題(或者可能是我們的一些錯誤配置)。

測試2)研究一下,我們在2.2.0 - https://issues.apache.org/bugzilla/show_bug.cgi?id=38602中發現了一個使用prefork的連接重用的錯誤報告。錯誤38602在2.2.1中修復。然而,根據Can I use Apache mod_proxy as a connection pool, under the Prefork MPM?的帖子,我們發現即使升級後問題仍然存在。所以,可以肯定的是,我們將Apache從2.2.3升級到2.2.26,但mod_proxy沒有執行連接重用。

測試3)我們嘗試一些測試用不同的ProxyPass參數(不包括在httpd.conf中改變任何東西)&沒有人幫即mod_proxy的沒做連接重用: 注:不包括(7),我們在我們的測試中,在'ProxyPass http:// {本地主機的IP地址}:8001/ds-webservice'旁邊添加了以下參數。
1.重試= 0 (我們的默認配置)
2. disablereuse = OFF
3.最大= 256重試= 0
4. proxyto = 80
5.重試= 0存活= ON
6.重試= 300 SMAX = 5最大值= 20 TTL = 120
7.最後,我們增加了保持活動的具體參數代理配置中,希望它會在http.conf中覆蓋保活參數:

<VirtualHost *:80> 

Timeout 300 
KeepAlive On 
MaxKeepAliveRequests 1000 
KeepAliveTimeout 100 
ProxyRequests Off 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

<Location /ds-webservice> 
ProxyPass   http://{IP address of local host}:8001/ds-webservice retry=0 
ProxyPassReverse http://{IP address of local host}:8001/ds-webservice 
</Location> 
. 
. 
# Few more similar ProxyPass 
. 
. 
</VirtualHost> 

測試4)根據帖子Can I use Apache mod_proxy as a connection pool, under the Prefork MPM?,我們通過使用2.2.26上的httpd.worker切換到prefork Apache工人Apache & mod_proxy沒有做連接重用。

看來我們在這裏錯過了一些非常基本的東西。如果在ProxyPass或prefork配置中有任何我們做錯的事情,你們可以指點我嗎?任何指針都會有很大的幫助。

感謝您提前!

問候
Goutham普拉薩德

回答

1

機會是很好的,要麼你的客戶正在下HTTP協議1.0請求(其中保持連接需要通過標題明確啓用)或任何請求或響應請求的連接與關閉Connection: close標題。見http://en.wikipedia.org/wiki/HTTP_persistent_connection

最好的方式來確定是怎麼回事,會後從包跡頭:

  1. 從客戶到代理
  2. 從代理到OCCAS
  3. 請求時請求
  4. 從OCCAS到代理的響應

這將使我們能夠看到協議版本和頭文件在播放。

相關問題