在上一篇中,我们已经安装httpd,以及mysql服务。那么接下来,我们将安装php。
我们知道,php工作的模式有三种:cgi, module, fastcgi。通常,apache与php是以模块的方式结合的,鉴于fastcgi的工作模式会有更好的效率,待会儿也会讲解。
一、以模块化的方式编译php, php作为apache的模块被加载
安装php所需要的扩展包
如果我们先前没有安装: libxml2 libxml2-devel bzip2-devel libmcrypt libmcrypt-devel
curl curl-devel libjpeg libjpeg-devel libpng libpng-devel libtool-ltdl-devel
需要安装这些包:
[root@localhost ~]# yum -y install libxml2 libxml2-devel bzip2-devel libmcrypt libmcrypt-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel libtool-ltdl-devel
当然,同样可以编译安装这些第三方包以及其扩展包。 libxml2, bzip2, libmcrypt, gpeg, png, gd, freetype 等,安装过程还是三步走 configure && make && make install。
这里,我就偷懒了,用yum 一下就搞定了。
不过,我这边没有libmcrypt*包:
No package libmcrypt available.
No package libmcrypt-devel available.
可以到这个网站下载rpm包:http://rpm.pbone.net/
[root@localhost ~]# ls | grep lib* [root@localhost ~]# ls lib* libmcrypt-2.5.8-9.el6.i686.rpm libmcrypt-devel-2.5.8-9.el6.i686.rpm [root@localhost ~]# 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...
[root@localhost ~]# tar xf php-5.4.30.tar.gz -C /usr/local/src [root@localhost ~]# cd /usr/local/src/php-5.4.30 [root@localhost 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以线程工作就必须编译这一项 # 更多编译参数解释参考http://www.php.net/manual/zh/configure.about.php或者./configure --help查看。 [root@localhost php-5.4.30]# make && make install /usr/local/php # 是php的主目录 /usr/local/php/bin # php的命令行工具 /usr/local/php/etc # 配置文件
2、为php提供配置文件
在编译的时候已经指定了配置文件的路径,所以php会自动到/etc/目录下去找其配置文件
[root@localhost php-5.4.30]# cp php.ini-production /etc/php.ini ## 编辑配置文件,以提高安全性 找到:;open_basedir = 修改为:open_basedir = .:/tmp/ #防止php木马跨站,重要!! 找到:disable_functions = 修改为:disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname #列出PHP可以禁用的函数,如果某些程序需要用到这个函数,可以删除,取消禁用。 # 比如说, cacti 就需要用到上述某些函数,需要取消禁用。可以查看httpd 的日志。 找到:;date.timezone = 修改为:date.timezone = PRC 找到:expose_php = On 修改为:expose_php = OFF #禁止显示php版本的信息 找到:display_errors = On 修改为:display_errors = OFF #关闭错误提示
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的一个模块被加载,因为我们在编译php的时候,指定了 --with-apxs2=/usr/local/apache/bin/apxs 选项。
[root@localhost ~]# 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、测试
[root@localhost ~]# httpd -t [root@localhost ~]# service httpd restart [root@localhost ~]# vi /usr/local/apache/htdocs/index.php # 添加如下内容 <?php phpinfo(); ?>
通过浏览器访问, 如果出现以下页面,说明OK
4、php与mysql结合
编译php时,确保 --with-mysql 选项,这样php就能够调用mysql提供的API库
[root@localhost ~]# 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
5、安装memcache
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
a、首先需要先安装libevent,memcached是基于libevent做为事件触发的,官网下载:http://libevent.org/
## 通过yum安装 # yum -y install libevent* #主包已经安装,别忘记安装libevent-devel*,不然./configure过不去 ## 通过源码安装 # wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz # tar xf libevent-2.0.21-stable.tar.gz # cd libevent-2.0.21-stable/ # ./configure --prefix=/usr/local/libevent # make && make install
b、接下来安装memecached 服务程序:
http://memcached.org/ 是Memcached的官方网站
# wget http://memcached.org/files/memcached-1.4.21.tar.gz # tar -zxvf memcached-1.x.x.tar.gz # cd memcached-1.4.21/ # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make && make install
c、安装memcache php模块
为了使php能够使用memcache的特性,我们必须为php安装memcache的模块,也就是memcache的API。也就是说memcached是一个独立的软件,它提供了许多API供多种语言进行调用。
官方网站: http://pecl.php.net/package/memcache
# wget http://pecl.php.net/get/memcache-2.2.7.tgz # tar xf memcache-2.2.7.tgz -C /usr/local/src # cd /usr/local/src # cd memcache-2.2.7/ ## 执行phpize扩展安装程序,如果没有安装phpize 运行yum install php-devel # /usr/local/php/bin/phpize # ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir # make && make install
安装成功会有类似下面的提示
Installing shared extensions: /usr/local/php/lib/php/extensions/xxxxxxx。
## 在php.ini文件,在zend之前加入如下代码: [memcache] extension_dir = "/usr/local/php/lib/php/extensions/xxxxxxxx" extension=memcache.so
d、启动memcached:
# /usr/local/memcached/bin/memcached -d -u root -m 1024 -p 11211 -c 10240 ##启动参数说明: -d 选项是启动一个守护进程, -m 是分配给Memcache使用的内存数量,单位是MB,默认64MB -M return error on memory exhausted (rather than removing items) -u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。 -l 是监听的服务器IP地址,默认为所有网卡。 -p 是设置Memcache的TCP监听的端口,最好是1024以上的端口 -c 选项是最大运行的并发连接数,默认是1024 -P 是设置保存Memcache的pid文件
如果php运行环境是apache需要重启apache,如果是nginx需要重启nginx, php这样能重新加载php配置文件来支持 memcache
6、编译安装PDO_MYSQL
首先是下载pdo_mysql扩展的源码包。下载页面在这里: http://pecl.php.net/package/PDO_MYSQL。# wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz # tar zxvf /lamp/PDO_MYSQL-1.0.2.tgz # cd /lamp/PDO_MYSQL-1.0.2/ ## 进入解压后的目录,然后执行phpize。 必须要执行下面这一步操作 # /usr/local/php/bin/phpize # ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql ## 后面的两个参数必须要添加,一开始我没有添加,结果分别都提示找不到php-config和mysql的header文件。 在make之前还要做一个mysql的header文件的软连接。因为mysql安装的时候指定了目录,不做软连接的话,还是找不到header文件。 # ln -s /usr/local/mysql/include/* /usr/local/include/ # make && make install ## 之后会提示如下: Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/ 为了方便,我把pdo_mysql.so文件移动到extensions目录下。 # mv /usr/local/php/lib/php/extensions/no-debug-zts-20100525/pdo_mysql.so /usr/local/php/lib/php/extensions/ ## 随后修改php.ini ## 找到; extension_dir = “./”这一行,去掉注释,并修改路径。 extension_dir = "/usr/local/php//lib/php/extensions/" ## 这里经过我测试,发现php只会从该目录寻找扩展so,而并不寻找该目录下的子目录。所以之前我为了统一管理,把so文件都移动到该目录下。 extension="pdo_mysql.so"; ## 修改php文件,重启httpd生效: /usr/local/apache2/bin/apachectl restart
首先安装apache、mysql和php,依次顺序安装。
apache需要支持fastCGI, 并且php也要支持fastCGI, 两者同时都支持才可以。
1.apache、mysql的安装比较简单,略过(参考 《编译安装LAMP之一》)
2. php的安装,我安装的是php5.4.30内置了php-fpm,所以不需要再单独下补丁了。
如果php是较低的版本,可能需要单独安装php-fpm
[root@localhost ~]# 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个参数了。
--enable-fpm
fastCGI 模式。
--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目录下 # cd /usr/local/apache/modules # ls | grep fast mod_fastcgi.so
接下来是如何配置这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
3.FastCgi模式,用 apche 内置进程管理器
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使用
a、首先要添加mod_fastcgi模块到httpd.conf配置文件:
LoadModule fastcgi_module modules/mod_fastcgi.so
这种模式注释不注释LoadModule php5_module modules/libphp5.so这行貌似没什么关系,但是最好还是注释掉比较好。
b、然后配置了以下模块
<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进程在运行。说明配置生效
[root@bogon ~]# ps -ef | grep php apache 20443 20437 0 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20445 20437 2 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20447 20437 3 12:16 ? 00:00:01 /usr/local/apache/cgi-bin/php-cgi apache 20449 20437 4 12:16 ? 00:00:01 /usr/local/apache/cgi-bin/php-cgi apache 20451 20437 3 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20453 20437 3 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20455 20437 2 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20457 20437 3 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20459 20437 4 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20461 20437 4 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20463 20437 3 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20465 20437 3 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20467 20437 4 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20469 20437 4 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20471 20437 4 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20473 20437 4 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20475 20437 6 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20477 20437 8 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20478 20437 5 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi apache 20481 20437 6 12:16 ? 00:00:00 /usr/local/apache/cgi-bin/php-cgi 也可以通过 apache的日志查看。
4.FastCgi模式,用php-fpm进程管理器
首先要添加mod_fastcgi模块到httpd.conf配置文件:
LoadModule fastcgi_module modules/mod_fastcgi.so
然后重启httpd
[root@localhost ~]# service httpd restart [root@localhost ~]# 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端口上
[root@localhost ~]# netstat -tulpn | grep php tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1192/php-fpm [root@localhost ~]# 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
http://blog.sina.com.cn/s/blog_5b37dc680101586k.html
https://github.com/zhangmazi/CentOS/blob/master/LAMP%20%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%EF%BC%88%E5%AE%8C%E6%95%B4%E7%89%88%EF%BC%89
http://www.cnblogs.com/whoamme/p/3530056.html
http://www.smallbigcake.com/2012/08/05/1572/