LAMP组合的编译安装:
httpd+php
modules:把php编译成httpd的DSO对象;
prefork:libphp5
event,worker:libphp5-zts
cgi:
fpm(基于fastcgi协议):php作为独立的服务;
httpd对fastcgi协议的支持:
httpd-2.2:需要额外安装fcgi模块;
httpd-2.4:自带fcgi模块;
安装次序:
httpd,MariaDB,php
在CentOS 6上安装:
安装httpd2.4
一、确保Development Tools和Server Platform Development两个开发组包已经安装。
二、安装pcre-devel。
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库,是一个用C语言编写的正则表达式库,可以用来进行文本搜索和替换。pcre-devel 是使用 pcre 开发的一个二次开发库,pcre-devel是PCRE库的开发工具包,它提供了PCRE库的源代码、头文件和相关工具,方便开发者在自己的项目中使用和定制PCRE库的功能。主要是httpd的url redirect时使用。
三、安装apr和apr-util包
APR(Apache portable Run-time libraries,Apache可移植运行库),主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用APR而已。一般情况下,APR开发包很容易理解为仅仅是一个开发包,不过事实上并不是。目前,完整的APR实际上包含了三个开发包:apr、apr-util以及apr-iconv,每一个开发包分别独立开发,并拥有自己的版本。
apr中包含了一些通用的开发组件,包括mmap,DSO等等;apr-util该目录中也是包含了一些常用的开发组件。这些组件与apr目录下的相比,它们与apache的关系更加密切一些。比如存储段和存储段组,加密等等。apr-iconv包中的文件主要用于实现iconv编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。因此假如两个非本地编码A和B需要转换,则转换过程大致为A->Local以及Local->B或者B->Local以及Local->A。
make && make install时出现错误,大致是缺少xml解析器,安装expat-devel包,即apr-util需要expact-devel包的支持。yum install expat-devel -y
四、安装httpd2.4
make && make install是出现错误
安装libxml2-devel
删除apr-util,重新编译安装
安装httpd2.4时,第一步有点问题,导致一直安装不上:使用下面的configure:
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-pmp=event --with-included-apr=/usr/local/apr/lib --enable-ssl --with-ssl=/usr/local/openssl
错误的关键点在少了两项配置:--enable-ssl和--with-ssl,一开始,一直使用--with-openssl,在httpd中应该使用--with-ssl选项。
--enable_so,开启支持dso机制,支持模块化,
--enable-ssl,启用ssl操作功能,
--enable-cgi,启用cgi支持
--enable-rewrite,支持url重写
--with-zlib ,支持传输压缩,并使用默认安装位置zlib
--with-pcre,支持pcre的正则表达式,并使用默认安装
--with-apr=/usr/local/apr17 ,指明apr位置
--with-apr-util=/usr/local/apr-util,指明apr-util位置
--enable-modules=most,指明启用哪些模块,most指明大多数模块都启用
--enable-mpms-shared=all 支持的共享mpms都启用
--with-mpm=prefork,默认使用的mpm为prefork
五、为安装的httpd配置service脚本:
在/etc/rc.d/init.d下已经有httpd服务脚本,拷贝一个进行修改,主要修改相关位置参数;然后修改/etc/profile.d/目录下新增一个配置文件,将新的httpd路径添加进去,于是可以直接使用相关命令;然后添加服务到列表中,即chkconfig --add httpd24;启动服务,通过ss查看80端口已经开始监控,通过ps命令,查看event模式下启动的进程信息;使用httpd -M,查看加载的模块,mpm_event_module是event模式的模块,已经加载。
模块的加载,在/etc/httpd24/下的httpd.cnf文件中进行设置,LoadModule命令。
安装MariaDB:
一、下载二进制包:mariadb-5.5.68-linux-x86_64.tar.gz
二、解包,模拟创建数据库存放目录,添加mysql系统用户,修改数据库存放目录属性:
三、将解包的MariaDB目录,在/usr/local/下,做软链接
进入mysql目录,修改所有文件的属主和属组:
四、初始化数据库:
五、配置数据库:
mkdir /etc/mysql
cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf
然后编辑my.cnf
六、提供服务脚本,启动服务:
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
启动失败,无权限在/var/log/下创建mysqld.log文件,手动创建一个:
七、启动客户端,连接数据库:
八、测试httpd连接数据库:
在DocumentRoot "/usr/local/apache/htdocs"目录中建index.php网页:
测试访问时,读出了源码,原因是本机上没有安装php
安装PHP:
下载了两个版本,5.4.45和5.6.40,先测试安装的5.6.40:
./configure --prefix=/usr/local/php5 --with-mysql=/usr/local/mysql/ --with-openssl=/usr/local/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 --with-mcrypt --with-config-file-path=/etc/php5 --with-config-file-scan-dir=/etc/php5.d --with-bz2
先是出现bzip2没有发现的错误,检查已经安装了,于是下载了CentOS7上的bzip2-devel-1.0.6-13.el7.x86_64.rpm和bzip2-libs-1.0.6-13.el7.x86_64.rpm安装后bzip2错误通过,然后又出现libmcrypt没发现的错误,于是:yum install php-mcrypt libmcrypt libmcrypt-devel解决了,进行make &&make install时,总出现/root/php-5.6.40/ext/openssl/openssl.c:1433: error: dereferencing pointer to incomplete type的错误,改成5.4.45,也是出现这个问题。然后是觉得是我的openssl版本问题,在测试机器上,openssl是1.1.1w版本,是编译安装的,老版本依然保留着,于是恢复老版本,主要操作是将/usr/bin中的openssl恢复到老版本,库和头文件目录恢复,但是一直出现:
Checking for pkg-config… /usr/bin/pkg-config
configure: error: Cannot find OpenSSL’s libraries
最后重新安装了openssl(老版本),执行configure是使用默认的--with-openssl通过了。
(靠它个大爷的,linux确实难用啊!!!!)
安装完php后,先修改httpd相关配置:
一、查看/etc/httpd24/httpd.conf,已经自动添加上了php5模块:
php5编译安装会自动添加上面一项。
二、添加AddType
三、添加DirectoryIndex,增加index.php
配置php:
在解压缩的php源码目录中,有php.ini-development和php.ini-production两个文件,是php开发者编写的开发环境和生成环境用的配置文件样板。
cp php.ini-production /etc/php.ini
重新启动httpd:
php没有编译成线程安全的,需要再次编译安装php:删除原先的安装后重新编译安装:
./configure --prefix=/usr/local/php56 --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 --with-mcrypt --with-config-file-path=/etc/php56/php.ini --with-config-file-scan-dir=/etc/php56.d/ --with-bz2 --with-apxs2=/usr/local/apache/bin/apxs --enable-maintainer-zts
注意:增加了--enable-maintainer-zts选项,编译成线程安全的php
再次启动成功:
然后测试php文件,一直无法解析,要么直接打开.php源码,要么提示保存index.php文件,最后将系统重新启动后,居然可用了。
测试安装一个应用phpMyAdmin:
tar xf phpMyAdmin-4.4.15-all-languages.tar.bz2
mv phpMyAdmin-4.4.15-all-languages /usr/local/apache/htdocs/pma44
在pma44目录中拷贝:
cp config.sample.inc.php config.inc.php
vim config.inc.php
修改其中的$cfg['blowfish_secret']值,任意输入,然后访问:
测试4.9版本:
tar xf phpMyAdmin-4.4.15-all-languages.tar.bz2
mv phpMyAdmin-4.4.15-all-languages /usr/local/apache/htdocs/pma44
压力测试:
对于动态网页,大并发时会有很大压力,静态网页则相应压力少很多。
可以使用xcache进行加速。
安装xcache,为php加速:
一、下载xcache-3.2.0.tar.bz2
二、tar xf xcache-3.2.0.tar.bz2
三、进入xcache目录,执行/usr/local/php56/bin/phpize
四、编译安装:
./configure --enable-xcache --with-php-config=/usr/local/php56/bin/php-config
make && make install
然后拷贝源代码目录中的xcache.ini到/etc/php56.d/下
将xcache.ini中的extension设置成:
extension = /usr/local/php56/lib/php/extensions/no-debug-zts-20131266/xcache.so
重新编译安装php为fpm模式:
安装依赖包:mhash和mhash-devel:
yum install mhash mhash-devel
重新编译安装php-5.6.40:主要是相关配置选项的不同
./configure --prefix=/usr/local/php56 --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 --with-mcrypt --with-config-file-path=/etc/php56fpm/php.ini --with-config-file-scan-dir=/etc/php56fpm.d/ --with-bz2 --with-apxs2=/usr/local/apache/bin/apxs --enable-maintainer-zts --enable-fpm
取消黄色的--with-apxs2=/usr/local/apache/bin/apxs,这个是将php编译成httpd的模块,--enable-maintainer-zts,线程安全,fpm模式下,不是启用httpd的线程,无需线程安全。增加绿色的--enable-fpm,这将使php启动一个监听服务,php内置的监听端口。
make && make install 最后提示如下:
为php提供配置文件:
cp php.ini-production /etc/php56/php.ini
配置php-fpm
为php-fpm提供SysV init脚本,并将其添加至服务列表:
cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
chmod +x /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on
为php-fpm提供配置文件:
cp /usr/local/php56/etc/php-fpm.conf.default /usr/local/php56/etc/php-fpm.conf
编辑php-fpm的配置文件
vim /usr/local/php56/etc/php-fpm.conf
配置fpm的相关选项为需要的值,并启用pid文件:
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php56/var/run/php-fpm.pid
接着启动php-fpm:
service php-fpm start
使用如下命令来验证(如果此命令输出有几个php-fpm进程就说明启动成功了):
ps aux | grep php-fpm
默认情况下,fpm监听在127.0.0.1的9000端口,也可以使用如下命令验证其是否已经监听在相应的套接字:
netstat -tnlp | grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 689/php-fpm
配置httpd-2.4
1、启动httpd的相关模块
在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
2、配置虚拟主机支持使用fcgi
在相应的虚拟主机中添加类似如下两行:
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1
http://192.168.138.139/index.php
/usr/local/apache/htdocs
fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1
ProxyRequests Off:关闭正向代理
ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://127.0.0.1:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。
3、编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页
vim /etc/httpd/httpd.conf
1、添加如下二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
2、定位至DirectoryIndex index.html,修改为:
DirectoryIndex index.php index.html
补充:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。