背景信息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普拉薩德