




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、mod_php VS mod_fastcgi目錄什么是MOD_PHP和MOD_FASTCGI1工作原理1mod_php2mod_fastcgi3MOD_FACTCGI的三種配置方式4靜態(tài)配置5動態(tài)配置5遠程方式6PHP-FPM6性能測試8名稱解釋8測試內(nèi)容8測試結(jié)果8FASTCGI配置項對性能的影響。11分析&結(jié)論13附錄14APACHE+MOD_FASTCGI+PHP搭建14什么是mod_php和mod_fastcgi在lamp體系中,對于apache端php的配置,我們最常用的就是mod_php, 它把PHP做為APACHE一個內(nèi)置模塊。讓apache http服務(wù)器本身能夠支持P
2、HP語言,不需要每一個請求就啟動PHP解釋器來解釋PHP。和把webserver與php綁定起來的方式不同,fastcgi是HTTP服務(wù)器與你的或其它機器上的程序進行“交談”的一種工具,相當(dāng)于一個程序接口。它可以接受來自web服務(wù)器的請求,解釋輸入信息,將處理后的結(jié)果返回給服務(wù)器(apache,lighty等)。mod_fastcgi就是在apache下支持fastcgi協(xié)議的模塊。工作原理在介紹這兩種模式的工作原理前,我們先了解一下php的架構(gòu)圖1 php架構(gòu)圖上面是php的架構(gòu)圖,從圖上可以看到, SAPI提供了一個和外部通信的接口,使得PHP可以和其他應(yīng)用進行交互數(shù)據(jù)。php默認提供了很
3、多種SAPI,常見的給apache的mod_php5,CGI,給IIS的ISAPI,還有Shell的CLI。對于一個基于apache的php應(yīng)用,其運行流程可以簡單歸結(jié)如下apache -> httpd -> mod_phpfastcgi -> sapi -> php我們下面提到的兩種工作方式就分別用到了mod_php5和cgi的sapi。mod_phpmod_php是在lamp體系中最常使用的工作方式,在這種模式下,php被編譯為apache的一個內(nèi)置模塊,在啟動時加載。當(dāng)有一個php請求過來時,直接在httpd進程里完成php的解釋運行,將結(jié)果返回。在php的sap
4、i中,有這樣一個函數(shù): sapi_cgibin_ub_write, 這個函數(shù)告訴了Zend,如何輸出數(shù)據(jù)。查看mod_php的sapi源碼,我們會發(fā)現(xiàn),這個函數(shù)直接調(diào)用了apache的ap_rwrite函數(shù)。所以,用mod_php,我們可以把php和apache看做一個模塊,兩者綁定在一起。其工作原理如下圖所示圖2 mod_php工作原理mod_fastcgi在說明fastcgi之前,先了解一下普通cgi的工作流程:web server收到用戶請求,并把請求提交給cgi程序,cgi程序根據(jù)請求提交的參數(shù)作應(yīng)處理,然后輸出標(biāo)準的html語句返回給web server,web server再返回給
5、客戶端,這就是普通cgi的工作原理。fastcgi是基于cgi架構(gòu)的擴展,他的核心思想就是在web server和具體cgi程序之間建立一個智能的可持續(xù)的中間層,統(tǒng)管cgi程序的運行,這樣web server只需要將請求提交給這個層,這個層再派生出幾個可復(fù)用的cgi程序?qū)嵗?,然后再把請求分發(fā)給這些實例,這些實例是可控的,可持續(xù),可復(fù)用的, 因此一方面避免了進程反復(fù)fork,另一方面又可以通過中間層的控制和探測機制來監(jiān)視這些實例的運行情況,根據(jù)不同的狀況fork或者回收實例,達到靈活 性和穩(wěn)定性兼得的目的。modFastCGI的主要優(yōu)點是把動態(tài)語言和web server分離開來。這種技術(shù)允許把w
6、eb server和動態(tài)語言運行在不同的主機上,以大規(guī)模擴展和改進安全性而不損失生產(chǎn)效率?;趍od_fastcgi方式的php應(yīng)用,其典型工作流程如下圖3 mod_fastcgi工作原理從圖上可以看出, apache啟動后,mod_fastcgi會在啟動多個cgi程序,也就是php-cgi腳本。具體腳本的數(shù)目通過配置來指定。當(dāng)有http請求到來后,httpd進程會選擇一個當(dāng)前空閑的一個php-cgi程序來執(zhí)行,執(zhí)行的方式和mod_php類似,也是通過php-cgi提供的sapi完成交互。查看源碼,可以發(fā)現(xiàn)對于cgi的sapi,和mod_php不同,它是把結(jié)果輸出到fastcgi提供的stdo
7、ut上,fastcgi再將數(shù)據(jù)返回給httpd完成交互。mod_factcgi的三種配置方式基于mod_fastcgi的fastcgi應(yīng)用一共有三種配置方式:靜態(tài)、動態(tài)和遠程。他們通過apache配置中的偽指令來代替,對應(yīng)于三種方式的偽指令分別是FastCgiServer, FastCgiConfig, 以及FastCgiExternalServer。對于靜態(tài)和動態(tài)這兩種方式,apache將通過mod_fastcgi自帶的進程管理工具(fcgi-pm)來管理fastcgi應(yīng)用程序,也就是php-cgi。fcgi-pm在apache啟動時就被自動激活了。相對于前兩種,遠程模式下,php-cgi不
8、由fcgi-pm來管理,apache不會去關(guān)心php-cgi程序的狀態(tài)。下面詳細說一下三種配置方式靜態(tài)配置通過FastCGIServer 偽指令將文件名定義為靜態(tài) FastCGI 應(yīng)用程序。初始時需要指定啟動的php-cgi進程數(shù)目,默認為1個。apache運行過程中,如果靜態(tài)應(yīng)用程序?qū)嵗驗槿魏卧蛩懒?,那么fcgi-pm將衍生另一個實例來替換。語法 FastCgiServer file name options 重要參數(shù)說明idle-timeout n(30 秒)。在請求異常終止和事件記錄在 error LogLevel 前,所允許的 FastCGI 應(yīng)用程序不活動秒數(shù)。僅當(dāng)存在與 Fas
9、tCGI 應(yīng)用程序的暫掛連接時,該不活動計時器才應(yīng)用。如果應(yīng)用程序在此期間不響應(yīng)隊列的請求,那么請求異常終止。如果與應(yīng)用程序的通信完成,但是與客戶機的通信未完成(緩存的響應(yīng)),那么超時不應(yīng)用。processes n(1)。在服務(wù)器初始化時衍生的應(yīng)用程序?qū)嵗龜?shù)。port n 無。應(yīng)用程序用于與 Web 服務(wù)器通信的 TCP 端口號(1-65535)。此選項使應(yīng)用程序可以從網(wǎng)絡(luò)中的其他機器訪問。-socket 選項和 -port 選項是互斥的。socket filename unix sock文件名Restart-delay n(5 秒)。此應(yīng)用程序的失敗實例重新衍生之間的最小秒數(shù)。此延遲阻止中斷
10、的應(yīng)用程序使用過多系統(tǒng)資源。動態(tài)配置在靜態(tài)配置中,我們初始就指定了要啟動的php進程數(shù)。和靜態(tài)的相反,動態(tài)應(yīng)用程序根據(jù)需求啟動。php應(yīng)用實例的數(shù)目根據(jù)當(dāng)前http請求數(shù)目動態(tài)變化,進程的管理也是通過fcgi-pm來完成。語法 FastCgiConfig option option .重要參數(shù)說明和靜態(tài)方式相比,動態(tài)配置的參數(shù)主要增加了以下幾個maxProcesses n 在任何時候允許運行的最大動態(tài) FastCGI 應(yīng)用程序?qū)嵗龜?shù)。minProcesses n 任何時候允許運行,且無須由fcgi-pm(因沒有需求)殺死的最小動態(tài) FastCGI 應(yīng)用程序?qū)嵗龜?shù)。 在dyn模式下,因為fast
11、cgi實例數(shù)目是動態(tài)改變的。所以沒有靜態(tài)方式中process這個參數(shù)遠程方式這種模式下,fastcgi實例和apache分離開來,這兩者可以分開來部署。他們之間的通信通過tcp或者unix sock來完成。使用ext方式,fastcgi實例將不會由fcgi-pm來管理,而是獨立的運行。語法 - FastCgiExternalServer 文件名 -host 主機名端口 -appConnTimeout nFastCgiExternalServer 文件名 -socket 文件名 -appConnTimeout n重要參數(shù)說明idle-timeout n (30 秒) 在請求異常終止,并且事件記錄
12、之前,允許 FastCGI 應(yīng)用程序保持不活動的秒數(shù)。只有當(dāng)與 FastCGI 應(yīng)用程序的連接暫掛時,此不活動定時器才適用。如果請求進入應(yīng)用程序的請求隊列,而此應(yīng)用程序在此期間沒有響應(yīng)(通過寫和刷新),則此請求將異常終止。如果與應(yīng)用程序的通信已完成,而與客戶機的通信尚未完成(響應(yīng)被高速緩存),則此超時不適用。host host:port 應(yīng)用程序用于與 Web 服務(wù)器通信的主機名或 IP 地址和 TCP 端口號 (1-65535)。-socket 和 -host 選項是互斥的。 socket 文件名 無應(yīng)用程序用于與 Web 服務(wù)器通信的 UNIX 域套接字的文件名。此文件名相對于 FastC
13、giIpcDir。-socket 和 -port 選項是互斥的。php-fpm使用FastCGI,最主要優(yōu)點是把應(yīng)用和web server(apache)分離開來。這樣允許把web server和動態(tài)語言(php)運行在不同的主機上,以大規(guī)模擴展和改進安全性而不損失效率。這樣的情況下,對于php-cgi程序,由于從apache中分離出來,就需要一個單獨的工具來對這些進程進行管理,在stc和dyn兩種模式下,mod_fastcgi中自帶的fcgi-pm會充當(dāng)了這樣的角色。可是,ext模式下卻沒有。我們只能通過一個腳本靜態(tài)的啟動n個實例,一旦進程死掉,還需要手工重啟。當(dāng)然,你可以使用supervi
14、se來管理這些進程,但是畢竟不那么靈活而且也僅僅一部份問題。甚至于fcgi-pm,因為實現(xiàn)的原因,其本身也有很多問題,例如不太穩(wěn)定,壓力下出core,無法平滑的完成切換等。 基于上述的原因,我們需要一個穩(wěn)定可靠的進程管理工具,就像lighty下的spwn-cgi。幸運的是,出現(xiàn)了php-fpm。它是一個類似于spwn-cgi的管理工具,可以和任何支持遠端FastCGI的web server工作。在官方的手冊上,列舉了以下php-fpm所具有的特性:特性Php自帶的Spwn-cgiPhp-fpmphp守護程序: pid file, log file, setsid(), setuid(), se
15、tgid(), chroot()(-)(-)(+)進程控制,可以平滑地重啟、重新載入配置和二進制模塊而不丟失請求Php4 (-)Php5 只能平滑停止(-)(+)限制ip地址,可以滿足web server的要求php4 (-)php5.2.2 > (+)(-)(+)如果使用優(yōu)化器,在遇到opcode緩存隨機損壞的時候緊急重啟所有進程(-)(-)(+)使用用不同的uid / gid / chroot / 環(huán)境變量,不同的 php.ini 選項,不需要safe mode(-)(-)(+)記錄work process的stdout和stderr(-)(-)(+)如果set_time_limit
16、沒有起作用,強制結(jié)束過期進程(-)(-)(+)特色功能 Error header、優(yōu)化的上傳支持、fastcgi_finish_request()另外,php-fpm還可以兼容zend Optimize,各種緩存優(yōu)化器。Php-fpm的安裝Php-fpm是以patch的方式安裝的,如果要使用它,你必須在安裝php前打上這個補丁。eg:gzip -cd php-5.2.6-fpm-0.5.9.diff.gz | patch -d php-5.2.6 -p1在configure時加上enable-fpm選項。安裝完php后,會有以下幾個文件$prefix/ext/php-fpm.conf$pref
17、ix/log/php-fpm.log$prefix/log/php-fpm.pid其中php-fpm.conf是配置文件,具體如何配置文件里有非常詳盡的注釋。最后,執(zhí)行./bin/php-cgi fpm &就可以了。另外,你也可以使用$prexif/sbin/php-fpm腳本來方便的維護。性能測試名稱解釋abapache自測的性能測試工具,主要用于測試極限壓力:對于同一url每秒所能執(zhí)行的次數(shù)及響應(yīng)時間。myabbaidu開發(fā)的壓力測試工具,區(qū)別于ab,其更主要的功能是測試指定壓力條件下機器的負載情況。eacc一種php加速器,主要是將php程序編譯后的結(jié)果緩存起來。加速php的執(zhí)行
18、,對性能有很大幅度的提升 ,更詳細的情況可以參見另一篇關(guān)于php緩存優(yōu)化的文檔 緩存優(yōu)化工具-php加速的利器etc、stc、dynmod_fastcgi運行的模式,分別指遠程、靜態(tài)和動態(tài)模式測試內(nèi)容測試中我們將針對不同的運行模式和頁面類型進行極限壓力測試及機器負載測試。同時,我們還將測試使用緩存優(yōu)化和不使用緩存優(yōu)化下機器的表現(xiàn)情況。另外,由于我們的測試主要是對比兩種模式的性能差別,因此對于機器的硬件配置不是特別敏感,測試的時候只需要保證機器負載為0即可。測試結(jié)果l 最簡單的php頁面壓力工具:mysql壓力情況:每秒1000次請求,并發(fā)數(shù)70。性能指標(biāo):cpu idle不同模式下機器idle
19、情況如下圖圖4最簡單php頁面,1000/s請求 idle情況從圖上我們可以看出,測試最簡單的php頁面時,各種模式下性能幾乎沒有差別,且由于頁面非常簡單,eacc的效果也基本沒有。l 復(fù)雜的php程序(2000行代碼+)壓力工具:mysql壓力情況:每秒400次請求,并發(fā)數(shù)70性能指標(biāo):cpu idle測試結(jié)果如下圖圖5復(fù)雜的php代碼,400/s壓力idle情況從圖上可以看出,在php代碼復(fù)雜的情況下,前面4中模式性能差別不大,mod_php略優(yōu),然后fastcgi動態(tài)配置的方式在此情況下性能差距非常之大,idle直接降為0,同時雖然每秒是400次的壓力,其只能處理200次左右的請求。由于
20、php代碼很復(fù)雜,eacc的作用明顯體現(xiàn)出來,使用緩存優(yōu)化后性能提升一倍以上。另外,還可以看出,eacc這樣的緩存優(yōu)化工具對于mod_php和fastcgi方式起到的作用基本相同,他們之間的性能差異和使用前維持相同。在上述情況下,如果不適應(yīng)fpm,fastcgi模式會出core,主要原因還在在于進程管理的問題。l 實際項目中的php程序這里我們采用群組項目中的pb頁面,涉及到和數(shù)據(jù)庫交互,db交互2次。db部署在其他機器,每次請求耗時50ms左右。壓力工具:mysql壓力情況:每秒400次請求,并發(fā)數(shù)70性能指標(biāo):cpu idle測試結(jié)果如下圖6實際的php頁面,400/s壓力idle情況從圖
21、上可以看出,性能的情況和圖2類似,各種模式的差距仍然不大。l 極限壓力測試壓力工具:ab測試參數(shù):并發(fā)請求數(shù)100,總次數(shù)10000次。測試頁面:pb頁面性能指標(biāo):每秒請求數(shù) rps圖7極限壓力測試 pb頁面從上圖我們可以看到,極限壓力下,使用eacc后,mod_php和ext(fpm)基本差不多,保持在860/s左右的水平,而使用fpm方式進行管理的模式略優(yōu)于其他兩種fastcgi模式。測試中發(fā)現(xiàn),fastcgi模式下,不使用php-fpm管理的話,仍然會有core出現(xiàn)。fastcgi配置項對性能的影響。在mod_fastcgi下,不管是ext還是stc方式,有一個配置項是非常關(guān)鍵的:默認啟
22、動的php-cgi進程實例數(shù)從fastcgi原理可以看出,當(dāng)有一個httpd進程到來時,它需要調(diào)用fastcgi server來執(zhí)行,如果此時所有server都出于服務(wù)狀態(tài),則這個httpd進程將出于等待狀態(tài)得不到服務(wù),導(dǎo)致請求無法響應(yīng)。對pb頁面進行測試,配置不同的實例數(shù)目進行極限壓力測試,得到結(jié)果如下圖8 fastcgi實例數(shù)對性能的影響分析一下這個原因:我們的pb頁面執(zhí)行時間是50ms,也就是說一個php-cgi程序在1s內(nèi)可以處理的請求數(shù)目是1000/50 = 20。假設(shè)啟動的實例數(shù)目是n,則1s內(nèi)最多能完成的請求數(shù)為n*20,從圖上可以看出,實際結(jié)果符合我們的計算。另外,這個數(shù)值也不
23、是無限增大了,當(dāng)n*20大于server本身所能承受的極限時,rps也不會繼續(xù)往上增長了。所以,使用fastcgi,對于n的選擇,要綜合頁面平均處理時間,最大壓力等多種因素結(jié)合來配置。同時,在ext方式下,webserver和fastcgi server交互的方式有兩種:通過tcp或者unix sock。測試一下這兩種方式的情況使用myab每秒400次請求pb頁面,機器idle圖9 ext下unix sock和tcp的區(qū)別從圖上可以看出,不管是否使用eacc,tcp方式的idle都有一個百分點的下降,這個差異主要是因為多了tcp連接過程造成的。分析&結(jié)論根據(jù)各種測試結(jié)果,可以看出和fa
24、stcgi方式相比,mod_php的性能在各種情況下都稍優(yōu),這種差異主要是在于后一種方式增加了一次數(shù)據(jù)交互過程php->fascgi->apache。但是這個差距并不大,在使用了eacc等緩存優(yōu)化工具后,性能有了很大提升。他們之間的差距完全不是瓶頸。從使用的角度來說,fastcgi具有以下優(yōu)點:1 webserver和php程序分離,兩者可以部署在不同的地方,通過socket方式通信帶來一定安全性2 使用fastcgi,在出現(xiàn)問題時可以更好的定位是webserver還是php的原因3 fastcgi方式不依賴于webserver,更加靈活,擴展性也更好4 fastcgi本身會有一些
25、進程監(jiān)控和日志記錄,更便于分析問題,跟蹤狀態(tài)。5 靈活多樣的配置,可以根據(jù)實際的應(yīng)用進行合理配置達到最佳效果。當(dāng)然fastcgi也有一些缺點1 mod_fastcgi在進程管理上有一些問題,容易出core。這個問題通過使用php-fpm可以解決2 由于fastcgi應(yīng)用單獨分離出來,因此需要單獨監(jiān)控進程的狀態(tài)。防止進程掛掉后導(dǎo)致服務(wù)出現(xiàn)問題,這個可以通過使用用supervise管理一定程度上避免這個問題。3 文檔相對缺乏,mod_fastcgi對apache的支持也不是特別好,且基本沒有升級。關(guān)于fastcgi運行方式的選擇,從效率、穩(wěn)定性等各方面來說,ext方式是最佳選擇了。而且考慮到我們可
26、能會將webserver和php分開到不同機器,選擇遠程方式也是必須的。進程管理工具,從各方面來說,php-fpm是最優(yōu)選擇了,即時使用lighty作用web server,也完全可以用它代替spwn-cgi。綜合測試結(jié)果和上述分析,我們完全可以采用fastcgi代替?zhèn)鹘y(tǒng)的mod_php。推薦使用下面的組合方式apache + ext + php-fpm(with superwise)如果webserver和fastcgi部署在同一機器上,使用unix sock方式通信,否則使用tcp方式。附錄apache+mod_fastcgi+php搭建l phpmod_fastcgi的搭建主要有三種方式
27、stc、ext和dyn,不管是哪種方式,首先在安裝php的時候需要加上如下選項-enable-fastcgi,并且不能使用with-apxs。以下是一個配置php例子./configure -prefix=/home/club/hongdk/env/php5.26-fcgi/ -enable-trace-vars -with-zlib-dir=/home/club/hongdk/tool/zlib/ -with-mysql=/home/club/hongdk/env/mysql5/ -with-mysqli=/home/club/hongdk/env/mysql5/bin/mysql_conf
28、ig -with-gettext -with-iconv -enable-mbstring=gbk -with-xmlrpc -enable-safe-mode -enable-sockets -enable-url-fopen-wrapper -enable-ftp -enable-shmop -with-config-file-path=/home/club/hongdk/env/php5.26-fcgi/ -enable-xml -with-dom=/home/club/hongdk/tool/libxml/ -with-libxml-dir=/home/club/hongdk/tool
29、/libxml/ -with-curl=/home/club/hongdk/tool/curl -with-curlwrappers -enable-fastcgi 在安裝完后,會在php的bin目錄下找到如下文件php-cgi執(zhí)行 ./php-cgi v,如果看到PHP 5.2.5 (cgi-fcgi) (built: Nov 12 2008 20:44:08)Copyright (c) 1997-2007 The PHP GroupZend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies就表明安裝成功了l mod_fastc
30、gicp Makefile.AP2 Makefilevi Makefile修改top_dir為apache安裝目錄makemake installl apache配置修改httpd.conf首先增加LoadModule fastcgi_module modules/mod_fastcgi.so然后根據(jù)不同的運行模式進行配置egext模式<IfModule mod_fastcgi.c>FastCgiExternalServer $php-server -socket /home/club/fastcgi.sockScriptAlias /cgi-bin/ "/home/club/hongdk/env/apache-fcgi/cgi-bin/"AddHandler php-fastcgi .phpAction php-fastcgi /cgi-bin/php-cgiAddType application/x-httpd-php .php</IfModule>其中$php-sever為php-cgi程序,例如/home/club/hongdk/env/apache-fcgi/cgi-bin/ph
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 收費站應(yīng)聘班長演講稿
- 人生規(guī)劃課件
- 政府人才公寓回購協(xié)議書
- 大興工廠飯?zhí)贸邪鼌f(xié)議書
- 小區(qū)消防現(xiàn)場施工協(xié)議書
- 學(xué)校蔬菜配送安全協(xié)議書
- 員工簽訂保護客戶協(xié)議書
- 咨詢服務(wù)業(yè)務(wù)合同范本
- 4s店財產(chǎn)保險協(xié)議書
- 暑期課后服務(wù)安全協(xié)議書
- 江蘇有限空間作業(yè)安全操作規(guī)范DB32∕T-3848-2020
- 《中醫(yī)美容》課件
- 10.2事件的相互獨立性 說課課件高一下學(xué)期數(shù)學(xué)人教A版(2019)必修第二冊
- 民辦學(xué)校檔案管理制度
- 工業(yè)固體廢棄物的資源化處理
- DB11 637-2015 房屋結(jié)構(gòu)綜合安全性鑒定標(biāo)準
- 教學(xué)評一體化含義
- 24秋國家開放大學(xué)《馬克思主義基本原理》專題測試參考答案
- 下月監(jiān)理工作計劃模板
- 科技查新報告樣例
- 2024株洲市中考地理試題
評論
0/150
提交評論