本文旨在实践编译安装LAMP环境,搭建Zblog系统,使用Xcache为PHP加速,分离PHP与Apache Server
LAMP基础知识
Linux + Apache + MySQL[MariaDB] + PHP[Perl|Pyton] 是一套基础的web环境;
Apache有2.2版本,和最新的2.4版本,2.4版本支持Event MPM可用作生产环境,在http2.2中有3种MPM,为不同的进程文件,切换需要重启Apache服务;而2.4中MPM做成了DSO,可动态加载切换;
Apache、MaraiaDB、PHP安装都不困难,困难的是需要解决协同合作的关系,即不能成为独立个体
<a> Apache要能够将用户请求的动态页面如index.php交由PHP来执行并返回结果;
<b> PHP能将index.php中数据库操作的指令正确提交给MariaDB来处理,并返回结果;
<c> 最终的结果能够被Apache封装成报文形式回应客户端Browser
4. Apache和PHP结合的方式有, 参考博文《Apache+PHP3种结合方式》
<a> CGI方式
<b> Apache加载动态模块结合的方式,
<c> FastCGI方式
5. PHP和MariaDB结合方式简单,只需要安装php-mysql这种插件即可,通过php-mysql插件的函数,在php页面中使用这种函数即可连接MariaDB数据库。
6. Apache2.4需要依赖于apr1.40,apr-tuil1.40
实践1:Apache+PHP模块集合,MariaDB独立安装
实验拓扑
步骤1.编译安装Apache2.4
1.1 准备编译环境以及需要用到的包
yum groupinstall "Development Tools" "Server Platform Development" -y yum -y install pcre-devel zlib-devel
Apache2.4依赖于apr1.4以上版本,预先下载好apr-1.5.2、apr-util-1.5.4、httpd-2.4.17.tar.gz到/download目录并解压
1.2 编译安装apr-1.5.2
./configure --prefix=/usr/local/apr make && make install
1.3 编译安装apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ make && make install
1.4 创建apache用户和组,让web服务进程运行在apache身份避免越权!
groupadd -r apache useradd -r -g apache -s /sbin/nologin -M apache
1.5 编译安装httpd2.4
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --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-mpm=prefork make && make install
1.6 编译参数的相关说明
--prefix | 指定httpd2.4的安装路径 |
--sysconfdir | 指定配置文件路径 |
--enable-so | 启动shared object共享对象 |
--enable-ssl | 启用ssl,借助于此可以实现HTTPS访问 |
--enable-cgi | 启用CGI,可以实现CGI脚本执行 |
--enable-rewrite | 启用Rewrite重写,能够实现诸如301重定向的功能,以来PCRE包 |
--with-zlib |
启用zlib压缩 |
--with-pcre | 启用PCRE |
--with-apr | 指定apr的路径,httpd2.4依赖apr1.4版本以上,所以要指明 |
--with-apr-util | 指定apr-util的路径,同上 |
--enable-modules | 启用模块加载 |
--enable-mpms-shared=all | http2.4上prefork、worker、event是模块化的,可以动态加载 |
--with-mpm=prefork | 指明默认的httpd2.4 MPM,即运行在prefork模型下 |
1.7 注意点:
在http2.2上,MPM有prefork、worker、event[测试版],切换不同的MPM模型需要重启httpd进程,其实本质上不同的MPM对应的进程是不同的底层文件,而http2.4上把3种MPM做成了模块的形式,可以动态加载实现。
1.8 编辑配置文件/etc/http24/httpd.conf
到此,我们的apache2.4已经全部安装成功。
1.9 启用并测试
/usr/local/apache/bin/apachectl start 由于目前还没有写入执行脚本,所以这里我们直接使用绝对路径来启动
1.10 注意点:
这里出现的问题:我这台虚拟机默认安装了http2.2,所以当我编译安装好http2.4后,我使用service httpd start成功后,发现竟然显示的是2.2的默认页面,经过排查后才解决!
1、为了方便httpd2.4的启动,我将http24的执行目录添加到了环境变量
echo "export PATH=/usr/local/mysql/bin:$PATH">>/etc/profile source /etc/profile apachectl start
2、启动时候由于没有指定ServerName,所以默认使用主机名,解决方法
vi /usr/local/apache/conf ServerName localhost:80 apachectl restart
步骤2.通用二进制安装MariaDB
之前已经部署过,这里不再赘述,只需要在192.168.1.123上同样部署即可
参考《MariaDB二进制安装及基本管理》
需要说明的是,在我们架构中一共2台服务器,前端是Apache+PHP Server[192.168.1.122],后端是MariaDB Server[192.168.1.123],这需要前端的PHP通过php-mysql插件中的mysql_connect函数连接到后端的MariaDB Server上的数据库,而默认MariaDB不允许远程连接的,此处我们先进行授权吧!
mysql -h localhost -u root -pzxczxc MariaDB > GRANT ALL ON *.* to 'root'@'%' identified by 'zxczxc' WITH GRANT OPTION; MariaDB > FLUSH PRIVILEGES; MariaDB > SELECT user,host,password FROM mysql.user;
在122这台机器上,我们安装了MariaDB-client后,进行TCP/IP方式的数据库连接呢!
mysql -h 192.168.1.123 -u root -pzxczxc
至此基本架构已经完成,只需要编译安装PHP即可!
步骤3.编译安装PHP[还是在192.168.1.122这台服务器上]
值得一提的是:PHP在这套环境中作用是“承上启下”,
能负责接受和处理Apache提交过来的php请求,这需要apache-php以模块的方式加载运行;
对于某些php请求需要操作数据库的,PHP要负责和后端MariaDB Server通信,这需要php-mysql插件;
3.1 准备环境
yum -y groupinstall "Desktop Platform Development" yum -y install bzip2-devel libmcrypt-devel yum -y install xml2
3.2 编译安装
wget tar -zxvf php-5.5.30.tar.gz cd php-5.5.30 ./configure --prefix=/usr/local/php --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-bz2 --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-maintainer-zts --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd make && make install
请注意编译这里可能会报错,因为一些组件支持的开启需要依赖相关包,需要解决依赖关系。如:
yum -y install libxml2 libxml2-devel
有时候依赖的包可能需要用到 -devel附包,指定好EPEL源安装即可!
这里我总结一下我遇到的几个问题,附注:我是用的YUM源、EPEL源均为Aliyun的
Error1
configure: error: xml2-config not found. Please check your libxml2 installation.
解决办法:
yum -y install libxml2 libxml2-devel
Error2
configure: error: Please reinstall the BZip2 distribution
解决办法:
yum -y install bzip2 bzip2-devel
Error3
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
解决办法:
yum -y install libmcrypt libmcrypt libmcrypt-devel
3.4 编译参数的相关说明
--prefix | 指定php安装路径 |
--with-openssl | 启用OpenSSL |
--enable-mbstring |
支持大字节字符串 |
--with-freetype-dir | 支持freetype,freetype是一个可移植的字体引擎 |
--with-jpeg-dir | 支持JPEG |
--with-png-dir | 支持PNG |
--with-zlib | 支持zlib压缩,依赖于zlib包,有可能需要zlib-devel包 |
--with-bz2 | 支持bz2压缩,依赖bz包 |
--with-libxml-dir=/usr | 支持libxml,能简单方便的提供对XML文件的各种操作 |
--enable-xml | 启用xml |
--enable-sockets | 启用sockets套接字 |
--with-apxs2= | apxs是一个专门用来加载第三方应用模块的实用程序 |
--with-mcrypt | 支持加密 |
--with-config-file-path | 设置PHP主配置文件路径 |
--with-config-file-scan-dir | 设置PHP分段式配置文件php.d的位置 |
--enable-maintainer-zts | 启用线程安全,对于prefork而言是不需要的,但是之前编译httpd2.4装了3种MPM,为了支持worker、event的安全,所以启用 |
请注意:
如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。
# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
3.5 提供PHP配置文件
cp php.ini-production /etc/php.ini
3.6 编辑Apache配置文件以支持php,并重启Apache服务
vim /etc/httpd/httpd.conf AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps --->增添对php页面的支持 <IfModule dir_module> DirectoryIndex Index.php index.html --->修改默认主页index.php </IfModule>
3.7 编辑php测试页面,验证Apache+PHP Server和后端MariaDB Server能够协同工作
<?php $link = mysql_connect('192.168.1.123','root','zxczxc'); if ($link) echo "Success..."; else echo "Failure..."; mysql_close(); ?>
成功可以访问!
注意点:
在这里我遇到一个错误,一开始打开192.168.1.122/mysql.php页面总是提示网络连接错误,最后排查出来是由于httpd.conf中加载的php_mod使用的绝对路径modules/libphp5.so,而父目录/usr/local/apache并不在环境变量中,使用
export PATH=/usr/local/apache:$PATH
即解决问题了。
实践2:在LAMP环境下搭建一个ZBLOG博客系统
1.1 下载zblog文件解压缩至网站目录
cd /usr/local/apache/ tar -xvf zblog.tar
1.2 访问页面进行安装
竟然需要用到php-curl,这咋办?我编译的时候没有启用curl,好在PHP的phpize可以动态的加载插件,省得重新编译!前提你有源码包,操作如下:
cd /download/php-5.5.30/ext/curl/ /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config
把该目录下的curl.so拷贝到你php.ini中的extension_dir指向的目录中,修改php.ini,在最后添加一句extension=curl.so 重启apache即可咯
1.3 选择数据库,此处需要连接远程数据库
1.4 数据库信息写入,完成ZBLOG系统安装
1.5 访问测试,一切正常,至此LAMP环境下ZBLOG搭建完毕!
实践3:使用Xcache,为PHP加速
默认情况下,Aapche将动态请求php的交由php引擎来执行,每一次请求都会去重新执行一遍,效率极其低下。而PHP加速器能够缓存这些执行过程,将执行结果缓存到内存中,起到加速php的效果。
加速前,使用ab命令对当前的zblog进行压力测试
1.1 编译安装
PHP一个很好的机制在于使用phpize能够对编译时未加载的插件进行动态编译,然后进行简单的配置即可加载该php插件,而省去了重新编译php的时间!非常方便。
tar xf xcache-3.2.0.tar.gz cd xcache-3.2.0 /usr/local/php/bin/phpize ---->phpize是执行命令, ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config make && make install
1.2 安装结束后,给出了编译后的php插件目录
1.3 编辑php.ini,整合PHP和Xcache
mkdir /etc/php.d cp /download/xcache-3.2.0/xcache.ini /etc/php.d vi /etc/php.d/xcache.ini extension = /usr/local/php/lib/php/extensions/no-debug-zts-20121212/xcache.so
1.4 重启apache,再次进行压力测试,可以明显看出来响应提高很多!