天天看點

Linux運維 第三階段 (八)了解LAMP

一、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,如需轉載請自行聯系原作者