【51CTO獨家特稿】本文所介紹的方法應(yīng)該是目前讓PHP最快的辦法:Nginx + PHP-FPM + APC。我們將從安裝Nginx http服務(wù)器、PHP和PHP-FPM補丁,以及APC,詳細的講解這種方法的具體配置及應(yīng)用,最終的效果如何?相信會讓你大吃一驚。
相關(guān)文章推薦:Nginx http服務(wù)相關(guān)的配置文件 Nginx+PHP配置相關(guān)進程的簡要介紹
背景
過去兩年多來,我們的網(wǎng)站一直運行Apache+mod_php模塊,大多數(shù)時候這個組合應(yīng)付得過來,但隨著流量的增加,我們注意到Apache已 經(jīng)顯得很吃力了,它開始瘋狂地吃內(nèi)存,CPU也被全部搶占去了,我們需要找到一個更快的方法來解決問題。
Nginx是一個不錯的選擇,很多指標都超過了Apache,如I/O、CPU、內(nèi)存和請求數(shù)/秒等,如果需要,隨時可以從Google搜索相關(guān)信 息。從我個人的測試結(jié)果來看,Nginx和Apache之間的差異是很明顯的,不好意思,因為是非正式測試,因此相關(guān)數(shù)字我就不公布了,這也不是本文的重 點。讓我更自信的是,我只需要幾個步驟就可以讓性能遠超Apache。
PHP-FPM?
很多人配置Nginx時可能都會選擇來自LightTPD項目的spawn-fcgi解析PHP,但使用spawn-fcgi有些問題,因此我打算 放棄它另覓別的辦法。PHP-FPM是PHP FastCGI Process Manager的縮寫,即PHP FastCGI進程管理器,實際上它是PHP的一個補丁,旨在將FastCGI進程管理整合進PHP包中。
注意:即使你堅持使用Apache,也有很多原因跳過mod_php,直接通過FastCGI解析PHP。使用mod_php時,Apache處理 載入PHP的每個請求會載入所有的庫,這是一個巨大的無畏開銷。如果使用FastCGI,PHP的行為更象應(yīng)用程序服務(wù)器,PHP-FPM以及 spawn-fcgi按需要載入和殺掉PHP實例,這樣做有很多好處,其中很重要的一點就是減少內(nèi)存開銷。
讓我們開始吧
我們使用的是全新安裝的Ubuntu 8.10 Intrepid,第一件事情是安裝所有的依賴包。
- sudo apt-get install make bison flex gcc patch autoconf subversion locate
- sudo apt-get install libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev
準備好依賴包之后,我們就可以開始。
編譯PHP
我們下載的是PHP 5.2.8源代碼包,還有對應(yīng)的PHP-FPM補丁,我們先打上補丁,然后再編譯。
- cd /usr/local/src/
- sudo wget http://us.php.net/get/php-5.2.8.tar.gz/from/this/mirror
- sudo tar zvxf php-5.2.8.tar.gz
- sudo wget http://php-fpm.anight.org/downloads/head/php-5.2.8-fpm-0.5.10.diff.gz
- sudo gzip -cd php-5.2.8-fpm-0.5.10.diff.gz | sudo patch -d php-5.2.8 -p1
- cd php-5.2.8
- sudo ./configure --enable-fastcgi --enable-fpm --with-mcrypt --with-zlib --enable-mbstring --disable-pdo --with-pgsql --with-curl --disable-debug --enable-pic --disable-rpath --enable-inline-optimization --with-bz2 --with-xml --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-xslt --enable-memcache --enable-zip --with-pcre-regex
- sudo make all install
- sudo strip /usr/local/bin/php-cgi
如果在運行上面命令時遇到錯誤,很可能是因為缺少依賴包造成的。另外,確保你正確啟用和禁用了特定的PHP配置選項。緊接著我們通過PECL安裝一 些將會用到的模塊:
- sudo pecl install memcache
- sudo pecl install apc
- sudo pecl install syck-beta
在安裝apc模塊時,請務(wù)必關(guān)閉Apache選項,如果你沒有關(guān)閉,它也會提醒你。接下來復制我們常用的php.ini:
- sudo cp /usr/local/src/php-5.2.8/php.ini-recommended /usr/local/lib/php.ini
最后,我們建立符號鏈接:
- sudo mkdir /etc/php/
- sudo ln -s /usr/local/lib/php.ini /etc/php/php.ini
- sudo ln -s /usr/local/etc/php-fpm.conf /etc/php/php-fpm.conf
PHP編譯到此結(jié)束,剩下要做的事情是修改php-fpm.conf設(shè)置,用文本編輯器打開/etc/php/php-fpm.conf,將進程屬 主用戶修改為www-data,這個文件比較大,因此最好使用搜索功能,我想修改的值分別位于51、52、63和66行。
- <value name="owner">www-datavalue>
- <value name="group">www-datavalue>
- <value name="user">www-datavalue>
- <value name="group">www-datavalue>