编译环境:
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动静资源的分离,后续会讲解更好的方法。