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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

一、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,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
运维 监控 安全
盘点Linux服务器运维管理面板
随着云计算和大数据技术的迅猛发展,Linux服务器在运维管理中扮演着越来越重要的角色。传统的Linux服务器管理方式已经无法满足现代企业的需求,因此,高效、安全、易用的运维管理面板应运而生。
|
2月前
|
运维 监控 网络协议
|
19天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
42 3
|
2月前
|
存储 运维 搜索推荐
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
45 1
|
2月前
|
运维 网络协议 安全
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
45 1
|
3月前
|
运维 监控 Linux
深入理解Linux系统运维:命令行工具的力量
【9月更文挑战第14天】在Linux的世界里,命令行工具是系统管理员的瑞士军刀。本文将带你领略命令行的魅力,从基础操作到高级技巧,让你的运维工作更加高效和精准。准备好了吗?让我们一起开启这段探索之旅!
|
2月前
|
Web App开发 运维 安全
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
|
4月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
164 3
|
3月前
|
消息中间件 运维 Linux
linux之centos运维kafka
linux之centos运维kafka