上一篇博客中学习了使用yum安装LAMP,PHP作为httpd的模块运行,今天来学习在一台服务器以源码编译的方式安装LAMP,包括php作为httpd的模块运行和编译php_fpm并启动为服务的单独的服务器通过fastcgi协议和httpd组合。

一、编译安装LAMP

1、环境

OS:CentOS 6.5-x86_64 

已安装了常用的开发包组:

   Desktop Platform Development     # 桌面平台开发包

   Development tools            # 开发工具包

   Server Platform Development      # 服务器平台开发包

注意:

   先安装apache和mysql都可以,但php一定要最后安装

2、安装mysql

   二进制安装,查看之前博客

   注意授权问题

3、安装httpd

   查看之前博客

4、安装php

 1)安装依赖包

   由于PHP的安装需要调用很多lib库,因此我们需要预先查看这些lib是否存在才行。缺少的话,要及时安装,不然编译时需要用到时会报错

[root@Node2 ~]# yum install zlib-devel bzip2-devel libmcrypt-devel openssl-devel mhash-devel mcrypt libxml2-devel libjpeg-devel freetype-devel libpng-devel gd-devel curl-devel libxslt-devel           # ./configure 报错时提示缺什么包就安装跟包的devel包

 2)编译安装php

[root@Node2 src]# ls php-7.1.1.tar.gz php-7.1.1.tar.gz[root@Node2 src]# tar xf php-7.1.1.tar.gz[root@Node2 src]# cd php-7.1.1[root@Node2 php-7.1.1]# ./configure --prefix=/usr/local/php \> --with-mysql=/usr/local/mysql \      # 指定mysql的安装目录,已弃用的选项> --with-openssl \> --with-mysqli=/usr/local/mysql/bin/mysql_config \   # 与mysql的另一种通信方式> --with-freetype-dir \        # 启用freetype,字体生成工具> --with-jpeg-dir \> --with-png-dir \> --with-zlib \> --with-gd \> --with-curl \                  # 开启curl浏览工具的支持>  --with-mhash   \           > --with-libxml-dir=/usr \    # 系统默认会去/usr/local目录下查找libxml,这里需指定> --with-apxs2=/usr/local/apache/bin/apxs \   # 编译为apache的模块,安装扩展httpd使用第三方模块的工具> --with-mcrypt \> --with-config-file-path=/etc \             # 指定配置文件路径> --with-config-file-scan-dir=/etc/php.d \   # 离散的配置文件搜索路径> --with-bz2 \> --enable-xml \> --enable-sockets \          # 开启sockets支持> --enable-mbstring \         # 启用多字节字符串的支持> --enable-maintainer-zts   # 启用线程安全模式

注意:

  这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。

  如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了(mysql可以安装在另外的主机上)。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了,编译时还是要使用一下选项:

# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd

 3)创建php配置文件

[root@Node2 php-7.1.1]# cp php.ini-production /etc/php.ini

设置/etc/php.ini中时区:

修改php.ini文件,查找 ;date.timezone = ,把前面的分号去掉在 “=”后面加上时区。 
比如:Asia/Chongqing (重庆),Asia/Shanghai (上海),Asia/Urumqi (乌鲁木齐),Asia/Macao (澳门),Asia/Hong_Kong (香港),Asia/Taipei (台北),PRC (×××

 4)编辑httpd配置文件/etc/httpd24/httpd.conf,以httpd支持php  

   a、查看php模块是否装载

 LoadModule php5_module        modules/libphp7.so

   b、添加如下两行

     AddType application/x-httpd-php .php     AddType application/x-httpd-php-source .phps

   c、定位至DirectoryIndex index.html 

   修改为:

  DirectoryIndex  index.php  index.html

5、测试

  PHP5中使用mysql_connect()函数进行连接,但实际上,PHP5.5开始,MySQL就不推荐使用了,属于废弃函数,PHP7中貌似已经彻底不支持了,根据官网说明,取而代之的是如下两个:

 mysqli_connect()

 PDO::__construct()

  使用时,不要在使用mysql_connect了,可以换用mysqli_connect(),用法类似,据说是面向对象的库;php.ini中,也只有extension=php_mysqli.dll,而不再有extension=php_mysql.dll这个拓展了。

[root@Node2 htdocs]# cat index.php

二、安装xcache,为php加速

   PHP是一种动态语言,它在执行时是以解释的方式执行,所以PHP代码每次执行时都会被解析和转换成操作码(opcode)。而Xcache是一个开源的操作码缓存器/优化器,它通过把解析/转换PHP后的操作码缓存到文件(直到原始代码被修改)从而避免重复的解析过程,提高了代码的执行速度,通常能够提高页面生成速率2-5倍,降低了服务器负载,提高了用户访问网站的速度。

官网下载:

最新稳定版:xcache-3.2.0 最高支持到php5.6,2年多没更新了

1、安装xcache

[root@Node2 src]# tar xf xcache-3.2.0.tar.gz [root@Node2 src]# cd xcache-3.2.0[root@Node2 xcache-3.2.0]# lsAUTHORS     gen_structinfo.awk  mod_assembler     NEWS            xcachebin         htdocs              mod_cacher        processor       xcache.cChangeLog   includes.c          mod_coverager     README          xcache_globals.hconfig.m4   INSTALL             mod_decoder       run-xcachetest  xcache.hconfig.w32  lib                 mod_disassembler  tests           xcache.iniCOPYING     Makefile.frag       mod_encoder       THANKS          xcache-test.inidevel       Makefile.frag.deps  mod_optimizer     util            xcache-zh-gb2312.ini

注意:此时并没有configure文件,xcache是作为php的插件运行

[root@Node2 xcache-3.2.0]# /usr/local/php/bin/phpize   # 准备编译php扩展模块的工作,编译任何php扩展模块都需要先执行phpizeConfiguring for:PHP Api Version:         20160303Zend Module Api No:      20160303Zend Extension Api No:   320160303[root@Node2 xcache-3.2.0]# ls          # 生成了configure文件acinclude.m4    config.sub          install-sh          mod_coverager     testsaclocal.m4      configure           lib                 mod_decoder       THANKSAUTHORS         configure.in        ltmain.sh           mod_disassembler  utilautom4te.cache  config.w32          Makefile.frag       mod_encoder       xcachebin             COPYING             Makefile.frag.deps  mod_optimizer     xcache.cbuild           devel               Makefile.global     NEWS              xcache_globals.hChangeLog       gen_structinfo.awk  missing             processor         xcache.hconfig.guess    htdocs              mkinstalldirs       README            xcache.iniconfig.h.in     includes.c          mod_assembler       run-tests.php     xcache-test.iniconfig.m4       INSTALL             mod_cacher          run-xcachetest    xcache-zh-gb2312.ini[root@Node2 xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config  [root@Node2 xcache-3.2.0]# make cc -I. -I/root/src/xcache-3.2.0 -DPHP_ATOM_INC -I/root/src/xcache-3.2.0/include -I/root/src/xcache-3.2.0/main -I/root/src/xcache-3.2.0 -I/usr/local/php/include/php -I/usr/local/php/include/php/main -I/usr/local/php/include/php/TSRM -I/usr/local/php/include/php/Zend -I/usr/local/php/include/php/ext -I/usr/local/php/include/php/ext/date/lib  -DHAVE_CONFIG_H  -g -O2  -E /root/src/xcache-3.2.0/includes.c -o ./includes.i./structinfo.m4 is optional if XCache test is not enabled, feel free if it awk failed to produce itLANG=C /bin/gawk -f /root/src/xcache-3.2.0/gen_structinfo.awk < ./includes.i > ./structinfo.m4.tmp && mv ./structinfo.m4.tmp ./structinfo.m4/usr/bin/m4 -B 102400 -D srcdir='`'"/root/src/xcache-3.2.0'" -D builddir='`'".'"  /root/src/xcache-3.2.0/processor/main.m4 > ./processor.out.c.tmp/usr/bin/m4: Warning: `m4 -B' may be removed in a future releaseAUTOCHECK INFO: runtime autocheck Disabled (optimized build)AUTOCHECK WARN: zend_compiled_variable: missing structinfo, dont panicAUTOCHECK INFO: zend_try_catch_element: processor looks goodAUTOCHECK INFO: zend_brk_cont_element: processor looks goodAUTOCHECK ERROR: ==== calc HashTable =================AUTOCHECK expected: "gc","u","nTableMask","arData","nNumUsed","nNumOfElements","nTableSize","nInternalPointer","nNextFreeElement","pDestructor"AUTOCHECK missing : "gc" "u" "arData" "nNumUsed" "nInternalPointer" AUTOCHECK ERROR: ==== calc zend_ast =================AUTOCHECK expected: "kind","attr","lineno","child"AUTOCHECK missing : "attr" "lineno" "child" AUTOCHECK ERROR: ==== calc zval =================AUTOCHECK expected: "value","u1","u2"AUTOCHECK missing : "u1" "u2" AUTOCHECK INFO: zend_arg_info: processor looks goodAUTOCHECK INFO: zend_constant: processor looks goodAUTOCHECK INFO: zend_property_info: processor looks goodAUTOCHECK INFO: zend_trait_method_reference: processor looks goodAUTOCHECK INFO: zend_trait_alias: processor looks goodAUTOCHECK INFO: zend_trait_precedence: processor looks goodAUTOCHECK INFO: zend_class_entry: processor looks goodAUTOCHECK ERROR: ==== calc znode =================AUTOCHECK expected: "op_type","flag","u"AUTOCHECK missing : "flag" AUTOCHECK INFO: zend_op: processor looks goodAUTOCHECK WARN: zend_literal: missing structinfo, dont panicAUTOCHECK ERROR: ==== calc zend_op_array =================AUTOCHECK expected: "type","arg_flags","fn_flags","function_name","scope","prototype","num_args","required_num_args","arg_info","refcount","last","opcodes","last_var","T","vars","last_live_range","last_try_catch","live_range","try_catch_array","static_variables","filename","line_start","line_end","doc_comment","early_binding","last_literal","literals","cache_size","run_time_cache","reserved"AUTOCHECK missing : "arg_flags" "last_live_range" "live_range" "cache_size" AUTOCHECK INFO: xc_constinfo_t: processor looks goodAUTOCHECK INFO: xc_op_array_info_detail_t: processor looks goodAUTOCHECK INFO: xc_op_array_info_t: processor looks goodAUTOCHECK INFO: xc_funcinfo_t: processor looks goodAUTOCHECK INFO: xc_classinfo_t: processor looks goodAUTOCHECK INFO: xc_autoglobal_t: processor looks goodAUTOCHECK INFO: xc_compilererror_t: processor looks goodAUTOCHECK INFO: xc_entry_data_php_t: processor looks goodAUTOCHECK INFO: xc_entry_t: processor looks goodAUTOCHECK INFO: xc_entry_php_t: processor looks goodAUTOCHECK INFO: xc_entry_var_t: processor looks goodAUTOCHECK ERROR: ==== store HashTable =================AUTOCHECK ERROR: ==== store zend_ast =================AUTOCHECK ERROR: ==== store zval =================AUTOCHECK ERROR: ==== store znode =================AUTOCHECK ERROR: ==== store zend_op_array =================AUTOCHECK ERROR: ==== restore HashTable =================AUTOCHECK ERROR: ==== restore zend_ast =================AUTOCHECK ERROR: ==== restore zval =================AUTOCHECK ERROR: ==== restore znode =================AUTOCHECK ERROR: ==== restore zend_op_array =================AUTOCHECK ERROR: ==== dprint HashTable =================AUTOCHECK ERROR: ==== dprint zend_ast =================AUTOCHECK ERROR: ==== dprint zval =================AUTOCHECK ERROR: ==== dprint znode =================AUTOCHECK ERROR: ==== dprint zend_op_array =================AUTOCHECK ERROR: ==== dasm HashTable =================AUTOCHECK ERROR: ==== dasm zend_ast =================AUTOCHECK ERROR: ==== dasm zval =================AUTOCHECK ERROR: ==== dasm znode =================AUTOCHECK ERROR: ==== dasm zend_op_array =================make: *** [processor.out.c] Error 1[root@Node2 xcache-3.2.0]# install && install

  这里先不管了,直接用之前使用5.6.16版本php时的配置:

[root@BAIYU_179  xcache-3.2.0]#  install && install

安装结束时,会出现类似如下行:

Installing shared extensions:  /usr/local/php/lib/extensions/no-debug-zts-20100525/

2、创建配置文件

 首先将xcache提供的样例配置文件导入php.ini:

[root@BAIYU_179 xcache-3.2.0]# mkdir /etc/php.d       # /etc/php.d目录要自己创建[root@BAIYU_179 xcache-3.2.0]# cp xcache.ini /etc/php.d[root@BAIYU_179 xcache-3.2.0]# vi /etc/php.d/xcache.ini 将第四行extension = xcache.so  # 指定xcache库文件,但可能找不到,我们需要手动指定修改为xcache.so提供绝对路径extension = /usr/local/php/lib/php/extensions/no-debug-zts-20131226/xcache.so

注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。

3、测试

[root@BAIYU_179 xcache-3.2.0]# service httpd restart停止 httpd:[确定]正在启动 httpd:[确定]

在phpinfo页面下面可以找到:

xcache缓存能提高3倍左右的性能。

三、配置php以fastcgi协议组合apache

1、Apache、MySQL的安装与前面相同

2、编译安装php-5.4.26

注意:

  这里我直接使用前面的环境把之前安装好的php删掉或重命名,重新编译安装php

  编辑apache的配置文件禁用php7.so模块

前面的步骤都一样:

 1)编译安装php

[root@Node2 php-7.1.1]# ./configure --prefix=/usr/local/php \> --with-openssl \> --with-freetype-dir \> --with-jpeg-dir \> --with-png-dir \> --with-zlib \> --with-gd \> --with-curl \>  --with-mhash   \ > --with-libxml-dir=/usr \> --with-mcrypt \> --with-config-file-path=/etc \> --with-config-file-scan-dir=/etc/php.d \> --with-bz2 \> --enable-xml \> --enable-sockets \> --enable-mbstring \> --enable-maintainer-zts \> --enable-fpm> --with-pdo-mysql=mysqlnd > --with-mysqli=mysqlnd# make# make intall

注意:编译选项和上面的不同之处在于添加了--enable-fpm,并且去掉了--with-apxs2=/usr/local/apche/bin/apxs

 2)为php提供配置文件

[root@Node2 php-7.1.1]# cp php.ini-production /etc/php.ini     # 解压后的php源码包目录中[root@Node2 php-7.1.1]# ls /etc/php.ini/etc/php.ini

 3)配置php-fpm 

为php-fpm提供SysV init脚本,并将其添加至服务列表:

[root@Node2 php-7.1.1]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm  # 解压后的php源码包目录中[root@Node2 php-7.1.1]# ls /etc/rc.d/init.d/php-fpm/etc/rc.d/init.d/php-fpm[root@Node2 php-7.1.1]# chmod +x /etc/rc.d/init.d/php-fpm[root@Node2 php-7.1.1]# ls /etc/rc.d/init.d/php-fpm/etc/rc.d/init.d/php-fpm[root@Node2 php-7.1.1]# chkconfig --add php-fpm[root@Node2 php-7.1.1]# chkconfig php-fpm on[root@Node2 php-7.1.1]# chkconfig --list phperror reading information on service php: No such file or directory[root@Node2 php-7.1.1]# chkconfig --list php-fpmphp-fpm        	0:off	1:off	2:on	3:on	4:on	5:on	6:off[root@Node2 php-7.1.1]#

 4)为php-fpm提供配置文件:

[root@Node2 httpd24]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf                      # php的安装目录[root@Node2 ~]# cd /usr/local/php[root@Node2 php]# cd etc[root@Node2 etc]# lspear.conf  php-fpm.conf  php-fpm.conf.default  php-fpm.d[root@Node2 etc]# cd php-fpm.d[root@Node2 php-fpm.d]# lswww.conf.default[root@Node2 php-fpm.d]# vim www.conf.default [root@Node2 php-fpm.d]# cp www.conf.default      # 这个配置文件也一定要启用才可以

 5)编辑php-fpm的配置文件:

# vim /usr/local/php/etc/php-fpm.conf

配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行):可以直接添加在配置文件最后

[global]; Pid file; Note: the default prefix is /usr/local/php/var; Default Value: none;pid = run/php-fpm.pidpid = /usr/local/php/var/run/php-fpm.pid    # 要和服务脚本中的路径一致,要写在global段,可以不指定,默认就已经指定好了;;;;;;;;;;;;;;;;;;;;; Pool Definitions ;;;;;;;;;;;;;;;;;;;;;pm.max_children = 50            # 写在Pool Definitions段pm.start_servers = 5pm.min_spare_servers = 2pm.max_spare_servers = 8

1、php-fpm优化参数介绍

他们分别是:pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。

pm:表示使用哪种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。

在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。

下面4个参数的意思分别为:

pm.max_children:静态方式下开启的php-fpm进程数量

pm.start_servers:动态方式下的起始php-fpm进程数量

pm.min_spare_servers:动态方式下的最小php-fpm进程数

pm.max_spare_servers:动态方式下的最大php-fpm进程数量

区别:

  如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。

如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。

系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,

然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数

6)测试

[root@Node2 php-fpm.d]# service php-fpm configtest[05-Feb-2017 14:20:10] NOTICE: configuration file /usr/local/php/etc/php-fpm.conf test is successful[root@Node2 php-fpm.d]# service php-fpm startStarting php-fpm  done[root@Node2 php-fpm.d]# service php-fpm statusphp-fpm (pid 29116) is running...[root@Node2 php-fpm.d]# ss -tunap|grep phptcp    LISTEN     0      128            127.0.0.1:9000                  *:*      users:(("php-fpm",29116,7),("php-fpm",29117,0),("php-fpm",29118,0),("php-fpm",29119,0),("php-fpm",29120,0),("php-fpm",29121,0))

  默认情况下,fpm监听在127.0.0.1的9000端口,也可以使用如下命令验正其是否已经监听在相应的套接字。此时,apache和php在同一主机才可以,如果在不同主机,修改php-fpm的配置文件,监听在apache主机可以访问到的套接字上:

修改php-fpm.d/www.conf配置文件:

 listen = 0.0.0.0:9000

重启php-fpm:

[root@Node2 etc]# service php-fpm startStarting php-fpm  done[root@Node2 etc]# ss -tunap|grep phptcp    LISTEN     0      128                    *:9000                  *:*      users:(("php-fpm",29355,7),("php-fpm",29356,0),("php-fpm",29357,0),("php-fpm",29358,0),("php-fpm",29359,0),("php-fpm",29360,0))

3、配置httpd的主配置文件

1)取消之前加载的php模块并启用proxy的相关模块

  在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载

  LoadModule proxy_module modules/mod_proxy.so

  LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

并检查是否添加或修改了如下内容:

    AddType application/x-httpd-php .php     

    AddType application/x-httpd-php-source .phps  

    DirectoryIndex index.php index.html   

2)配置虚拟主机支持使用fcgi

在httpd主配置文件中启用虚拟主机配置文件并注释中心主机

在虚拟主机配置文件配置:

[root@node2 extra]# grep -vE '^#|^$' httpd-vhosts.conf
    DocumentRoot "/web/a.com/htdocs"    ServerName www.a.com    ServerAlias a.com    ErrorLog "logs/a.com.err"    CustomLog "logs/a.com.access" combined        
         # httpd2.4版本虚拟主机一定要授权才有权限访问            Options None            Require all granted        ProxyRequests Off         # 关闭正向代理,apache不支持正向、反向代理同时使用ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/web/a.com/htdocs/$1 # 把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI(必须写绝对路径),所以这里直接在fcgi://127.0.0.1:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。
    DocumentRoot "/web/b.org/htdocs"    # 这里要先建立对应目录和网页文件    ServerName www.b.org    ServerAlias b.org    ErrorLog "logs/b.org.err"    CustomLog "logs/b.org.access" combined       
                   Options None          Require all granted       ProxyRequests OffProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/web/b.org/htdocs/$1

4、测试

fcgi方式比以模块方式运行性能更好

  注意:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。