编译环境:
Linux:CentOS 6.5
Aapache: httpd-2.4.9
Mysql: MaraiDB-5.5.32
PHP: php-5.5.26
模式一:web服务器 、数据库服务器、php在同一台服务器
实验拓扑图:
在这种模式下,处理客户端的请求过程大致如下:
web介接收到客户端的请求后,如果是静态资源,则直接返回;如果请求的是动态资源,httpd负责处理的这个请求的进程(线程)会通过模块来处理请求,如果请求中会访问数据库会去数据库中取得数据,然后经运行结果返回这个进程,进程将结果返回到客户端。
第一步:源码编译 httpd-2.4.9
1、安装 apr 和 apr-util 依赖包,这里采用源码方式安装。
2、安装其他依赖包,例如:
1
|
yum install pcer-devel openssl-devel -y
|
3、安装 httpd-2.4.9
编译参数如下:
1
2
3
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=event
|
4、提供 httpd 配置文件和服务启动脚本。
这块的内容参照上一篇博客《http-2.4.9源码编译》。
第二步:编译安装 MaraiDB-5.5.32
这里采用的安装方式是采用通用二进制的方式,类似于“绿色软件”。解压后不需要再次编译直接可以使用。具体使用源码编译会使用cmake编译,会在后续的过程中继续介绍。
1、创建用户和组
1
2
|
groupadd -r mysql useradd -r -g mysql mysql
|
2、准备好数据存储的磁盘
为了在使用数据开始提高数据的安全性,建议将数据库的数据存放于独立的磁盘中,使用逻辑卷。
1
2
3
4
5
6
7
8
9
10
|
pvcreate /dev/sda5 vgcreate mysqlvg -s 4M /dev/sda5 lvcreate -n data -m 3 -L MYDATA -L 5G mysqlvg lvcreate -n data -L 5G mysqlvg mke2fs -t ext4 -L MYDATA -m 3 /dev/mysqlvg/data mkdir /mydata
mount /dev/mapper/mysqlvg-data /mydata/
mkdir /mydata/data
chown mysql.mysql /mydata/data/
usermod -m -d /mydata/data
|
3、安装并初始化MariaDB
解压到/usr/local目录:
1
|
tar xf mariadb-5.5.32-linux-x86_64. tar .gz -C /usr/local/
|
创建链接文件,名称为mysql:
1
|
ln -sv /usr/local/mariadb-5 .5.32-linux-x86_64 /usr/local/mysql
|
改变目录的属主和属组:
1
|
chown mysql.mysql /usr/local/mysql -R
|
初始化环境:
1
|
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir= /mydata/data
|
4、提供主配置文件
1
|
cp /usr/local/mysql/support-files/my-large .cnf /etc/my .cnf
|
修改:
1
2
3
|
[mysqld] thread_concurrency = 2 #工作的线程数,建议是当前cpu数的2倍
datadir = /mydata/data #添加数据目录
|
5、提供服务控制脚本
1
2
|
cp /usr/local/mysqlsupport-files/mysql .server
/etc/rc .d /init .d /mysqld <BR> chmod +x /etc/rc .d /init .d /mysqld
|
添加至服务列表:
1
2
|
chkconfig --add mysqld chkconfig mysqld on |
首次启动时安全保证:这里可以设置 root 密码,删除test库等操作
1
|
usr /local/mysql/bin/mysql_secure_installation
|
而后就可以启动服务测试使用了。
6、输出mysql的man手册、头文件、库文件
man:在/etc/man.conf中添加:
1
|
MANPATH /usr/local/mysql/man
|
头文件:
1
|
ln -sv /usr/local/mysql/include /usr/include/mysql
|
库文件:
1
2
|
echo “ /usr/local/mysql/lib ” > /etc/ld .conf.d /mysql .conf
ldconfig |
7、导出命令
1
|
echo ”PATH= /usr/local/mysql/bin :$PATH“
|
第三步、编译php-5.5.26
编译后直接作为httpd的模块运行:
1、解决依赖关系
1
2
|
yum groupinstall “Development tools” "Desktop Platform Development" -y
yum install libmcrypt-devel bizp2-devel libpng-devel
|
2、编译安装php-5.4.26
1
2
3
4
5
6
7
8
9
|
tar xf php-5.4.26. tar .bz2
cd php-5.4.26
. /configure --prefix= /usr/local/php5 --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-apxs2= /usr/local/apache/bin/apxs --with-mcrypt \
--with-config- file -path= /etc --with-config- file -scan- dir = /etc/php .d \
--with-bz2 -- enable -maintainer-zts
|
# 这一步可能出现错误,一般都是安装包的问题,解决依赖关系就可以了。
说明:
1、这里为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项。
2、如果使用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
1
2
3
|
make make test
make intall
|
为php提供配置文件:
1
|
cp php.ini-production /etc/php .ini
|
3、 编辑apache配置文件httpd.conf,以apache支持php
# vim /etc/httpd/httpd.conf
1、添加如下二行
1
2
|
AddType application /x-httpd-php .php
AddType application /x-httpd-php-source .phps
|
2、定位至DirectoryIndex index.html
修改为:
1
|
DirectoryIndex index.php index.html |
而后重新启动httpd,或让其重新载入配置文件即可测试php是否已经可以正常使用。
四、启用服务器状态
mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。这些数据通常包括但不限于:
(1) 处于工作状态的worker进程数;
(2) 空闲状态的worker进程数;
(3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数;
(4) 当前服务器总共发送的字节数;
(5) 服务器自上次启动或重启以来至当前的时长;
(6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数;
启用状态页面的方法很简单,只需要在主配置文件中添加如下内容即可:
1
2
3
4
|
<Location /server-status >
SetHandler server-status
Require all granted
< /Location >
|
需要提醒的是,这里的状态信息不应该被所有人随意访问,因此,应该限制仅允许某些特定地址的客户端查看。比如使用Require ip 172.16.0.0/16来限制仅允许指定网段的主机查看此页面。
示例:利用搭建好的yum平台安装phpMyAdmin数据库管理软件。
1
2
|
tar xf phpMyAdmin-3.5.1-all-languages. tar .bz2 -C /usr/local/apache24/htdocs/
mv /usr/local/apache24/htdocs/phpMyAdmin-3 .5.1-all-languages/ /usr/local/apache24/htdocs/pma
|
此时我们就可以访问测试了:
此时我们可以使用ab工具对web服务器压测:
测试环境:
cpu型号:Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz
内存大小:4G
cpu核心数:4
1
|
ab -n 10000 -c 1000 http: //192 .168.1.66 /pam/index .php
|
测试结果:
1
2
3
|
Requests per second: 424.73 [ #/sec] (mean)
Time per request: 2354.452 [ms] (mean) Time per request: 2.354 [ms] (mean, across all concurrent requests) |
五、安装xcache,为php加速:
1、安装
1
2
3
4
5
|
tar xf xcache-3.0.3. tar .gz
cd xcache-3.0.3
/usr/local/php/bin/phpize . /configure -- enable -xcache --with-php-config= /usr/local/php5/bin/php-config
make && make install
|
安装结束时,会出现类似如下行:
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-zts-20100525/
2、编辑php.ini,整合php和xcache:
首先将xcache提供的样例配置导入php.ini
1
2
|
mkdir /etc/php .d
cp xcache.ini /etc/php .d
|
说明:xcache.ini文件在xcache的源码目录中。
接下来编辑/etc/php.d/xcache.ini,找到zend_extension开头的行,修改为如下行:
1
|
zend_extension = /usr/local/php/lib/php5/extensions/no-debug-zts-20100525/xcache .so
|
注意:如果php.ini文件中有多条zend_extension指令行,要确保此新增的行排在第一位。
安装了php加速器后,测试效果大致能提升一倍左右
1
2
3
|
Requests per second: 1161.31 [ #/sec] (mean)
Time per request: 861.096 [ms] (mean) Time per request: 0.861 [ms] (mean, across all concurrent requests) |
模式二:web服务器 、数据库服务器、php在分别在不同服务器
实验拓扑图如下:
第一步:在192.168.1.33上安装http-2.4.9
安装过程和模式一一样,这里不再详述。安装完成后只提供服务脚本,先不做其他配置。
测试结果:
第二步:在192.168.1.66上安装mariadb-5.5.32
这里使用通用二进制方式安装,与模式一也是一样。
测试结果:
第三步:在192.168.1.99上安装php-5.5.26
此时httpd和php之间通过fcgi协议通信。
在192.168.1.99上:
1、解决依赖关系
1
2
|
yum -y groupinstall "Desktop Platform Development" “Development Tools”
yum install -y openssl-devel bzip2 -devel libmcrypt-devel
|
2、安装php-5.4.26
1
2
3
4
5
6
7
8
9
10
|
tar xf php-5.4.26. tar .bz2
cd php-5.4.26
. /configure --prefix= /usr/local/php --with-openssl --with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd -- enable -mbstring \
--with-freetype- dir --with-jpeg- dir --with-png- dir --with-zlib \
--with-libxml- dir = /usr -- enable -xml -- enable -sockets \
-- enable -fpm --with-mcrypt \
--with-config- file -path= /etc --with-config- file -scan- dir = /etc/php .d \
--with-bz2 --with-gd -- enable -maintainer-zts
make && make install
|
--with-config-file-scan-dir Set the path where to scan for configuration files
mysqli 扩展允许用户访问由 MySQL 4.1 或更高版本所提供的功能。
pdo:轻量级的统一接口(PHP Data Objects)
为php提供配置文件:
1
|
cp php.ini-production /etc/php .ini
|
3、配置php-fpm
为php-fpm提供SysV init脚本,并将其添加至服务列表:
1
2
3
4
|
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提供配置文件:
1
|
cp /usr/local/php/etc/php-fpm .conf.default /usr/local/php/etc/php-fpm .conf
|
配置fpm的相关选项为你所需要的值,并启用pid文件:
1
2
3
4
5
6
7
|
pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pid = /usr/local/php/var/run/php-fpm .pid
listen = 192.168.1.99:9000 listen.allowed_clients = 192.168.1.33 # 为了安全开启此设置,默认情况下是都允许连接的
|
接下来就可以启动php-fpm了:
1
|
service php-fpm start |
验证:
在192.168.1.33上:
1、启用httpd的相关模块
在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载
1
2
|
LoadModule proxy_module modules /mod_proxy .so
LoadModule proxy_fcgi_module modules /mod_proxy_fcgi .so
|
2、配置虚拟主机支持使用fcgi
在相应的虚拟主机中添加类似如下两行
1
2
|
ProxyRequests Off # 开启反向代理
ProxyPassMatch ^/(.*\.php)$ fcgi: //192 .168.1.99:9000 /PATH/TO/DOCUMENT_ROOT/ $1
|
ProxyRequests Off:关闭正向代理
ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://192.168.1.99:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。
3、编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页
vim /etc/httpd24/httpd.conf
1)、添加如下二行
1
2
|
AddType application /x-httpd-php .php
AddType application /x-httpd-php-source .phps
|
2)、定位至DirectoryIndex index.html 修改为:
1
|
DirectoryIndex index.php index.html |
4、创建站点目录和测试页面
1
|
mkdir -p /web/vhosts/wordpress
|
测试结果:
结果尽然没有成功。why???
仔细发现是原理的问题,关键的一点是:web服务器接收到关于php的请求后,实际是在哪里执行php程序呢??
出现上述问题是,没有把握好原理。web服务器(192.168.1.33)收到php请求后,使用 fcgi 协议反向代理到 php 应用程序服务器(192.168.1.99)的对应路径下执行相关的 php 程序。
解决办法:
在192.168.1.33:
1
|
rm -rf /web/vhosts/wordpress/index .php
|
在192.168.1.99:
1
|
mkdir -p /web/vhosts/wordpress/
|
添加测试页面:
1
2
3
4
5
6
7
8
9
10
11
12
|
cat << EOF > /web/vhosts/wordpress/index .php
<?php $link = mysql_connect( '192.168.1.66' , 'guoting' , 'guoting' );
if ($link)
echo "Success..." ;
else
echo "Failure..." ;
mysql_close();
phpinfo();
?> EOF |
测试结果如下:
解决了这个问题的话,lamp平台搭建就基本完成。
在192.168.1.99上安装xcache,作法同模式一。安装完成后,确保有这个模块。如下图:
示例:
在模式二的平台上搭建drupal。
在192.168.1.33上:
1
|
unzip /root/wordpress-3 .3.1-zh_CN.zip -d /web/vhosts/wordpress/
|
访问:http://www.wordpress.org/wordpress 根据提示安装,关键步骤如下:
这里面好多图片等内容都没有加载到,解决办法之一是:在web服务器上提供相同的资源,如下图:
至此,lapm平台的搭建基本完成。对于如何解决httpd动静资源的分离,后续会讲解更好的方法。