一、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是否连接成功)
<?php
$conn=mysql_connect(‘localhost’,’root’,’redhat’);
if ($conn)
echo “success...”;
else
echo “failure...”;
fi
?>
<?php
phpinfo();
?>
#service httpd restart
在win下用浏览器测试是否显示成功
举例:通过phpMyAdmin管理mysql
phpMyAdmin(phpWEB服务器程序,提供管理mysql界面)
#cd /var/www/html
#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)
CMS:drypal(CMF,contentmanagement framwork内容管理框架(CMS+framwork)www.drupal.org,Drupal的代码在安全性、健壮性上具有世界最高水平Drupal的学习曲线相当漫长和陡峭,比PHP难度大得多,要求也高的多。只有精通XHTML、CSS、Javascript、PHP、MySql的开发人员,经过长期刻苦的学习,才有可能真正的驾驭Drupal。Drupal技术圈内有一句名言——“Drupal有难度,学习需谨慎。”);joomla,CMS。
博客平台: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
#service httpd restart
在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
#make && make install
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
#vim /etc/httpd/httpd.conf
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结合工作:
#vim /etc/httpd/httpd.conf
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
#service httpd restart
#vim /etc/httpd/htdocs/index.php
<?php
$conn=mysql_connect(‘localhost’,’root’,’’);
if ($conn)
echo “success.”;
else
echo “failure.”;
?>
<?php
phpinfo();
?>
浏览器测试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,可以自己测自己(忽略网络状况和网络吞吐能力),也可测远程主机)
#ab [-r] -c # -n # http://FQDN/FILE(-r忽略报错;-c,concurrency并发量,一次发起的请求数;-n,request总请求数;n>c,否则-c指定的数就没意义了;一定要指定具体文件)
例:#ab -c 100 -n 10000 http://www.a.org/index.html
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表示支持正则表达式)
例:ProxyPassMatch /images/a.jpg http://172.16.100.2/images/a.jpg(反向代理)
#service httpd restart
#vim index.php
<?php
phpinfo();
?>
用浏览器验证,查看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
fi
# 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
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntaxerror"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if[ -f ${pidfile} ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl$@
RETVAL=$?
;;
*)
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,如需转载请自行联系原作者