上一篇博客中学习了使用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
<?php
   $conn=mysqli_connect('localhost','root','123321');   # 注意授权问题
   if ($conn)
      echo "Connect Successful";
   else
      echo "Connect Faild";
   mysqli_close();
    
   phpinfo();
?>

wKiom1iV977gIDZfAAEE66vq3bM477.png


二、安装xcache,为php加速

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

官网下载:http://xcache.lighttpd.net/pub/

最新稳定版: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]# ls
AUTHORS     gen_structinfo.awk  mod_assembler     NEWS            xcache
bin         htdocs              mod_cacher        processor       xcache.c
ChangeLog   includes.c          mod_coverager     README          xcache_globals.h
config.m4   INSTALL             mod_decoder       run-xcachetest  xcache.h
config.w32  lib                 mod_disassembler  tests           xcache.ini
COPYING     Makefile.frag       mod_encoder       THANKS          xcache-test.ini
devel       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扩展模块都需要先执行phpize
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[root@Node2 xcache-3.2.0]# ls          # 生成了configure文件
acinclude.m4    config.sub          install-sh          mod_coverager     tests
aclocal.m4      configure           lib                 mod_decoder       THANKS
AUTHORS         configure.in        ltmain.sh           mod_disassembler  util
autom4te.cache  config.w32          Makefile.frag       mod_encoder       xcache
bin             COPYING             Makefile.frag.deps  mod_optimizer     xcache.c
build           devel               Makefile.global     NEWS              xcache_globals.h
ChangeLog       gen_structinfo.awk  missing             processor         xcache.h
config.guess    htdocs              mkinstalldirs       README            xcache.ini
config.h.in     includes.c          mod_assembler       run-tests.php     xcache-test.ini
config.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 it
LANG=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 release
AUTOCHECK INFO: runtime autocheck Disabled (optimized build)
AUTOCHECK WARN: zend_compiled_variable: missing structinfo, dont panic
AUTOCHECK INFO: zend_try_catch_element: processor looks good
AUTOCHECK INFO: zend_brk_cont_element: processor looks good
AUTOCHECK 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 good
AUTOCHECK INFO: zend_constant: processor looks good
AUTOCHECK INFO: zend_property_info: processor looks good
AUTOCHECK INFO: zend_trait_method_reference: processor looks good
AUTOCHECK INFO: zend_trait_alias: processor looks good
AUTOCHECK INFO: zend_trait_precedence: processor looks good
AUTOCHECK INFO: zend_class_entry: processor looks good
AUTOCHECK ERROR: ==== calc znode =================
AUTOCHECK expected: "op_type","flag","u"
AUTOCHECK missing : "flag" 
AUTOCHECK INFO: zend_op: processor looks good
AUTOCHECK WARN: zend_literal: missing structinfo, dont panic
AUTOCHECK 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 good
AUTOCHECK INFO: xc_op_array_info_detail_t: processor looks good
AUTOCHECK INFO: xc_op_array_info_t: processor looks good
AUTOCHECK INFO: xc_funcinfo_t: processor looks good
AUTOCHECK INFO: xc_classinfo_t: processor looks good
AUTOCHECK INFO: xc_autoglobal_t: processor looks good
AUTOCHECK INFO: xc_compilererror_t: processor looks good
AUTOCHECK INFO: xc_entry_data_php_t: processor looks good
AUTOCHECK INFO: xc_entry_t: processor looks good
AUTOCHECK INFO: xc_entry_php_t: processor looks good
AUTOCHECK INFO: xc_entry_var_t: processor looks good
AUTOCHECK 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页面下面可以找到:wKioL1Y9s1XzbDIvAAIAlBb4Dso299.jpg

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 php
error reading information on service php: No such file or directory
[root@Node2 php-7.1.1]# chkconfig --list php-fpm
php-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]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php-fpm.d
[root@Node2 etc]# cd php-fpm.d
[root@Node2 php-fpm.d]# ls
www.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.pid
pid = /usr/local/php/var/run/php-fpm.pid    # 要和服务脚本中的路径一致,要写在global段,可以不指定,默认就已经指定好了


;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;

pm.max_children = 50            # 写在Pool Definitions段
pm.start_servers = 5
pm.min_spare_servers = 2
pm.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 start
Starting php-fpm  done
[root@Node2 php-fpm.d]# service php-fpm status
php-fpm (pid 29116) is running...
[root@Node2 php-fpm.d]# ss -tunap|grep php
tcp    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 start
Starting php-fpm  done
[root@Node2 etc]# ss -tunap|grep php
tcp    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
<VirtualHost *:80>
    DocumentRoot "/web/a.com/htdocs"
    ServerName www.a.com
    ServerAlias a.com
    ErrorLog "logs/a.com.err"
    CustomLog "logs/a.com.access" combined
        <Directory "/web/a.com/htdocs">         # httpd2.4版本虚拟主机一定要授权才有权限访问
            Options None
            Require all granted
        </Directory>
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进行了封装,不需要手动指定。
</VirtualHost>


<VirtualHost *:80>
    DocumentRoot "/web/b.org/htdocs"    # 这里要先建立对应目录和网页文件
    ServerName www.b.org
    ServerAlias b.org
    ErrorLog "logs/b.org.err"
    CustomLog "logs/b.org.access" combined
       <Directory "/web/b.org/htdocs">         
          Options None
          Require all granted
       </Directory>
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/web/b.org/htdocs/$1
</VirtualHost>

4、测试

wKioL1iW9XCTfiHBAADr4JVQIaE068.png

wKiom1iW9XCyl8poAAD_z9A5K0s127.png

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

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