PHP伺服器的幾種架構,強烈推薦!

來源:互聯網
上載者:User
PHP伺服器的幾種架構,強烈推薦!!!


發現一篇好文,非常詳細的介紹了當前PHP伺服器的幾種架構,特意轉載,強烈推薦!!

?

nginx+PHP+PHP-FPM(FastCGI)在Ubuntu上的安裝和配置

轉載請註明原文連結:http://blog.csdn.net/omohe/archive/2009/07/10/4336731.aspx

版本:v1.0? 作者:OMO 最後修改時間:2009.07.10

0 之前知識回顧:?

1) 目前各種伺服器HTTP Server對PHP的支援一共有三種:?

a.通過HTTPServer內建的模組來實現,

例如Apache的mod_php5,類似的Apache內建的mod_perl可以對perl支援;

b.通過CGI來實現,這個就好比之前perl的CGI,該種方式的缺點是效能差,因為每次伺服器遇到這些指令碼都需要重新啟動指令碼解析器來執行指令碼然後將結果返回給伺服器;另一方面就是不太安全;該方面幾乎很少使用了。

c.最新出現一種叫做FastCGI。所謂FastCGI就是對CGI的改進。它一般採用C/S結構,一般指令碼處理器會啟動一個或者多個daemon進程,每次HTTPServer遇到指令碼的時候,直接交付給FastCGI的進程來執行,然後將得到的結果(通常為html)返回給瀏覽器。

>該種方法的問題存在一個小問題是當遇到大流量的頻繁請求的話,指令碼處理器的daemon進程可能會超負荷從而變得很慢,甚至發生記憶體流失;

>但是比較起Apache的內建模組的方式的優點是由於Server和指令碼解析器完全分開各負其責,因此伺服器不再臃腫,可以專心地進行靜態檔案響應或者將動態指令碼解析器的結果返回給使用者用戶端。所以比較起Apache的內建模組方式,有時候效能要提高很多。有人測試可能會達到 Apache+mod_php的5~10倍。


2) 使用FastCGI方式現在常見的有兩種stack:ligthttpd+spawn-fcgi;?另外一種是nginx+PHP-FPM(也可以用spawn-fcgi)?。?

a.如上面所說該兩種結構都採用FastCGI對PHP支援,因此HTTPServer完全解放出來,可以更好地進行響應和並發處理。因此lighttpd和nginx都有small, but powerful和efficient的美譽。

b. 該兩者還可以分出一個好壞來,spawn-fcgi由於是lighttpd的一部分,因此安裝了lighttpd一般就會使用spawn-fcgi對 php支援,但是目前有使用者說ligttpd的spwan-fcgi在高並發訪問的時候,會出現上面說的記憶體流失甚至自動重啟fastcgi。即:PHP 指令碼處理器當機,這個時候如果使用者訪問的話,可能就會出現白頁(即PHP不能被解析或者出錯)。

另一個:首先nginx不像lighttpd本身含帶了fastcgi(spawn-fcgi),因此它完全是輕量級的,必須藉助第三方的FastCGI 處理器才可以對PHP進行解析,因此其實這樣看來nginx是非常靈活的,它可以和任何第三方提供解析的處理器實現串連從而實現對PHP的解析(在 nginx.conf中很容易設定)。

nginx可以使用spwan-fcgi(需要一同安裝lighttpd,但是需要為nginx避開連接埠,一些較早的blog有這方面安裝的教程),但是由於spawn-fcgi具有上面所述的使用者逐漸發現的缺陷,現在慢慢減少使用nginx+spawn-fcgi組合了。

c. 由於spawn-fcgi的缺陷,現在出現了新的第三方(目前還是,聽說正在努力不久將來加入到PHP core中)的PHP的FastCGI處理器,叫做PHP-FPM(具體可以google)。它和spawn-fcgi比較起來有如下優點:
由於它是作為PHP的patch補丁來開發的,安裝的時候需要和php源碼一起編譯,也就是說編譯到php core中了,因此在效能方面要優秀一些;
同時它在處理高並發方面也優於spawn-fcgi,至少不會自動重啟fastcgi處理器。具體採用的演算法和設計可以google瞭解。

因此,如上所說由於nginx的輕量和靈活性,因此目前效能優越,越來越多人逐漸使用這個組合:nginx+PHP/PHP-FPM?。

3) 因此總結:?
目前在HTTPServer這塊基本可以看到有三種stack比較流行:?

>Apache+mod_php5
>lighttp+spawn-fcgi
>nginx+PHP-FPM

三者後兩者效能可能稍優,但是Apache由於有豐富的模組和功能,目前來說仍舊是老大。有人測試nginx+PHP-FPM在高並發情況下可能會達到Apache+mod_php5的5~10倍,現在nginx+PHP-FPM使用的人越來越多。

下面著重介紹stack:
Apache+mod_php5和nginx+PHP-FPM的安裝和配置。對於lighttpd+spawn-fcgi,由於我個人沒有怎麼用過,所以如下不準備介紹,感興趣可以查閱資料。


1.Apache+mod_php模式:?

我們很久一段時間使用經典的Apache+mod_php:?

Apache對PHP的支援是通過Apache的模組來支援的。如果曾原始碼編譯安裝php的話,如果希望Apache支援PHP的話,在./configure步驟需要指定--with-apxs2=/usr/local/apache2/bin/apxs?表示告訴編譯器通過Apache的mod_php5/apxs來提供對PHP5的解析;
而且在最後一步make install的時候我們會看到將動態連結程式庫libphp5.so(Apache模組)拷貝到apache2的安裝目錄的modules目錄下,並且還需要在httpd.conf設定檔中添加LoadModule語句來動態將libphp5.so?模組載入進來,從而實現Apache對php的支援。

1)由於該模式實在太經典了,因此這裡關於安裝部分不準備詳述了,相對來說比較簡單。

2)這裡之所以仍舊列出來Apache+mod_php5來討論,是因為:
看過上一篇文章的話,我們知道nginx一般包括兩個用途HTTPServer和Reverse Proxy Server(反向 Proxy伺服器)。

我們介紹了如何在前端部署nginx作為reverse proxy server,後端布置多個Apache來實現機群系統server cluster架構的。
因此,實際生產中,我們仍舊能夠保留Apache+mod_php5的經典App Server,而僅僅使用nginx來當做前端的reverse proxy server來實現代理和負載平衡。?因此,建議nginx(1個或者多個)+多個apache的架構繼續使用下去。

2. nginx+PHP-FPM:?

1)通過上面的分析,儘管我們可以仍舊保留Apache+mod_php來處理PHP,所有的靜態檔案和負載平衡由頂在前端的nginx來完成,但是由於nginx和PHP-FPM各自的優越性,使得nginx+PHP-FPM的組合的效能已經很超越Apache+mod_php。?
因此很多人漸漸放棄了Apache+mod_php的組合了,而完全使用nginx+PHP-FPM來實現對PHP的處理。
因此現在出現了新的名詞叫做LEMP(Linux+EngineX(nginx)+MySQL+PHP),慢慢要代替經典很多年的LAMP?。

2)甚至出現一種新的server cluster:?
其中看不到Apache的影子了,全部由nginx來搞定。nginx輕量型,高效能,高靈活性使得它完全能夠應付過來。
由於PHP-FPM是C/S結構,因此我們前端保留nginx來做負載平衡;對於之前後端的各個Apache伺服器,我們不需要安裝Apache了,對PHP重新編譯安裝使其以PHP-FPM方式支援FastCGI;
然後在nginx中配置將用戶端的php請求分別pass到背景多個啟動並執行PHP-FPM,後者進行處理然後返回給nginx,然後顯示給使用者。整個過程可以完全不要Apache。

3) 下面我們具體來介紹如何來安裝和簡單配置?
nginx+PHP+PHP-FPM+MySQL.

3. 安裝和配置nginx+PHP+PHP-FPM+MySQL:?

1) 安裝MySQL:?

這裡之所以首先要安裝MySQL,是因為之後編譯安裝PHP的時候,可以直接指定對MySQL的支援。
我們知道PHP對MySQL的支援是通過PHP擴充實現的。
可以原始碼安裝,不過我使用的Ubuntu,直接使用了其發布的二進位包安裝了:

$sudo apt-get install mysql-server

安裝的時候需要提示設定root密碼;
之後使用
$netstat -tap |grep mysql
看看是否正常運行;

2) 安裝PHP和PHP-FPM:?
我們之前介紹了PHP-FPM是對PHP的補丁,因此需要和PHP一起編譯安裝。我這裡使用的PHP 5.2.10?。
a. 下載安裝包:?
從php.net?下載:php-5.2.10.tar.gz
從PHP-FPM官網下載:php-5.2.10-fpm-0.5.13.diff.gz
注意兩個版本盡量相同(不相同可能出錯,我自己沒試過)。

b. 解壓縮打補丁?
$tar xzvf php-5.2.10.tar.gz
$gzip -cd php-5.2.10-fpm-0.5.13.diff.gz | patch -d php-5.2.10 -p1
倘若中間需要哪個命令shell不認識,可以使用apt-get安裝,或者google找答案。

c. 配置編譯環境:?
在安裝之前可能需要安裝幾個依賴包:
sudo apt-get install libxml2-dev
sudo apt-get install libmysqlclient15-dev
不安裝也可以,之後./configure失敗的話,根據出錯資訊,再慢慢搜尋安裝依賴包也可以,重要的是記下關鍵步驟,因為每個人的系統裝沒裝啥都不一定。

$cd php-5.2.10
$./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm --with-mysql --with-mysqli --with-openssl

這裡我們配置php安裝到/usr/local/php,如果不配置預設安裝到/usr/local下,這樣我覺得不太好,這樣make install各個檔案就會被拷貝得分散開來(分散在local的各個目錄下),如果我們之後想卸載乾淨而且無法使用make uninstall的話,還不方便。安裝到/usr/local/php下,如果我們想刪除php,直接刪除該目錄即可。

--enable-fastcgi和--enable-fpm分別設定支援fastcgi和PHP-FPM的選項;
--with-mysql和--with-mysqli相當於編譯php的MySQL擴充到php核心中,這樣我們可以在php中使用mysql和mysqli庫的函數訪問mysql;

注意:這裡需要注意的一個問題是,不要設定--with-apxs2=/usr/local/apache2/bin/apxs,我們知道它是告訴PHP編譯成模組方式讓Apache來支援。如果設定了該選項的話,編譯安裝之後,Apache會無法啟動,報錯資訊:?
/usr/lib/apache2/modules/libphp5.so: undefined symbol: -fpm-event-base-free

因此這裡也就意味著,我們編譯PHP以PHP-FPM的方式來支援FastCGI的話,基本上就不能和Apache一起使用了,也就是說我們決定使用nginx+PHP+PHP-FPM的話,這裡的PHP就沒法和Apache一起使用了。

如果非還想要使用,那可以另外編譯安裝一個PHP,編譯的時候在./configure的時候設定--with-apxs2=/usr/local/apache2/bin/apxs,而且不要打PHP-FPM的補丁。

另外,如果該步驟出現錯誤,通常是缺乏依賴包,請按照錯誤資訊安裝依賴包即可。

d. 編譯:?
$make all?
注意這裡盡量使用make all,而不要僅僅是make

e. 安裝:?
$make install

f. 拷貝php.ini檔案:?
$sudo cp php.ini-dist /usr/local/php/lib/php.ini
將php.ini檔案拷貝到如上位置;

如果安裝都成功的話,我們的以PHP-FPM方式支援FastCGI的PHP就被安裝到了/usr/local/php目錄下了。?


3) 配置PHP和PHP-FPM:
?

首先可用到/usr/local/php/bin目錄下執行一下php -v,看PHP是否work。

a. 配置php.ini:?
位於/usr/local/php/lib下
這裡一般沒有嚴格需要配置什麼,可以按照自己要求進行配置。

b. 配置PHP-FPM這個PHP解析器:?
我們上面說過PHP-FPM解析器是C/S結構,它的設定檔位於/usr/local/php/etc/php-fpm.conf。
$cd /usr/local/php/etc
$sudo vi php-fpm.conf
該檔案是一個xml檔案,只需要修改:
??? Unix user of processes
??? www-data
??? Unix group of processes
??? www-data
注意去掉兩邊的注釋,否則之後php-fpm啟動不了;

c. 配置完之後,就可以啟動PHP-FPM:?
$/usr/local/php/sbin/php-fpm start

我們上面介紹了FastCGI模式區別於CGI模式,它需要一個daemon進程一直運行在後台對php請求做出解析,這裡的PHP-FPM就是這個 daemon進程,在設定檔php-fpm.conf中可以設定它偵聽的IP和連接埠,預設為127.0.0.1:9000。也就是它偵聽9000連接埠的資料請求,然後會將其進行解析然後返回給請求端。

這個和我們之前介紹的FastCGI的思想相吻合。HTTPServer伺服器和FastCGI模式的PHP解析器相分離(這裡就是PHP- FPM),HTTPServer遇到PHP請求的時候,就會傳遞給PHP-FPM,後者解析並返回。實現HTTPServer和PHP解析器完全分離,緩解了Server的負擔,Server有更多資源來處理並發請求。其實這也是nginx優於apache的一個原因。

d. 檢查php-fpm是否運行正常:?
$ps ax|grep fpm

4)安裝和配置nginx:?

之前文章我們介紹了nginx的安裝和使用nginx作為reverser server的進行負載平衡配置了,感興趣的可以參看。

a. nginx的安裝很簡單:?
從官網下載安裝包:nginx-0.7.61.tar.gz

$tar xzvf nginx-0.7.61.tar.gz
$cd nginx-0.7.61
$./configure?
預設安裝路徑為/usr/local/nginx,如果不放心自己可以使用--prefix=/usr/local/nginx配置一下
$make
$sudo make install

b. 思想:?

我們之前的文章介紹了nginx的使用非常靈活,有人比喻其為server領域的瑞士軍刀,其實確實是:效能好,而且使用方法多。
各種使用方法都是通過設定檔來實現,因此掌握nginx的使用,除了掌握各種架構的思想之外,還要掌握如何對nginx.conf進行相應的配置。?

我們這裡著重對nginx.conf配置,實現通過php-fpm的fastcgi對php的處理。其實nginx本身並不會對PHP進行解析,這個要區別於Apache?(Apache通過內建模組實現了對PHP的解析),nginx其實是將對php頁面的請求交給了後台在127.0.0.1:9000?偵聽的php-fpm,後者具有解析php的功能。

因此如果把php-fpm看做一個app server的話,其實nginx這裡的作用還是一個反向 Proxy伺服器。和我們之前介紹的使用location配置將php請求proxypass給後台偵聽的Apache伺服器,在思想上幾乎一樣。?


c. 配置位於/usr/local/nginx/conf目錄下的nginx.conf和fastcgi.params
?

>nginx.conf配置:?
$cd /usr/local/nginx/conf
$sudo vi nginx.conf
從上往下對預設的設定檔進行修改:

??? 1. user? www-data; 這裡需要和php-fpm中定義的使用者一致;

??? 2. worker_processes 2; 可以設定更多,這個選項和之後的worker_connections? 1024;
??? ??? 一起來定義每個進程並發相應的最大串連數,因此這裡可以達到2*1024的並發請求;

??? 3. 在server {
??????? listen?????? 8080;
??? ??? 如果自己已經安裝了Apache並且佔用了80連接埠,這裡修改為別的8080,負責啟動不了;

??? 4. 如上面所述,我們其實設定nginx將PHP請求轉寄給背景php-fpm server即可,後者有解析php功能。
??? 其實還是充當反向 Proxy的作用;
??? ??? # pass the PHP scripts to FastCGI server listening on?127.0.0.1:9000?
??????? #
??????? location ~ \.php$ {
??????????? root?????????? html;
??????????? fastcgi_pass???127.0.0.1:9000?;
??????????? fastcgi_index? index.php;
??????????? fastcgi_param? SCRIPT_FILENAME? html/$fastcgi_script_name;
??????????? include??????? fastcgi_params;
??????? }
????注意fastcgi_param? SCRIPT_FILENAME? html/$fastcgi_script_name;

??? 之後需要設定為放置php指令碼的位置?,這裡我們舉例在/usr/local/nginx/html目錄下建立一個phpinfo.php檔案?
??? 包含代碼

$sudo vi fastcgi.params

配置fastcgi參數檔案,具體可以參考http://wiki.nginx.org/NginxFcgiExample?
基本上可以使用預設的該檔案,不需要修改。

5) 運行nginx:

$sudo /usr/local/nginx/sbin/nginx

然後在瀏覽器中查看http://localhost?

> 預設會顯示/usr/local/nginx/html目錄下的index.html頁面: Welcome to Nginx!

>然後查看http://localhost/phpinfo.php?,相當於訪問html目錄下的phpinfo.php頁面,

如果正常,會顯示phpinfo的頁面。其中可以看到Server API一項包含:CGI/FastCGI,表示FastCGI方式運行。

如果以上步驟出現錯誤,通常都是因為nginx.conf配置不正確,可以google尋找解決方案,一般都可以找得到(英文)。然後重新修改nginx.conf檔案。

之後需要重啟nginx,可以執行:

$sudo kill `cat /usr/local/nginx/logs/nginx.pid` 表示關閉nginx
$sudo /usr/local/nginx/sbin/nginx 再次啟動nginx

6)設定開機自啟動:
?

在Ubuntu下,如果希望添加到/etc/init.d實現開機重啟的話,可以Google尋找nginx和php-fpm的init script(php-fpm本身就是init script不需要尋找了),然後拷貝到/etc/init.d目錄下。

簡單的方法,設定rc.local:

$sudo vi /etc/rc.local

在exit 0之前添加:
/usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx

這樣開機自動啟動nginx和php-fpm。

7) 使用nginx和php-fpm實現server? cluster:?

和nginx對多台app server代理實現負載平衡類似,我們可以實現nginx對多台php-fpm實現負載平衡:

T
?o configure Nginx to load balance multiple FastCgi servers use this type of configuration:

??? upstream fastcgiServers {
??? ??? server?127.0.0.1:9000?;
??? ??? server?127.0.0.1:9001?;
??? ??? server?198.192.0.1:9000?;
??? ??? server?198.192.0.2:9000?;
??? ??? server?198.192.0.3:9000?;
??? }

??? location ~ \.php$ {
??? fastcgi_pass fastcgiServers;
??? fastcgi_index stream.app;
??? fastcgi_param SCRIPT_FILENAME /var/www/htdocs$fastcgi_script_name;
??? include /etc/nginx/fastcgi.conf;

??? }

????
4. 總結:?

三種常用模式:?
Apache+mod_php5;?
lightppd+spawn-fcgi;?
nginx+PHP-FPM
?

我們可以使用到生產環境中的:?

0) 如果不是server cluster的話:
可以使用以上任一種,不過有各種測試表明nginx+PHP-FPM效能優越,但是Apache+mod_php5很經典模組多,比如對.htaccess等的支援。?

如果構建server cluster的話:
1) nginx作為反向 Proxy伺服器,後台多台Apache+mod_php5。?
nginx處理靜態檔案,及對php並發請求對後台多台app server的負載平衡;

2) nginx作為反向 Proxy器,後台多台PHP-FPM?
nginx處理靜態檔案及將php並發請求發送到後台php-fpm來解析;


另外:關於如何更好使用nginx這個輕量級高效能的瑞士軍刀,主要是如何配置nginx.conf,更多參看:
http://wiki.nginx.org/Main?
另外,關於PHP支援的各種緩衝等這裡沒有安裝,感興趣可以另行安裝。


更多參考資料:
http://www.php.net/manual/en/install.unix.apache2.php?
http://www.softwareprojects.com/resources/programming/t-installing-nginx-web-server-w-php-and-ssl-1474.html?
http://php-fpm.org/Main_Page?
http://www.softwareprojects.com/resources/programming/t-how-to-install-php-fpm-spawn-fcgi-replacement-1602.html?
http://wiki.nginx.org/NginxFcgiExample?
有可能以後會將PHP-FPM直接添加到PHP核心中一起進行發布
Will there be a PHP-FPM is included in the official PHP?
http://php-fpm.org/FAQ#Will_there_be_a_PHP-FPM_is_included_in_the_official_PHP.3F?

http://bookmarks.honewatson.com/2008/04/24/multiple-fastcgi-php-servers-nginx-load-balancing/?
http://www.wikivs.com/wiki/Lighttpd_vs_nginx?
http://en.wikipedia.org/wiki/Reverse_proxy?
http://sameerparwani.com/posts/nginx-as-a-front-end-to-apache/?
http://blog.kovyrin.net/2006/04/17/typical-nginx-configurations/?
http://www.yawn.it/2008/04/30/nginx-php-php-fpm-on-debian-etch-40/?
http://howtoforge.org/installing-nginx-with-php5-and-mysql-support-on-ubuntu-8.10

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.