一、php相關概念:
web,借助于MIME傳來的mp3檔案,并不能直接打開,而要調用相應的程式才能打開
動态站點:
client動态(不建議使用,要從server-side下載下傳源程式然後在client本地環境中運作,且将結果在浏覽器上顯示,如果源程式本身代碼有問題或是開發者不懷好意,用戶端就遭殃了會病毒或木馬,win早期使用的是ActiveX,JAVA早期使用APPLET借助于JVM java virtual machine可一次編譯到處運作);
server動态
CGI,common gatewayinterface:使前端web伺服器程序根據對應程式的不同,調用對應的執行環境來運作對應的程式檔案,并将運作結果取回至WEB程序,任何一種語言都可開發CGI程式,隻不過有一些語言更适合開發WEB應用程式webapp(client請求一頁面,調用相應的運作環境,将運作結果格式化為HTML文檔傳回給client)
程式設計語言:
靜态語言:強類型,編譯型語言,先編譯才能運作,如C,C++,JAVA,優點(效率高),缺點(每一次改動都要重新編譯,開發周期長,維護成本大),實時場景及面向底層的環境都用C或C++開發(OS,驅動)至少要比解釋型語言性能高30%;
動态語言:弱類型,解釋型語言,如shell,perl,python,變量可直接拿來用,不用事先說明解釋器執行即可,優點(便于維護,有衆多共享子產品,開發周期短,維護成本小),缺點(性能差),一般用動态語言開發動态站點。
bash,perl,python(openstack,自動化運維架構),java(jsp,ssh,springstructs hibernate),ruby(rails)
PHP(personal homepage/forms interpreter-->Php is Hypertext Preprocessor超文本預處理器)專門開發WEB應用程式(win下用的是asp)
www.php.net
PDO(php data object);opcode(operationcode)
ZEND ENGINE(zeev,andi):将php代碼的處理過程分兩段(解釋(詞法分析,文法分析,php解釋器将phpsource 編譯解釋為二進制格式opcode,并放至記憶體中);zend engine執行opcode);
php sourcecode-->編譯解釋成二進制(php解釋器編譯)-->zendengine執行二進制格式opcode
解釋:詞法分析(以空格為分隔符切片,分析找出關鍵字,變量,控制結構);文法分析(句法分析);執行流(生成執行路徑)
編譯的opcode放在記憶體中(程序的位址空間中),并非磁盤(源程式在磁盤上),為避免opcode被清除(編譯的opcode程序終止)且實作在多個程序間共享opcode,引入了緩存加速功能
php加速器:任何一個程序編譯好的opcode不再放在自己的程序位址空間中,而是放在另一程式提供的緩存空間(記憶體空間)中,這個空間(PHP加速器,PHP緩存器)能被衆多的PHP程序共享;例如使用者通路動态内容,httpd發現是腳本,告知php,php解釋器解釋編譯為opcode,編譯完同時将編譯的opcode放至xcache中(當同一使用者下次通路同樣内容或其它使用者通路同樣内容,第二個程序将不再去解釋,而是先檢查Xcache有沒,若有直接拿來用),然後zend engine執行opcode,執行過程中如果要用到資料通過驅動連接配接資料庫,執行完将結果傳回至httpd。
注:解釋過程是很緩慢的,靜态内容的響應速度要比動态内容快的多的多,例如一台伺服器記憶體512M,請求phpMyAdmin的首頁面,做壓力測試,一般來說每秒能響應500個請求已經算不錯的了,但同樣的内容做成靜态頁面,不讓它執行php(或将PHP執行結果緩存下來,動态内容靜态化),讓httpd直接處理,這樣1秒響應1萬個請求是很輕松的,動态内容固然看起來很靈活很好用,但代價是非常大的;動态内容靜态化(優化站點的重要工作,把php的執行結果緩存,是執行結果緩存,緩存由httpd直接管理(不是php解釋器解釋編譯的opcode緩存,編譯結果要執行,執行可能會查資料庫,),則使用者第一次通路很慢,之後直接從緩存中擷取就快的多了。
PHP的加速器(PHP緩存器):APC(alternativephp cache);eAccelerator;Xcache(快速而且穩定的php opcode緩存,常用);Zend optimizer(執行)和Zend guard loader(加密)Nusphe;re php express
PHP源碼目錄結構:
build(源碼編譯相關檔案)
ext(官方的擴充目錄,array系列,pdo系列,spl系列)
main(PHP核心檔案,與zendengine不同)
Zend(zend引擎實作目錄,實作語言最核心的語言運作環境,腳本的詞法,文法分析,opcode的執行及擴充機制的實作)
pear(PHP擴充與應用倉庫,包含pear的核心檔案)
sapi(各種服務抽象層的代碼,opcode的mod_php,cgi,fastcgi,fpm接口)
TSRM(PHP的純種安全建構在TSRM庫之上)
tests(PHP的測試腳本集合)
win32(win平台的實作)
MVC(module viewcontroller):将業務邏輯和資料顯示分離的一種程式設計技術,嵌入式WEB開發語言
二、
httpd與php結合方式,三種:
CGI(兩個程序,有使用者通路httpd調用CGI協定臨時啟動CGI(php)程序,運作腳本,結束後通過程序間通信将資料傳回給httpd,之後httpd将CGI程序消亡,httpd負責CGI程序的建立删除,可簡便管理但性能不好)
module(僅一個程序,把PHP編譯成httpd的子產品,子產品加載至程序中運作,php_mod,DSO dynamic shared object,常用)
FastCGI(fpm,fast php module,需獨立編譯,php伺服器(daemon,socket:9000port)自身管理CGI程序;php5.3.3要使用fpm需打更新檔,php5.3.4之後即可直接編譯使用;Nginx處理靜态内容比httpd要好的多,若要分開通常使用Nginx+php(FastCGI)而不使用httpd+php(FastCGI)方式)
舉例:httpd+php(module)結合機制(centOS5.8-x86_64)
#yum list all | grep php
#yum -y install php53 php53-mbstring(centos5.8-x86_64依賴php53-cli,php53-common)
#rpm -ql php53
/etc/httpd/conf.d/php.conf
prefork模型與worker模型的工作模式下加載的子產品不同
AddHandler php5-script .php(httpd内置的一種處理勾子,可實作在内部用工具php5-script完成.php檔案)
AddType text/html .php(添加了一種類别MIMETYPE)
DirectoryIndex index.php(定義首頁檔案)
#vim /etc/php.ini(此檔案是分段式segment配置,同yum,mysql配置檔案,分全局與局部,分号是注釋符)
#cd /var/www/html
#mv index.html index.php
#vim index.php
<?php
phpinfo(); (php函數,可列出php相關配置資訊,每個指令分号結尾否則文法錯誤)
?>
#service httpd restart
在win下用浏覽器測試是否顯示成功http://192.168.1.222
三、
php與mysql結合(php與mysql均屬CPU密集型):
php本身和mysql并沒關系,隻是php程式用到資料(mysql-server)時,通過驅動連接配接mysql才與mysql建立聯系;而httpd僅解釋靜态内容(網頁檔案、圖檔、CSS樣式表),隻要是不需要執行腳本或程式的都由httpd處理;一旦是index.php腳本,借助php解釋器,httpd告知php(CGI、moudule、FastCGI)
方式:單層結構(httpd,php,mysql在同一台實體伺服器上);兩層結構(要麼httpd和php在一台,mysql另一台;要麼httpd一台,php+mysql另一台);三層結構(WEB-server、應用程式-server(php,jsp)、資料庫-server,每一層均可獨立擴充)
舉例:測試php與mysql是否連接配接成功,環境(CentOS5.8-x86_64)
#yum -y install php53-mysql php53-mcrypt libmcrypt(php要有驅動才能通路mysql;mcrypt,php裡重要的加密支援擴充庫)#yum -y install mysql mysql-server
#vim /var/www/html/index.php(編輯php腳本測試php與mysql是否連接配接成功)
$conn=mysql_connect(‘localhost’,’root’,’redhat’);
if ($conn)
echo “success...”;
else
echo “failure...”;
fi
phpinfo();
在win下用浏覽器測試是否顯示成功
舉例:通過phpMyAdmin管理mysql
phpMyAdmin(phpWEB伺服器程式,提供管理mysql界面)
#tar xf phpMyAdmin-2.11.11.3-all-languages.tar.bz2
#mv phpMyAdmin-4.1.4-all-languages/ pma
#cd pma
#cp config.sample.inc.php config.inc.php
#vim config.inc.php
$cfg['blowfish_secret'] = ' ';
#openssl rand -base64 10(将生成随機數放至上句空白處)
在win下浏覽器:http://192.168.1.222/pma
其它php應用有:
論壇類:discuz(www.discuz.net),phpwind(www.phpwind.net),phpbb(www.phpbb.com)
部落格平台:wordpress(wordpress.org)
舉例:discuz安裝
#mkdir /root/discuz
#upzip /root/Discuz_X3.2_SC_GBK.zip -d discuz/
#cd discuz
#cp -r upload/* /var/www/html/
#ls /var/www/html/upload
在win下浏覽器http://192.168.1.222按提示操作
注意:必須要将提示的紅色叉的目錄或檔案一一更改權限為777才能繼續;若顯示亂碼,要麼下載下傳時選擇UTF8格式的安裝包,要麼改/etc/httpd/conf/httpd.conf檔案,#AddDefaultCharsetUTF-8,将這行注釋掉
四、LAMP編譯注意事項
LAMP:linux、apache(httpd)、MySQL、php(或python,perl)
規劃:
linux(centos5.8_x86_64)
httpd2.4.7
mysql5.5.45(通用二進制程式GenericBinaries安裝,源碼安裝見III)
php5.4.6
安裝先後順序:apr和apr-util-->httpd-->mysql-->php-->xcache
準備好開發組環境:#yum -y groupinstall “Development Tools” “DevelopmentLibraries”
更改系統時間
注意防火牆iptables和selinux(#service iptables status,#getenforce)
三步驟:
#./configure --prefix=指定軟體安裝位置 [--sysconfdir=指定配置檔案位置](./configure --help | less)
#make
#make install
1、httpd
ASF,apache software foundation,管理衆多項目,如httpd,tomcat(應用程式伺服器),hadoop,cloudware(雲計算平台)等
httpd:用C語言編寫,通過apr(apacheportable runtime可移植運作環境)可快速移植,可了解為JVM(java virtual machine),将底層硬體及OS的不同通過apr抹合起來,這樣底層的apr有變化,httpd本身程式則不變,有win版本的apr和linux版本的apr
#rpm -q apr apr-util(apr-util工具元件,httpd2.4要求apr版本至少1.4以上,舊版1.2還不能卸,被其它軟體依賴,是以編譯安裝至指定目錄,隻要不在同一位置,則可以多版本共存,不像win有系統資料庫;注意若其它包安裝時用到apr要指定其目錄位置,lamp中apr隻被apr-util和httpd使用到)
redhat提供的rpm包安裝位置:
二進制程式/bin,/sbin,/usr/bin,/usr/sbin
庫檔案/lib,/usr/lib
配置檔案/etc
幫助檔案/usr/share/{doc,man}包括文檔和手冊
編譯安裝:
/usr/local/{bin/,sbin/,lib/,etc/,share/man}若用這種方式,軟體解除安裝時得要删除對應目錄下的檔案,比較麻煩
/usr/lcoal/APPLICATION_NAME/{bin,sbin,lib,etc,share}若用這種方式,軟體解除安裝隻要直接删除對應軟體目錄即可;但在編譯完後,要指定PATH環境變量、庫檔案位置、連結頭檔案、幫助檔案
#./configure --prefix=/usr/local/apr/(lamp中apr,apr-util隻專為httpd使用,在裝httpd時告訴apr位置,不用輸bin,sbin,lib等,隻要指定到目錄即可,httpd會自動查找)
#make && make install
#./configure --prefix=/usr/local/apr-util/ --with-apr=/usr/local/apr
httpd2.4用子產品化方式使用MPM(multipathprocessing module多道處理子產品:prefork,worker,event),httpd2.4預設使用event模型,httpd2.2預設使用prefork模型,注意如果要想靈活使用MPM,在這幾種模型中随時切換,編譯php時要編譯兩次(第二次将php編譯為zts格式才行)
httpd編譯選項:
--prefix=/usr/local/apache
--sysconfdir=/etc/httpd/
--enable-so(支援動态共享子產品,沒有此項的話php無法以子產品方式與httpd結合工作)
--enable-ssl(支援https)
--enable-deflate(響應client時将結果壓縮,節約帶寬)
--enable-proxy-fcgi(若httpd與php結合使用FastCGI此項要啟用)
--enable-mpm-shared=all
--with-mpm=event(設定預設是哪種,不指預設是event)
--enable-cgid(thread MPMs)
--enable-cgi(非thread)
--enable-rewrite(支援URL重寫)
--enable-modules=most(編譯FastCGI,後續要手工啟用)
--enable-mods-shared=most
--with-apr=/usr/local/apr
--with-apr-util=/usr/local/apr-util
錯誤:configure: error: pcre-config for libpcre not found
解決:#yum -y install pcre-devel(Perl Compatible Regular Expressions是一個Perl庫,包括 perl相容的正規表達式庫,devel包含普通包,隻比普通包多了頭檔案,動态連結庫的話兩種包都有,編譯的時候如果需要用到這個庫,那麼需要安裝這個庫的devel,因為需要頭檔案)
錯誤:configure: error: MPM most does not support dynamic loading.
解決:--enable-mpm-shared=all
錯誤:啟動服務時undefined symbol:apr……
--with-included-apr --with-apr=/usr/local/apr/bin/apr-1-config--with-apr-util=/usr/local/apr-util/bin/apu-1-config(指向具體位置)
#file bin/apachectl(使用此檔案開啟或關閉服務無任何提示)
#ls /usr/local/apache
htdocs/(網頁檔案位置)
logs/{access_log,error_log,httpd.pid}(*.pid檔案一般都在/var/run/下)
#vim /etc/httpd/httpd.conf
PidFile “/var/run/httpd.pid”(在配置檔案添加一行)
制作添加啟動腳本/etc/rc.d/init.d/httpd,使之可以像redhat,sysV風格那樣管理使用,啟動腳本見文末附錄
#chmod +x /etc/rc.d/init.d/httpd
#chkconfig --add httpd
#chkconfig --level 35 httpd on
#chkconfig --list httpd
#vim /etc/profile.d/httpd.sh(指定PATH,這樣可以直接使用apachectl,htpasswd,httpd)
export PATH=$PATH:/usr/lcoal/apache/bin
#httpd -M|-t|-l(-M列出已經加載的子產品,-t檢查配置檔案文法,-l列出編譯的靜态子產品)
切換MPM
LoadModule mpm_event_module modules/mod_mpm_prefor.so(更改這行即可,event改為prefork或worker)
httpd2.4新特性:MPM可運作時裝載;預設eventMPM;異步讀寫;在每子產品及每目錄上指定日志級别,日志不是全局的了;每請求配置<if>,<elseif>,<else>;增強的表達式分離器;毫秒級的keepalivetimeout,時間解析度更加精确,以前是秒級;基于域名的虛拟主機不再需要NameVirtualHost指令(此項重要);降低了記憶體占用;支援在配置檔案中使用自定義變量;基于IP的通路控制;新增子產品(mod_proxy_fcgi,mod_proxy_scgi,mod_proxy_express,mod_remoteip,mod_session,mod_ratelimit,mod_requst)
舉例:基于IP的通路控制
httpd2.2版本使用的是:
order deny,allow
allow from all
httpd2.4現使用:
Require user USERNAME
Require group GROUP
Require ip IPADDR|NETWORD/NETMASK|NET|172.16(表示172.16.0.0/16)
Require host HOSTNAME|DOMAIN|www.magedu.com|.com(表示域内的所有主機)
Require all granted(允許所有主機)
Require all deny(拒絕所有主機)
Require no ip IPADDR(不允許指定ip位址通路)
注:比對規則,自上而下,誰的範圍小選誰
2、MySQL
二進制格式的包要直接解壓至/usr/local目錄下(官方提示)
rpm包安裝的mysql,資料目錄預設在/var/lib/mysql;而源碼安裝資料目錄預設在/usr/local/mysql/data下,一般資料目錄放在獨立的一塊磁盤分區且是LV(logical volume),因為随着業務的增多資料檔案會越來越大,和程式檔案放在一塊不合适
#cd /usr/local/
#ln -sv mysql-5.5.28-linux2.6-x86_64/ mysql
#groupadd -r -g 306 mysql(-r建立系統使用者,大于500非系統使用者)
#useradd -r -u 306 -g 306 mysql
#id mysql
#grep mysql /etc/passwd
#cd /usr/local/mysql
#less INSTALL-BINARY(此檔案裡給出了具體安裝步驟)
#chown -R mysql:mysql ./*
#ll scripts/
#scripts/msyql_install_db --help
建立獨立的LV并将其挂載至/mydata/data
#chown -R mysql:mysql /mydata/data
#chmod o-rx /mydata/data
#scripts/mysql_install_db --user=mysql --datadir=/mydata/data
#chown root /usr/local/mysql(為安全,防止mysql被攻破擁有所有目錄權限,屬主改為root)
#cp support-files/mysql-server /etc/rc.d/init.d/mysqld
#cp support-files/my-large.cnf /etc/my.cnf
mysql的配置檔案:集中式分段式配置,同yum,php.ini,可以為多個程式提供配置
[mysql]
[mysqld](伺服器端生效)
[client]
mysql會逐個查找以下地方的配置檔案,生效順序如果有重項,後一個會覆寫前一個:
/etc/my.cnf-->/etc/mysql/my.cnf-->$BASEDIR/my.cnf-->~/.my.cnf
#head support-files/{my-small.cnf,my-medium.cnf,my-large.cnf,my-huge.cnf}(這幾個模闆配置檔案要求的記憶體不一樣,依次為<=64M,32-64M,512M,1-2G)
#vim /etc/my.cnf
[mysqld]
datadir = /mydata/data(添加此行)
thread_concurrency = CPU個數*2(線程并發量,#cat /proc/cpuinfo)
#vim /etc/profile.d/mysql.sh(添加PATH環境變量)
export PATH=$PATH:/usr/lcoal/mysql/bin
#vim /etc/ld.so.conf.d/mysql.conf(添加庫檔案路徑,系統啟動時會緩存庫檔案,庫檔案的緩存目錄在/etc/ld.so.cache)
/usr/local/mysql/lib
#ldconfig -v(加載庫檔案使之生效)
#ln -sv /usr/local/mysql/include /usr/include/mysql(連結頭檔案)
#vim /etc/man.config(添加幫助文檔)
MANPATH /usr/lcoal/mysql/man(添加此行)
#service mysql start
#mysql(直接登入)
mysql伺服器維護了兩類變量(對mysql的管理主要在此,調整mysql運作特性及性能調優):
伺服器變量:定義mysql伺服器運作特性>SHOW GLOBAL VARIABLES [LIKE ‘%STRING%’;
狀态變量:儲存了伺服器運作統計資料>SHOW GLOBAL STATUS;
mysql通配符:%表示任意長度任意字元;_表示任意單個字元
>SHOW DATABASES;(performance_schema系統狀态資訊收集庫)
>SELECT VERSION;(檢視版本)
>SELECT DATABASE();(檢視目前在哪個庫)
>SELECT USER();(檢視目前登入使用者)
>SHOW GLOBAL STATUS ‘%select%’;(檢視指定關鍵字相關的狀态資訊)
3、php(5.4.6)
編譯選項:
--prefix=/usr/local/php
--with-mysql=/usr/local/mysql
--with-openssl(支援openssl)
--with-mysqli=/usr/local/mysql/bin/mysql_config(另一接口用于與mysql連接配接)
--enable-mbstring(multi bytes各種語言都有自己的編碼,他們的位元組數是不一樣的,其它的編碼語言沒法在php程式上正确顯示,通過php的mbstring函數庫解決)
--with-freetype(#rpm -qi freetype引用不同字型)
--with-jpeg-dir
--with-png-dir
--with-zlib(壓縮有關)
--with-libxml-dir=/usr
--enable-xml
--enable-sockets
--with-apxs2=/usr/local/apache/bin/apxs(httpd與php結合的方式為module,若要使用FastCGI模式此項改為--enable-fpm)
--with-mcrypt(若出錯提示mcrypt.h notfound,則要裝以下四個包libmcrypt,libmcrypt-devel,mhash,mhash-devel,下載下傳時注意平台與OS都要對應rpmfind.net)
--with-config-file-path=/etc(主配置檔案/etc/php.ini)
--with-config-file-scan-dir=/etc/php.d(/etc/php.d/*.ini)
--with-bz2
--enable-maintainer-zts(#httpd -M如果httpd使用的是prefork則不需此項,若是worker,event則要加此項)
#cp php-5.4.6/php.ini-production /etc/php.ini
#ls /usr/local/php(這裡隻有基本檔案,如bin/{php-config,phpize},etc/為子項目提供的配置檔案,include/,lib/,php/man,而php自身在/usr/local/apache/modules/libphp5.so權限755)
注:在make install時提示Installing PHP SAPI(server API) module(apache2 handler)(為apache提供了一個處理器,讓apache以子產品方式調用php);*.ini的配置檔案格式同yum,mysql。
#cp php5.4.13/php.ini-production /etc/php.ini
配置httpd與php結合工作:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps(添加這兩行,讓httpd能夠處理.php結尾的檔案)
DirectoryIndex index.php index.html(添加index.php)
Include /etc/httpd/extra/{httpd-autoindex.conf,httpd-userdir.conf,httpd-ssl.conf,httpd-vhost.conf}(按要求啟用,分别為自動索引,使用者家目錄下的個人首頁,https加密傳輸(需安裝mod_ssl子產品))
#httpd -t
#vim /etc/httpd/htdocs/index.php
$conn=mysql_connect(‘localhost’,’root’,’’);
if ($conn)
echo “success.”;
echo “failure.”;
浏覽器測試httpd+php,php+mysql
配置xcache
Xcache是php的子產品,是php的擴充,要與php結合工作xcache版本要是2.0以上
用php相關指令可以加載相關擴充(php_config,phpize)
#man -M /usr/local/php/php/man phpize
#/usr/local/php/bin/phpize(prepare aPHP extension for compiling,所有的擴充在編譯前都要執行這個指令)
--enable-xcache
--with-php-config=/usr/local/php/bin/php-config
(不用指--prefix預設會裝到php擴充路徑裡)
#cp xcache.ini /etc/php.d/(要麼将解壓目錄下的xcache複制到/etc/php.d下;要麼将此檔案追加到/etc/php.ini檔案中)
#vim /etc/php.d/xcache.ini
[xcache-common]
[xcache-admin](管理功能)
[xcache]
xcache.shm_sheme = “mmap”(shm,sharedmemory,用哪種方式使用共享記憶體,在php程序間共享資料,mmap,memory map,一段記憶體供多個程序通路)
xcache.size = 60M(緩存代碼opcode的空間大小,設為0表示禁用)
xcache.count = 1(CPU個數)
xcache.slots = 8K(緩存當中的每個槽位緩存多少個opcode)
xcache.ttl = 0(過期時間,0為永不過期)
xcache.gc_interval = 0(過期的内容要清理,空間要回收,gc,garbage collection垃圾回收器,規定多長時間工作一次,啟用會帶來OS額外開銷,用不着就不啟用)
xcache.var_size = 4M(變量緩存)
xcache.cacher = on(緩存功能是否啟用)
xcache.optimizer = off(xcache自己的優化器)
#service httpd restart(xcache子產品是由httpd加載的)
壓力測試工具:ab、httpd_load、siege、webbench
#man ab(壓力測試工具,性能評估工具,Apache HTTP server benchmarking tool,可以自己測自己(忽略網絡狀況和網絡吞吐能力),也可測遠端主機)
time taken for test(從第一個請求開始到最後一個響應封包結束的總共時間)
total transferred(總體資料大小,包括資料本身、TCP首部、IP首部、frame首部)
HTML transferred(僅資料本身大小)
Requests per second: 48.96 [#/sec] (mean)
Time per request: 20424.438 [ms] (mean)
Time per request: 20.424 [ms] (mean, across all concurrentrequests)
Transfer rate: 18.99 [Kbytes/sec] received
#vmstat 1(測試時觀察r運作隊列長度,b阻塞隊列長度,cs數量會很大context switch,若開啟日志功能bi,bo也會很大)
#cd
實作httpd與php通過fastCGI方式工作(httpd與mysql編譯安裝就緒):
#yum -y groupinstall “X Software Development”
僅将上步編譯php的選項中--with-apxs2=/usr/local/apache/bin/apxs改為--enable-fpm,其它的不動
#cp php.ini-production /etc/php.ini
#cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
#chmod +x /etc/init.d/php-fpm
#chkconfig --add php-fpm
#chkconfig php-fpm on
#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
#vim /usr/local/php/etc/php-fpm.conf(預設監聽在127.0.0.1:9000,工作機制同httpd的mpm模型,若httpd與php不在同一主機上就要指定外部IP)
pm.max_children = 50(設定最多子程序數目)
pm.start_servers = 5(剛開始啟動空閑程序的數目)
pm.min_space_servers = 5(最少空閑程序數目)
pm.max_space_servers = 8(最多空閑程序數目)
pid = /usr/local/php/var/run/php-fpm.pid
#service php-fpm start
#ps aux | grep php-fpm
#netstat -tnlp | grep php-fpm
#vim /etc/httpd/httpd.conf(啟用mod_proxy.so和mod_proxy_fcgi.so,添加AddType,修改DirectoryIndex)
LoadModule proxy_modulemodules/mod_proxy.so
LoadModule proxy_fcgi_modulemodules/mod_proxy_fcgi.so
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source.phps
DirectoryIndex index.php index.html
#vim /etc/httpd/extra/httpd-vhost.conf(在相應虛拟主機上添加如下資訊)
ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1($1引用前面括号裡的内容,類似正規表達式\1,ProxyPass多了Match表示支援正規表達式)
用浏覽器驗證,檢視ServerAPI為FPM/FastCGI)
附:
/etc/rc.d/init.d/httpd腳本制作(sysv風格):
#!/bin/bash
#
# httpd Startup script for the Apache HTTPServer
# chkconfig: - 85 15
# description: Apache is a World Wide Webserver. It is used to serve \
# HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowingup a pass-phrase prompt if
# mod_ssl needs a pass-phrase from theuser.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in/etc/sysconfig/httpd to use a server
# with the thread-based "worker"MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM;notably PHP will refuse to start.
# Path to the apachectl script, serverbinary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo-n $"Stopping $prog: "
killproc-p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[$RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntaxerror"
else
killproc -p ${pidfile} $httpd -HUP
fi
echo
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
status)
status -p ${pidfile} $httpd
restart)
condrestart)
if[ -f ${pidfile} ] ; then
stop
start
fi
reload)
reload
graceful|help|configtest|fullstatus)
$apachectl$@
*)
echo$"Usage: $prog{start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit1
esac
exit $RETVAL
本文轉自 chaijowin 51CTO部落格,原文連結:http://blog.51cto.com/jowin/1704730,如需轉載請自行聯系原作者