在上一篇中,我们已经安装httpd,以及mysql服务。那么接下来,我们将安装php。
我们知道,php工作的模式有三种:cgi, module, fastcgi。通常,apache与php是以模块的方式结合的,鉴于fastcgi的工作模式会有更好的效率,待会儿也会讲解。
一、以模块化的方式编译php, php作为apache的模块被加载
如果我们先前没有安装: libxml2 libxml2-devel bzip2-devel libmcrypt libmcrypt-devel
需要安装这些包:
[[email protected] ~]# yum -y install libxml2 libxml2-devel bzip2-devel libmcrypt libmcrypt-devel
不过,我这边没有libmcrypt*包:
No package libmcrypt available.
No package libmcrypt-devel available.
可以到这个网站下载rpm包:http://rpm.pbone.net/
[[email protected] ~]# ls | grep lib* [[email protected] ~]# ls lib* libmcrypt-2.5.8-9.el6.i686.rpm libmcrypt-devel-2.5.8-9.el6.i686.rpm [[email protected] ~]# rpm -ivh lib* warning: libmcrypt-2.5.8-9.el6.i686.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY Preparing... ########################################### [100%] 1:libmcrypt ########################################### [ 50%] 2:libmcrypt-devel ########################################### [100%]
1、解压,编译
--with-apxs2=/usr/local/apache/bin/apxs # 基于apxs实现让php编译成apache模块
ok, 言归正传。go...
[[email protected] ~]# tar xf php-5.4.30.tar.gz -C /usr/local/src [[email protected] ~]# cd /usr/local/src/php-5.4.30 [[email protected] php-5.4.30]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts ## 说明: --prefix=/usr/local/php # php安装路径 --with-mysql=/usr/local/mysql # mysql安装路径 --with-openssl # 支持openssl功能 --with-mysqli=/usr/local/mysql/bin/mysql_config # mysql与apache访问的另一种接口,安装在二进制目录下 --enable-mbstring # 多字节string --with-freetype-dir # 安装的字体库头文件 --with-jpeg-dir # jpeg类型的库 --with-png-dir # png类型的库 --with-zlib # 互联网上通用压缩库,先压缩再传送,减少带宽 --with-libxml-dir=/usr # xml库文件的路径 --enable-xml # 支持xml功能 --enable-sockets # php支持套接字功能 --enable-fpm # PHP FastCGI --with-apxs2=/usr/local/apache/bin/apxs # 基于apxs实现让php编译成apache模块 --with-mcrypt # 支持额外的加密库 --with-config-file-path=/etc # php配置文件放置路径 --with-config-file-scan-dir=/etc/php.d # php配置文件的分段文件放置路径 --with-bz2 # 压缩库 --enable-maintainer-zts # 当apache使用worker或event这两个MPM,编译时使用该选项,这一项的使用取决于apache是什么类型的,apache使用的是prefork就不需要;如果使用的是event或者是worker就要添加这一项;apache以线程工作就必须编译这一项 [[email protected] php-5.4.30]# make && make install /usr/local/php # 是php的主目录 /usr/local/php/bin # php的命令行工具 /usr/local/php/etc # 配置文件
2、为php提供配置文件
在编译的时候已经指定了配置文件的路径,所以php会自动到/etc/目录下去找其配置文件
[[email protected] php-5.4.30]# cp php.ini-production /etc/php.ini
3、整合apache和php
我们知道,对于单纯的web服务器,而不是应用程序服务器来说,它仅支持html格式的静态网页格式。那么apache是如何能够支持动态网页的呢?比如,php等。
PHP有三种工作模式:cgi, moudle, fastcgi。当apache发现处理的页面是动态网页(看文件名后缀),那么它就在配置文件中找,看哪种应用程序(handler)能够编译解释这种类型,就把这些页面交给相应的应用程序处理, 然后应用程序返回apache纯html静态页面,然后apache再把html页面返回给客户端浏览器。
1、编辑 /etc/httpd/httpd.conf配置文件, 定位到 AddType
我们查看/etc/httpd/httpd.conf, 可以看到php被作为apache的一个模块被加载
[[email protected] ~]# vi /etc/httpd/httpd.conf # 添加下面两行,目的是为了让Apache能解释".php"的文件 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
2、定位到 DirectoryIndex
<IfModule dir_module> DirectoryIndex index.php index.html # 修改apache默认页面类型 </IfModule>
3、测试
[[email protected] ~]# httpd -t [[email protected] ~]# service httpd restart [[email protected] ~]# vi /usr/local/apache/htdocs/index.php # 添加如下内容 <?php phpinfo(); ?>
通过浏览器访问, 如果出现以下页面,说明OK
4、php与mysql结合
编译php时,确保--with-mysql选项,这样php就能够调用mysql提供的库
[[email protected] ~]# vi /usr/local/apache/htdocs/index.php <?php $conn = mysql_connect(‘localhost‘, ‘root‘, ‘123456‘); if ($conn) echo "Connect MySQL Success"; else echo "Failure, can‘t connect mysql"; ?>
通过浏览器访问,如果出现以下页面,说明OK
apache中配置php支持module模式、cgi模式和fastcgi模式的实验
首先安装apache、mysql和php,依次顺序安装。
apache需要支持fastCGI, 并且php也要支持fastCGI, 两者同时都支持才可以。
1.apache、mysql的安装比较简单,略过
2. php的安装,我安装的是php5.4.30内置了php-fpm,所以不需要再单独下补丁了。
如果php是较低的版本,可能需要单独安装php-fpm
[[email protected] ~]# yum -y install php-fpm
如果内置php-fpm, 那么在编译的时候,指定 --enable-fpm 选项即可
# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --enable-fpm # fastCGI --with-apxs2=/usr/local/apache/bin/apxs # module
注意:
--enable-fastcgi
--enable-force-cgi-redirect
这2个php新版本已经内置支持,所以如果加上这2个参数,make完毕会提示这2个参数找不到。所以不需要加这2个参数了。
--with-apxs2
这个参数看到有的文章说需要fastcgi模式的话,就不能配置这个,其实也不完全是这样,这个参数的用途只不过是把php的解释模块编译成so文件添加到apache的modules中,并且自动添加到conf文件。如果我们不想用模块模式的话,在httpd.conf中把:
LoadModule php5_module modules/libphp5.so
这行注释掉就可以了。
3.apache mod_fastcgi的安装
### 可能需要如下依赖包,一般不用,先编译mod_fastcgi, 如果编译报错,再安装 ### yum -y install httpd-devle apr apr-devel libtool # wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz # tar -zxvf mod_fastcgi-2.4.6.tar.gz # cd mod_fastcgi-2.4.6 # cp Makefile.AP2 Makefile # vim Makefile ## 将Makefile中的top_dir 路径改成你的apache的安装路径 top_dir = /usr/local/apache # make && make install ### 安装成功后,会自动把mod_fastcgi.so复制到/usr/local/apache/modules目录下
接下来是如何配置这4种模式:
1.模块模式
这种模式最简单,在http.conf中增加
LoadModule php5_module modules/libphp5.so
即可。然后在添加 AddType
<IfModule mime_module> AddType application/x-httpd-php .php AddType applicaiton/x-httpd-php-source .phps
2.CGI模式
这种模式需要在httpd.conf中注释掉
LoadModule php5_module modules/libphp5.so
这行。如果不注释这行会一直走到handler模式。也就是module模式。
然后在httpd.conf增加action:
Action application/x-httpd-php /cgi-bin/php-cgi
如果在/cgi-bin/目录找不到php-cgi.可自行从php的bin里面cp一个。
然后重启apache,再打开测试页面发现Server API变成:CGI/FastCGI。说明成功切换为cgi模式。
# service httpd restart
Fastcgi的优点:
- 从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分 配新的进程来运行逻辑.
- 从安全性上看,Fastcgi支持分布式运算. fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮.
- 从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与.
- 从扩展性上讲, fastcgi是一个中立的技术标准, 完全可以支持任何语言写的处理程序 (php,java,perl,ruby,c++,python...)
- 适用操作系统,可在任何平台上http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz使用
3.FastCgi模式,用apche内置进程管理器
首先要添加mod_fastcgi模块到httpd.conf配置文件:
LoadModule fastcgi_module modules/mod_fastcgi.so
这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,但是最好还是注释掉比较好。只要配置了以下模块
<IfModule fastcgi_module> FastCgiServer /usr/local/apache/cgi-bin/php-cgi -processes 20 AddType application/x-httpd-php .php AddHandler php-fastcgi .php Action php-fastcgi /cgi-bin/php-cgi </IfModule>
就会自动走到fastcgi模式。
然后重启apache,这个时候用 ps aux | grep php就会发现有很多php-cgi进程在运行。说明配置生效
4.FastCgi模式,用php-fpm进程管理器
首先要添加mod_fastcgi模块到httpd.conf配置文件:
LoadModule fastcgi_module modules/mod_fastcgi.so
然后重启httpd
[[email protected] ~]# service httpd restart [[email protected] ~]# tail /usr/local/apache/logs/error_log [Mon Jul 21 15:44:21 2014] [notice] FastCGI: process manager initialized (pid 1274)
接着编辑 /etc/httpd/conf.d/fastcgi.php.conf 配置文件成:
<IfModule fastcgi_module> FastCgiExternalServer /usr/local/apache/cgi-bin/php-cgi -host 127.0.0.1:9000 AddType application/x-httpd-php .php AddHandler php-fastcgi .php Action php-fastcgi /cgi-bin/php-cgi </IfModule> 注释: #配置fastcgi server # 可能需要指定php-cgi的位置 ScriptAlias /cgi-bin/ "/usr/local/php/bin/" #增加MIME类型 AddType application/x-httpd-php .php #.php结尾的请求都要用php-fastcgi来处理 AddHandler php-fastcgi .php #设置php-fastcgi的处理器 Action php-fastcgi /cgi-bin/php-cgi
注意,127.0.0.1:9000是php-fpm的开启端口,所以我们还需要把php-fpm打开。
如果是yum安装的php-fpm,
/usr/sbin/php-fpm # php-fpm服务启动脚本: /etc/init.d/php-fpm , 配置文件/etc/php-fpm.conf ,/etc/php-fpm.d/ # chkconfig --add php-fpm # chkconfig php-fpm on # service php-fpm {start|stop}
如果是编译php时,指定的--enable-fpm,
/usr/local/php/sbin/php-fpm start 配置文件: /usr/local/php/etc/php-fpm.conf
查看php-fpm是否启动,我们看到php-fpm监听在9000端口上
[[email protected] ~]# netstat -tulpn | grep php tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1192/php-fpm [[email protected] ~]# ps -ef | grep php root 1472 1 0 16:14 ? 00:00:00 php-fpm: master process (/etc/php-fpm.conf) apache 1473 1472 0 16:14 ? 00:00:00 php-fpm: pool www apache 1474 1472 0 16:14 ? 00:00:00 php-fpm: pool www apache 1475 1472 0 16:14 ? 00:00:00 php-fpm: pool www apache 1476 1472 0 16:14 ? 00:00:00 php-fpm: pool www apache 1477 1472 0 16:14 ? 00:00:00 php-fpm: pool www
php-fpm有一个主进程 master process,它负责其他子进程的创建与销毁工作。可以在/etc/php-fpm.conf, 以及/etc/php-fpm.d/*.conf中进行配置。
再测试下访问没问题,大功搞成咯。
参考:
https://www.centos.bz/2011/12/configure-apache-run-php-as-fastcgi/
http://ixdba.blog.51cto.com/2895551/806622
编译安装LAMP之二