上一篇博客中学习了使用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.confDocumentRoot "/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实现。