fastcgi:php-5.3.3 之後的版本自帶了fpm組件,
fpm組件能把PHP解釋器工作爲守護進程,並提供類似prefork模式的應用,它能夠接收來自前端httpd,http-proxy-fcgi反向代理用戶對動態內容請求至後端的fastcgi server
構建分離式LAMP需要注意的地方:
1、動態資源部署在應用程序服務器上(php-fpm),靜態資源部署在Web服務器上
2、php以fpm工作方式時,它不會被編譯成httpd模塊,因此,編譯時無須使用--with-apxs2=/PATH
參數,httpd的主配置文件中也無須再 LoadModule php5_module
把php編譯爲fpm工作模式時需要開啓的重要的參數 --enable-fpm
3、編譯php時,需連接mysql或其他數據庫管理系統時,需要啓用其相關的驅動模塊。
4、php與mysql不在同一節點,連接mysql的用戶賬號需要有遠程訪問權限。
編譯安裝php
#tar xf php-5.4.0.tar.bz2
#cd php-5.4.0
#./configure --prefix=/usr/local/php --with-config-file-path=/etc/php/php.ini --with-config-file-scan-dir=/etc/php.d/ --enable-mbstring --with-freetype-dir--with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml--with-mcrypt --with-bz2 --with-openssl --with-curl --with-xsl --with-iconv=/usr/local/libiconv --enable-sockets --enable-short-tags --enable-static --enable-gd-native-ttf --enable-ftp --enable-maintainer-zts --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-fpm
#make && make install
爲php提供配置文件
#mkdir /etc/{php,php.d} –pv
#cp php.ini-production /etc/php/php.ini
配置php-fpm
#cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm (服務腳本)
#chmod +x /etc/rc.d/init.d/php-fpm (添加執行權限)
#chkconfig –add php-fpm (添加到服務列表中)
#chkconfig php-fpm on
爲php-fpm提供配置文件
#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
編輯php-fpm的配置文件,配置fpm的相關選項爲你所需要的值,並啓用pid文件(如下最後一行):
# vim /usr/local/php/etc/php-fpm.conf
listen = 192.168.100.114:9000
pm.max_children = 50 ###靜態方式下開啓的php-fpm進程數量
pm.start_servers = 5 ###動態方式下的起始php-fpm進程數量
pm.min_spare_servers = 2 ###動態方式下的最小php-fpm進程數量
pm.max_spare_servers = 8 ###動態方式下的最大php-fpm進程數量
pid = /usr/local/php/var/run/php-fpm.pid ###PID文件路徑
說明:如果dm設置爲static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置數量的php-fpm進程。
如果dm設置爲 dynamic,那麼pm.max_children參數失效,後面3個參數生效。
系統會在php-fpm運行開始的時候啓動pm.start_servers個php-fpm進程,然後根據系統的
需求動態在pm.min_spare_servers 和pm.max_spare_servers之間調整php-fpm進程數。
當php-fpm工作爲獨立守護進程時,默認監聽在127.0.0.1:9000 端口上,即默認至允許本機上的
httpd進程訪問,當前環境是httpd和php分別在不同服務器安裝,因此要修改監聽端口,讓其他主機
能夠訪問。
各自以fast-cgi方式工作時,前端的Web服務器必須以fcgi模塊跟後端主機進行通信。
啓動php-fpm
#service php-fpm start
驗證是否啓動成功
#netstat –tnlp|grep php-fpm
tcp 0 0 192.168.100.114:9000 0.0.0.0:* LISTEN 32873/php-fpm
httpd相關配置
1、啓用httpd的相關模塊
在Apache httpd2.4以後已經專門有一個模塊針對FastCGI的實現,此模塊爲mod_proxy_fcgi.so,
它其實是作爲mod_proxy.so模塊的擴充,因此,這兩個模塊都要加載
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
開啓虛擬主機開關
Include /etc/httpd/extra/httpd-vhosts.conf
2、配置虛擬主機支持使用fcgi
在相應的虛擬主機中添加類似如下兩行:
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1
ProxyRequests Off:關閉正向代理
ProxyPassMatch:把以.php結尾的文件請求發送到php-fpm進程,php-fpm至少需要知道運行的目錄和URI
所以這裏直接在fcgi://127.0.0.1:9000 後指明瞭這兩個參數
其它的參數的傳遞已經被mod_proxy_fcgi.so進行了封裝,不需要手動指定。
需要注意的問題:
動態資源需要放在PHP服務器上,當httpd服務器接收到客戶端瀏覽器請求的是動態頁面內容時,
會把請求發往指定的PHP服務器上處理,但是靜態頁面例如:html、jpg等還是會在httpd服務器上
處理,不然圖片等信息可能就無法顯示,因此在部署網站時,需要把網站的資源分開部署在兩邊。
分別在HTTPD服務器和PHP服務器上各自創建同樣路徑的目錄,不然啓動httpd服務時會報錯。
編輯虛擬主機配置文件:
# vim /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/data/web/www/"
ServerName phpinfo.luanyh.com
ServerAlias luanyh.com
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.100.114:9000/data/web/www/$1
ErrorLog "/usr/local/apache/logs/phpinfo-error_log"
CustomLog"/usr/local/apache/logs/phpinfo-access_log" common
</VirtualHost>
<Directory "/data/web/www/">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
創建虛擬主機主頁(在PHP Server上),測試httpd能否支持php
# vim /data/web/www/index.php
編輯如下內容:
<?php
phpinfo();
?>
客戶端瀏覽器上測試:
此時,Server API 工作模式爲:FPM/FastCGI