中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Apache HTTP服務(wù)器提高性能的教程

2018-09-12    來(lái)源:愛(ài)站科技

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

  Apache是世界使用排名第一的Web服務(wù)器軟件,下面就由愛(ài)站頻道的小編分享一篇關(guān)于Apache HTTP服務(wù)器提高性能的教程給大家吧!大家可以參考一下哦!

  相比于Apache 1.3 ,2.0版本作了大量的優(yōu)化來(lái)提升處理能力和可伸縮性,而且大多數(shù)的改進(jìn)在默認(rèn)狀態(tài)下就可以生效。但是,在編譯時(shí)和運(yùn)行時(shí),都有許多可以顯著提高性能的選擇。本文闡述在安裝Apache2.0時(shí),服務(wù)器管理員可以改善性能的各種方法。其中,部分配置選擇可以使httpd更好地利用硬件和操作系統(tǒng)的兼容性,其他則是以功能換取速度。

  硬件和操作系統(tǒng)

  影響web服務(wù)器性能的最大的因素是內(nèi)存。一個(gè)web服務(wù)器應(yīng)該從不使用交換機(jī)制,因?yàn)榻粨Q產(chǎn)生的滯后使用戶(hù)總感覺(jué)"不夠快",所以用戶(hù)就可能去按"停止"和"刷新",從而帶來(lái)更大的負(fù)載。你可以,也應(yīng)該,控制MaxClients的設(shè)置,以避免服務(wù)器產(chǎn)生太多的子進(jìn)程而發(fā)生交換。這個(gè)過(guò)程很簡(jiǎn)單:通過(guò)命令計(jì)算出每個(gè)Apache進(jìn)程平均消耗的內(nèi)存,然后再為其它進(jìn)程留出足夠多的內(nèi)存。

  其他因素就很普通了,裝一個(gè)足夠快的CPU,一個(gè)足夠快的網(wǎng)卡,幾個(gè)足夠快的硬盤(pán),這里說(shuō)的"足夠快"是指能滿足實(shí)際應(yīng)用的需求。

  操作系統(tǒng)是很值得關(guān)注的又一個(gè)因素,已經(jīng)被證實(shí)的很有用的經(jīng)驗(yàn)有:

  *

  選擇能夠得到的最新最穩(wěn)定的版本并打好補(bǔ)丁。近年來(lái),許多操作系統(tǒng)廠商都提供了可以顯著改善性能的TCP協(xié)議棧和線程庫(kù)。

  *

  如果你的操作系統(tǒng)支持sendfile()系統(tǒng)調(diào)用,則務(wù)必安裝帶有此功能的版本或補(bǔ)丁(對(duì)Linux來(lái)說(shuō),就是使用Linux2.4或更高版本,對(duì)Solaris8的早期版本,則需要安裝補(bǔ)丁)。在支持sendfile的系統(tǒng)中,Apache2可以更快地發(fā)送靜態(tài)內(nèi)容而且占用較少的CPU時(shí)間。

  運(yùn)行時(shí)的配置

  相關(guān)模塊 相關(guān)指令

  * mod_dir

  * mpm_common

  * mod_status

  * AllowOverride

  * DirectoryIndex

  * HostnameLookups

  * EnableMMAP

  * EnableSendfile

  * KeepAliveTimeout

  * MaxSpareServers

  * MinSpareServers

  * Options

  * StartServers

  HostnameLookups 和其他DNS考慮

  在Apache1.3以前的版本中,HostnameLookups默認(rèn)被設(shè)為 On 。它會(huì)帶來(lái)延遲,因?yàn)閷?duì)每一個(gè)請(qǐng)求都需要作一次DNS查詢(xún)。在Apache1.3中,它被默認(rèn)地設(shè)置為 Off 。如果需要日志文件提供主機(jī)名信息以生成分析報(bào)告,則可以使用日志后處理程序logresolve ,以完成DNS查詢(xún),而客戶(hù)端無(wú)須等待。

  推薦你最好是在其他機(jī)器上,而不是在web服務(wù)器上執(zhí)行后處理和其他日志統(tǒng)計(jì)操作,以免影響服務(wù)器的性能。

  如果你使用了任何"Allow from domain"或"Deny from domain"指令(也就是domain使用的是主機(jī)名而不是IP地址),則代價(jià)是要進(jìn)行兩次DNS查詢(xún)(一次正向和一次反向,以確認(rèn)沒(méi)有作假)。所以,為了得到最高的性能,應(yīng)該避免使用這些指令(不用域名而用IP地址也是可以的)。

  注意,可以把這些指令包含在段中使之局部化。在這種情況下,只有對(duì)這個(gè)區(qū)域的請(qǐng)求才會(huì)發(fā)生DNS查詢(xún)。下例禁止除了.html和.cgi以外的所有DNS查詢(xún):

  HostnameLookups off

  HostnameLookups on

  如果在某些CGI中偶爾需要DNS名稱(chēng),則可以調(diào)用gethostbyname來(lái)解決。

  FollowSymLinks 和 SymLinksIfOwnerMatch

  如果網(wǎng)站空間中沒(méi)有使用 Options FollowSymLinks ,或使用了 Options SymLinksIfOwnerMatch ,Apache就必須執(zhí)行額外的系統(tǒng)調(diào)用以驗(yàn)證符號(hào)連接。文件名的每一個(gè)組成部分都需要一個(gè)額外的調(diào)用。例如,如果設(shè)置了:

  DocumentRoot /www/htdocs

  Options SymLinksIfOwnerMatch

  在請(qǐng)求"/index.html"時(shí),Apache將對(duì)"/www"、"/www/htdocs"、"/www/htdocs/index.html"執(zhí)行l(wèi)stat()調(diào)用。而且lstat()的執(zhí)行結(jié)果不被緩存,因此對(duì)每一個(gè)請(qǐng)求都要執(zhí)行一次。如果確實(shí)需要驗(yàn)證符號(hào)連接的安全性,則可以這樣:

  DocumentRoot /www/htdocs

  Options FollowSymLinks

  Options -FollowSymLinks +SymLinksIfOwnerMatch

  這樣,至少可以避免對(duì)DocumentRoot路徑的多余的驗(yàn)證。注意,如果Alias或RewriteRule中含有DocumentRoot以外的路徑,那么同樣需要增加這樣的段。為了得到最佳性能,應(yīng)當(dāng)放棄對(duì)符號(hào)連接的保護(hù),在所有地方都設(shè)置FollowSymLinks ,并放棄使用SymLinksIfOwnerMatch 。

  AllowOverride

  如果網(wǎng)站空間允許覆蓋(通常是用.htaccess文件),則Apache會(huì)試圖對(duì)文件名的每一個(gè)組成部分都打開(kāi).htaccess ,例如:

  DocumentRoot /www/htdocs

  AllowOverride all

  如果請(qǐng)求"/index.html",則Apache會(huì)試圖打開(kāi)"/.htaccess"、"/www/.htaccess"、"/www/htdocs/.htaccess"。其解決方法和前面所述的 Options FollowSymLinks 類(lèi)似。為了得到最佳性能,應(yīng)當(dāng)對(duì)文件系統(tǒng)中所有的地方都使用 AllowOverride None 。

  內(nèi)容協(xié)商

  實(shí)踐中,內(nèi)容協(xié)商的好處大于性能的損失,如果你很在意那一點(diǎn)點(diǎn)的性能損失,則可以禁止使用內(nèi)容協(xié)商。但是仍然有個(gè)方法可以提高服務(wù)器的速度,就是不要使用通配符,如:

  DirectoryIndex index

  而使用完整的列表,如:

  DirectoryIndex index.cgi index.pl index.shtml index.html

  其中最常用的應(yīng)該放在前面。

  還有,建立一個(gè)明確的type-map文件在性能上優(yōu)于使用"Options MultiViews",因?yàn)樗行枰男畔⒍荚谝粋(gè)單獨(dú)的文件中,而無(wú)須搜索目錄。請(qǐng)參考內(nèi)容協(xié)商文檔以獲得更詳細(xì)的協(xié)商方法和創(chuàng)建type-map文件的指導(dǎo)。

  內(nèi)存映射

  在Apache2.0需要搜索被發(fā)送文件的內(nèi)容時(shí),比如處理服務(wù)器端包含時(shí),如果操作系統(tǒng)支持某種形式的mmap() ,則會(huì)對(duì)此文件執(zhí)行內(nèi)存映射。

  在某些平臺(tái)上,內(nèi)存映射可以提高性能,但是在某些情況下,內(nèi)存映射會(huì)降低性能甚至影響到httpd的穩(wěn)定性:

  *

  在某些操作系統(tǒng)中,如果增加了CPU,mmap還不如read()迅速。比如,在多處理器的Solaris服務(wù)器上,關(guān)閉了mmap ,Apache2.0傳送服務(wù)端解析文件有時(shí)候反而更快。

  *

  如果你對(duì)作為NFS裝載的文件系統(tǒng)中的一個(gè)文件進(jìn)行了內(nèi)存映射,而另一個(gè)NFS客戶(hù)端的進(jìn)程刪除或者截?cái)嗔诉@個(gè)文件,那么你的進(jìn)程在下一次訪問(wèn)已經(jīng)被映射的文件內(nèi)容時(shí),會(huì)產(chǎn)生一個(gè)總線錯(cuò)誤。

  如果有上述情況發(fā)生,則應(yīng)該使用 EnableMMAP off 關(guān)閉對(duì)發(fā)送文件的內(nèi)存映射。注意:此指令可以被針對(duì)目錄的設(shè)置覆蓋。

  Sendfile

  在Apache2.0能夠忽略將要被發(fā)送的文件的內(nèi)容的時(shí)候(比如發(fā)送靜態(tài)內(nèi)容),如果操作系統(tǒng)支持sendfile() ,則Apache將使用內(nèi)核提供的sendfile()來(lái)發(fā)送文件。

  在大多數(shù)平臺(tái)上,使用sendfile可以通過(guò)免除分離的讀和寫(xiě)操作來(lái)提升性能。然而在某些情況下,使用sendfile會(huì)危害到httpd的穩(wěn)定性

  *

  一些平臺(tái)可能會(huì)有Apache編譯系統(tǒng)檢測(cè)不到的有缺陷的sendfile支持,特別是將在其他平臺(tái)上使用交叉編譯得到的二進(jìn)制文件運(yùn)行于當(dāng)前對(duì)sendfile支持有缺陷的平臺(tái)時(shí)。

  *

  對(duì)于一個(gè)掛載了NFS文件系統(tǒng)的內(nèi)核,它可能無(wú)法可靠的通過(guò)自己的cache服務(wù)于網(wǎng)絡(luò)文件。

  如果出現(xiàn)以上情況,你應(yīng)當(dāng)使用"EnableSendfile off"來(lái)禁用sendfile 。注意,這個(gè)指令可以被針對(duì)目錄的設(shè)置覆蓋。

  進(jìn)程的建立

  在Apache1.3以前,MinSpareServers, MaxSpareServers, StartServers的設(shè)置對(duì)性能都有很大的影響。尤其是為了應(yīng)對(duì)負(fù)載而建立足夠的子進(jìn)程時(shí),Apache需要有一個(gè)"漸進(jìn)"的過(guò)程。在最初建立StartServers數(shù)量的子進(jìn)程后,為了滿足MinSpareServers設(shè)置的需要,每一秒鐘只能建立一個(gè)子進(jìn)程。所以,對(duì)一個(gè)需要同時(shí)處理100個(gè)客戶(hù)端的服務(wù)器,如果StartServers使用默認(rèn)的設(shè)置5,則為了應(yīng)對(duì)負(fù)載而建立足夠多的子進(jìn)程需要95秒。在實(shí)際應(yīng)用中,如果不頻繁重新啟動(dòng)服務(wù)器,這樣還可以,但是如果僅僅為了提供10分鐘的服務(wù),這樣就很糟糕了。

  " 一秒鐘一個(gè)"的規(guī)定是為了避免在創(chuàng)建子進(jìn)程過(guò)程中服務(wù)器對(duì)請(qǐng)求的響應(yīng)停頓,但是它對(duì)服務(wù)器性能的影響太大了,必須予以改變。在Apache1.3中,這個(gè) "一秒鐘一個(gè)"的規(guī)定變得寬松了,創(chuàng)建一個(gè)進(jìn)程,等待一秒鐘,繼續(xù)創(chuàng)建第二個(gè),再等待一秒鐘,繼而創(chuàng)建四個(gè),如此按指數(shù)級(jí)增加創(chuàng)建的進(jìn)程數(shù),最多達(dá)到每秒 32個(gè),直到滿足MinSpareServers設(shè)置的值為止。

  從多數(shù)反映看來(lái),似乎沒(méi)有必要調(diào)整MinSpareServers, MaxSpareServers, StartServers 。如果每秒鐘創(chuàng)建的進(jìn)程數(shù)超過(guò)4個(gè),則會(huì)在ErrorLog中產(chǎn)生一條消息,如果產(chǎn)生大量此消息,則可以考慮修改這些設(shè)置?梢允褂胢od_status的輸出作為參考。

  與進(jìn)程創(chuàng)建相關(guān)的是由MaxRequestsPerChild引發(fā)的進(jìn)程的銷(xiāo)毀。其默認(rèn)值是"0",意味著每個(gè)進(jìn)程所處理的請(qǐng)求數(shù)是不受限制的。如果此值設(shè)置得很小,比如30,則可能需要大幅增加。在SunOS或者Solaris的早期版本上,其最大值為10000以免內(nèi)存泄漏。

  如果啟用了持久鏈接,子進(jìn)程將保持忙碌狀態(tài)以等待被打開(kāi)連接上的新請(qǐng)求。為了最小化其負(fù)面影響,KeepAliveTimeout的默認(rèn)值被設(shè)置為5秒,以謀求網(wǎng)絡(luò)帶寬和服務(wù)器資源之間的平衡。在任何情況下此值都不應(yīng)當(dāng)大于60秒,參見(jiàn)most of the benefits are lost。

  編譯時(shí)的配置

  選擇一個(gè)MPM

  Apache 2.x 支持插入式并行處理模塊,稱(chēng)為多路處理模塊(MPM)。在編譯Apache時(shí)你必須選擇也只能選擇一個(gè)MPM,這里有幾個(gè)針對(duì)非UNIX系統(tǒng)的MPM:beos, mpm_netware, mpmt_os2, mpm_winnt。對(duì)類(lèi)UNIX系統(tǒng),有幾個(gè)不同的MPM可供選擇,他們都會(huì)影響到httpd的速度和可伸縮性:

  * workerMPM使用多個(gè)子進(jìn)程,每個(gè)子進(jìn)程中又有多個(gè)線程。每個(gè)線程處理一個(gè)請(qǐng)求。該MPM通常對(duì)高流量的服務(wù)器是一個(gè)不錯(cuò)的選擇。因?yàn)樗萷reforkMPM需要更少的內(nèi)存且更具有伸縮性。

  * preforkMPM使用多個(gè)子進(jìn)程,但每個(gè)子進(jìn)程并不包含多線程。每個(gè)進(jìn)程只處理一個(gè)鏈接。在許多系統(tǒng)上它的速度和workerMPM一樣快,但是需要更多的內(nèi)存。這種無(wú)線程的設(shè)計(jì)在某些情況下優(yōu)于workerMPM:它可以應(yīng)用于不具備線程安全的第三方模塊(比如php3/4/5),且在不支持線程調(diào)試的平臺(tái)上易于調(diào)試,而且還具有比workerMPM更高的穩(wěn)定性。

  關(guān)于MPM的更多內(nèi)容,請(qǐng)參考其文檔。

  模塊

  既然內(nèi)存用量是影響性能的重要因素,你就應(yīng)當(dāng)盡量去除你不需要的模塊。如果你將模塊編譯成DSO ,取消不必要的模塊就是一件非常簡(jiǎn)單的事情:注釋掉LoadModule指令中不需要的模塊。

  如果你已經(jīng)將模塊靜態(tài)鏈接進(jìn)Apache二進(jìn)制核心,你就必須重新編譯Apache并去掉你不想要的模塊。

  增減模塊牽涉到的一個(gè)問(wèn)題是:究竟需要哪些模塊、不需要哪些模塊?這取決于服務(wù)器的具體情況。一般說(shuō)來(lái),至少要包含下列模塊:mod_mime, mod_dir, mod_log_config 。你也可以不要mod_log_config ,但是一般不推薦這樣做。

  原子操作

  一些模塊,比如mod_cache和worker使用APR(Apache可移植運(yùn)行時(shí))的原子API。這些API提供了能夠用于輕量級(jí)線程同步的原子操作。

  默認(rèn)情況下,APR在每個(gè)目標(biāo)OS/CPU上使用其最有效的特性執(zhí)行這些操作。比如許多現(xiàn)代CPU的指令集中有一個(gè)原子的比較交換(compare-and -swap, CAS)操作指令。在一些老式平臺(tái)上,APR默認(rèn)使用一種緩慢的、基于互斥執(zhí)行的原子API以保持對(duì)沒(méi)有CAS指令的老式CPU的兼容。如果你只打算在新式的CPU上運(yùn)行Apache,你可以在編譯時(shí)使用 --enable-nonportable-atomics 選項(xiàng):

  ./buildconf

  ./configure --with-mpm=worker --enable-nonportable-atomics=yes

  --enable-nonportable-atomics 選項(xiàng)只和下列平臺(tái)相關(guān):

  * SPARC上的Solaris

  默認(rèn)情況下,APR使用基于互斥執(zhí)行的原子操作。如果你使用 --enable-nonportable-atomics 選項(xiàng),APR將使用SPARC v8plus操作碼來(lái)加快基于硬件的CAS操作。注意,這僅對(duì)UltraSPARC CPU有效。

  * x86上的Linux

  默認(rèn)情況下,APR在Linux上使用基于互斥執(zhí)行的原子操作。如果你使用 --enable-nonportable-atomics 選項(xiàng),APR將使用486操作碼來(lái)加快基于硬件的CAS操作。注意,這僅對(duì)486以上的CPU有效。

  mod_status 和 "ExtendedStatus On"

  如果Apache在編譯時(shí)包含了mod_status ,而且在運(yùn)行時(shí)設(shè)置了"ExtendedStatus On",那么Apache會(huì)對(duì)每個(gè)請(qǐng)求調(diào)用兩次gettimeofday()(或者根據(jù)操作系統(tǒng)的不同,調(diào)用times())以及(1.3版之前)幾個(gè)額外的time()調(diào)用,使?fàn)顟B(tài)記錄帶有時(shí)間標(biāo)志。為了得到最佳性能,可以設(shè)置"ExtendedStatus off"(這也是默認(rèn)值)。

  多socket情況下的串行accept

  警告

  這部分內(nèi)容尚未完全根據(jù)Apache2.0中的變化進(jìn)行更新 。一些信息依然有效,使用中請(qǐng)注意。

  這里要說(shuō)的是 Unix socket API 的一個(gè)缺點(diǎn)。假設(shè)web服務(wù)器使用了多個(gè)Listen語(yǔ)句監(jiān)聽(tīng)多個(gè)端口或者多個(gè)地址,Apache會(huì)使用select()以檢測(cè)每個(gè)socket是否就緒。select()會(huì)表明一個(gè)socket有零或至少一個(gè)連接正等候處理。由于Apache的模型是多子進(jìn)程的,所有空閑進(jìn)程會(huì)同時(shí)檢測(cè)新的連接。一個(gè)很天真的實(shí)現(xiàn)方法是這樣的(這些例子并不是源代碼,只是為了說(shuō)明問(wèn)題而已):

  for (;;) {

  for (;;) {

  fd_set accept_fds;

  FD_ZERO (&accept_fds);

  for (i = first_socket; i

  以上就是關(guān)于Apache HTTP服務(wù)器提高性能的教程,想必都了解了吧,更多相關(guān)內(nèi)容請(qǐng)繼續(xù)關(guān)注愛(ài)站技術(shù)頻道。

標(biāo)簽: dns dns查詢(xún) http服務(wù)器 linux swap web服務(wù)器 安全 代碼 服務(wù)器 服務(wù)器端 服務(wù)器管理 服務(wù)器使用 服務(wù)器性能 排名 搜索 網(wǎng)絡(luò) 域名

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:在Linux架設(shè)代理服務(wù)器的操作方法

下一篇:如何在Linux架設(shè)透明網(wǎng)關(guān)?