Linux运维 第三阶段 (八)理解LAMP

技术小阿哥 2017-11-27

linux php 服务器 mysql Apache 模块 配置 脚本 index vim service

一、php相关概念:

web,借助于MIME传来的mp3文件,并不能直接打开,而要调用相应的程序才能打开

 

动态站点:

client动态(不建议使用,要从server-side下载源程序然后在client本地环境中运行,且将结果在浏览器上显示,如果源程序本身代码有问题或是开发者不怀好意,客户端就遭殃了会病毒或木马,win早期使用的是ActiveXJAVA早期使用APPLET借助于JVM java virtual machine可一次编译到处运行);

server动态

 

CGIcommon gatewayinterface:使前端web服务器进程根据对应程序的不同,调用对应的执行环境来运行对应的程序文件,并将运行结果取回至WEB进程,任何一种语言都可开发CGI程序,只不过有一些语言更适合开发WEB应用程序webapp(client请求一页面,调用相应的运行环境,将运行结果格式化为HTML文档返回给client)

 

编程语言:

静态语言:强类型,编译型语言,先编译才能运行,如C,C++,JAVA,优点(效率高),缺点(每一次改动都要重新编译,开发周期长,维护成本大),实时场景及面向底层的环境都用CC++开发(OS,驱动)至少要比解释型语言性能高30%

动态语言:弱类型,解释型语言,如shell,perl,python,变量可直接拿来用,不用事先说明解释器执行即可,优点(便于维护,有众多共享模块,开发周期短,维护成本小),缺点(性能差),一般用动态语言开发动态站点。

bash,perl,python(openstack,自动化运维框架),java(jsp,ssh,springstructs hibernate),ruby(rails)

 

PHPpersonal 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发现是脚本,告知phpphp解释器解释编译为opcode,编译完同时将编译的opcode放至xcache中(当同一用户下次访问同样内容或其它用户访问同样内容,第二个进程将不再去解释,而是先检查Xcache有没,若有直接拿来用),然后zend engine执行opcode,执行过程中如果要用到数据通过驱动连接数据库,执行完将结果返回至httpd

注:解释过程是很缓慢的,静态内容的响应速度要比动态内容快的多的多,例如一台服务器内存512M,请求phpMyAdmin的主页面,做压力测试,一般来说每秒能响应500个请求已经算不错的了,但同样的内容做成静态页面,不让它执行php(或将PHP执行结果缓存下来,动态内容静态化),让httpd直接处理,这样1秒响应1万个请求是很轻松的,动态内容固然看起来很灵活很好用,但代价是非常大的;动态内容静态化(优化站点的重要工作,把php的执行结果缓存,是执行结果缓存,缓存由httpd直接管理(不是php解释器解释编译的opcode缓存,编译结果要执行,执行可能会查数据库,),则用户第一次访问很慢,之后直接从缓存中获取就快的多了。

PHP的加速器(PHP缓存器):APCalternativephp cache;eAccelerator;Xcache(快速而且稳定的php opcode缓存,常用);Zend optimizer(执行)和Zend guard loader(加密)Nusphe;re php express

 

PHP源码目录结构:

build(源码编译相关文件)

ext(官方的扩展目录,array系列,pdo系列,spl系列)

mainPHP核心文件,与zendengine不同)

Zendzend引擎实现目录,实现语言最核心的语言运行环境,脚本的词法,语法分析,opcode的执行及扩展机制的实现)

pearPHP扩展与应用仓库,包含pear的核心文件)

sapi(各种服务抽象层的代码,opcodemod_php,cgi,fastcgi,fpm接口)

TSRMPHP的纯种安全构建在TSRM库之上)

testsPHP的测试脚本集合)

win32win平台的实现)

 

MVCmodule viewcontroller):将业务逻辑和数据显示分离的一种编程技术,嵌入式WEB开发语言

 

 

二、

httpdphp结合方式,三种:

CGI(两个进程,有用户访问httpd调用CGI协议临时启动CGI(php)进程,运行脚本,结束后通过进程间通信将数据返回给httpd,之后httpdCGI进程消亡,httpd负责CGI进程的创建删除,可简便管理但性能不好)

module(仅一个进程,把PHP编译成httpd的模块,模块加载至进程中运行,php_modDSO dynamic shared object,常用)

FastCGIfpm,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-mbstringcentos5.8-x86_64依赖php53-cli,php53-common

#rpm -ql  php53

/etc/httpd/conf.d/php.conf

prefork模型与worker模型的工作模式下加载的模块不同

AddHandler php5-script .phphttpd内置的一种处理勾子,可实现在内部用工具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

 

 

三、

phpmysql结合(phpmysql均属CPU密集型):

php本身和mysql并没关系,只是php程序用到数据(mysql-server)时,通过驱动连接mysql才与mysql建立联系;而httpd仅解释静态内容(网页文件、图片、CSS样式表),只要是不需要执行脚本或程序的都由httpd处理;一旦是index.php脚本,借助php解释器,httpd告知phpCGImouduleFastCGI

方式:单层结构(httpd,php,mysql在同一台物理服务器上);两层结构(要么httpdphp在一台,mysql另一台;要么httpd一台,php+mysql另一台);三层结构(WEB-server、应用程序-server(php,jsp)、数据库-server,每一层均可独立扩展)

 

举例:测试phpmysql是否连接成功,环境(CentOS5.8-x86_64)

#yum -y  install  php53-mysql php53-mcrypt  libmcryptphp要有驱动才能访问mysqlmcrypt,php里重要的加密支持扩展库)#yum  -y install  mysql  mysql-server

#vim /var/www/html/index.php(编辑php脚本测试phpmysql是否连接成功)

<?php

$conn=mysql_connect(‘localhost’,’root’,’redhat’);

if ($conn)

 echo  “success...”;

else

 echo  “failure...”;

fi

?>

<?php

phpinfo();

?>

#service httpd  restart

win下用浏览器测试是否显示成功

 

举例:通过phpMyAdmin管理mysql

phpMyAdminphpWEB服务器程序,提供管理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)

CMSdrypalCMF,contentmanagement framwork内容管理框架(CMS+framworkwww.drupal.org,Drupal的代码在安全性、健壮性上具有世界最高水平Drupal的学习曲线相当漫长和陡峭,比PHP难度大得多,要求也高的多。只有精通XHTMLCSSJavascriptPHPMySql的开发人员,经过长期刻苦的学习,才有可能真正的驾驭DrupalDrupal技术圈内有一句名言——“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编译注意事项

LAMPlinuxapache(httpd)MySQLphp(python,perl)

规划:

linux(centos5.8_x86_64)

httpd2.4.7

mysql5.5.45(通用二进制程序GenericBinaries安装,源码安装见III)

php5.4.6

安装先后顺序:aprapr-util-->httpd-->mysql-->php-->xcache

准备好开发组环境:#yum  -y  groupinstall “Development Tools”  “DevelopmentLibraries”

更改系统时间

注意防火墙iptablesselinux#service  iptables  status#getenforce

 

三步骤:

#./configure  --prefix=指定软件安装位置  [--sysconfdir=指定配置文件位置]./configure  --help |  less

#make

#make install

 

1httpd

ASF,apache software foundation,管理众多项目,如httpd,tomcat(应用程序服务器),hadoop,cloudware(云计算平台)等

 

httpd:用C语言编写,通过aprapacheportable runtime可移植运行环境)可快速移植,可理解为JVMjava virtual machine),将底层硬件及OS的不同通过apr抹合起来,这样底层的apr有变化,httpd本身程序则不变,有win版本的aprlinux版本的apr

 

#rpm -q  apr  apr-utilapr-util工具组件,httpd2.4要求apr版本至少1.4以上,旧版1.2还不能卸,被其它软件依赖,所以编译安装至指定目录,只要不在同一位置,则可以多版本共存,不像win有注册表;注意若其它包安装时用到apr要指定其目录位置,lampapr只被apr-utilhttpd使用到)

 

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/lampapr,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用模块化方式使用MPMmultipathprocessing 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(若httpdphp结合使用FastCGI此项要启用)

--enable-mpm-shared=all

--with-mpm=event(设置默认是哪种,不指默认是event

--enable-cgidthread 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-develPerl 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改为preforkworker

 

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地址访问)

注:匹配规则,自上而下,谁的范围小选谁

 

 

2MySQL

二进制格式的包要直接解压至/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%’;(查看指定关键字相关的状态信息)

 

 

3php(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-mbstringmulti bytes各种语言都有自己的编码,他们的字节数是不一样的,其它的编码语言没法在php程序上正确显示,通过phpmbstring函数库解决)

--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/apxshttpdphp结合的方式为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

 

配置httpdphp结合工作:

#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+phpphp+mysql

 

 

配置xcache

Xcachephp的模块,是php的扩展,要与php结合工作xcache版本要是2.0以上

php相关命令可以加载相关扩展(php_config,phpize

#man -M  /usr/local/php/php/man  phpize

#/usr/local/php/bin/phpizeprepare 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进程间共享数据,mmapmemory map,一段内存供多个进程访问)

xcache.size = 60M(缓存代码opcode的空间大小,设为0表示禁用)

xcache.count = 1CPU个数)

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 = offxcache自己的优化器)

#service httpd  restartxcache模块是由httpd加载的)

 

 

压力测试工具:abhttpd_loadsiegewebbench

#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 

 

 

实现httpdphp通过fastCGI方式工作(httpdmysql编译安装就绪):

#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,工作机制同httpdmpm模型,若httpdphp不在同一主机上就要指定外部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.somod_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引用前面括号里的内容,类似正则表达式\1ProxyPass多了Match表示支持正则表达式)

例:ProxyPassMatch /images/a.jpg  http://172.16.100.2/images/a.jpg(反向代理)

#service httpd  restart

#vim index.php

<?php

phpinfo();

?>

用浏览器验证,查看ServerAPIFPM/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,如需转载请自行联系原作者

登录 后评论
下一篇
云栖号资讯小编
33787人浏览
2020-07-13
相关推荐
北京开源人linux运维实战
782人浏览
2016-04-24 19:34:14
网站架构的逐步优化演变
1225人浏览
2019-03-08 19:20:47
0
0
0
1334