博文大纲:

  • 一、LAMP动静分离的概念
  • 二、LAMP的安装与配置
  • 三、web网站压力测试
  • 四、部署PHP加速软件Xcache
  • 五、部署bbs论坛

之前写过一篇部署LAMP平台的博文:基于centos 7搭建LNMP架构,只是那个是基于同一台服务器部署的,用来做测试网站或者访问量不大的情况下,是可以应付的,那么?如果该web网站访问量特别大呢?

一、LAMP动静分离的概念

当需要搭建一个高效的web架构时,采用动静分离无疑是最好的选择,这篇博文将写下来LAMP的动静分离部署方式。

所谓LAMP?LAMP架构是目前最成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态web站点服务及其应用开发环境。与之并肩的还有LNMP、LTMP等,LAMP说白了就是Linux操作系统上安装Apache网站服务,构建php/perl/Python运行环境来连接mysql数据库,四个组件合起来就简称“LAMP”。 LNMP只不过是用Nginx来搭建了这个httpd服务。

PHP在LAMP环境下共有三种工作模式:CGI 模式、apache 模块、FastCGI (FCGI)模式。CGI 模式下运行 PHP,性能不是很好。FastCGI 的方式和 apache 模块的不同点在于:FastCGI 方式 PHP 是一处独立的进程,所有 PHP 子进程都由 PHP 的一个叫做php-fpm 的组件负责管理;而 apache 模块化方式运行的 PHP,则是 apache 负责调用 PHP 完成工作。PHP 的 FastCGI 方式性能要比 apache模块化方式强很多。

这里将以 FastCGI 方式编译安装 LAMP架构。

FastCGI 的工作机制: 客户端发起请求,请求分为 2 种,一种是静态请求它可以直接由 Apache 直接响应返回;另一种是动态的请求,如其中包含中 php或者 Perl 这种脚本解释性语言,则由 Apache 服务器通过fastcgi协议调用php服务器执行并返回给Apache由Apache返回解释执行后的结果,如果这个过程中涉及到对数据的操作,此时 php 服务器还会还会通过 mysql 协议调用 mysql服务器。

示意图如下:

二、LAMP的安装与配置

1、环境准备

我这里环境如下:

我这里已经存在了Apache服务器和MySQL服务器,自行部署即可,可参考博文:Apache服务的安装及工作模式介绍基于centos7搭建MySQL数据库

2、对PHP服务器进行部署

这里直接开始部署PHP服务器

下载我提供的源码包,然后上传至PHP服务器。

#以下为安装PHP及其依赖
[root@php ~ ]# tar zxf libmcrypt-2.5.7.tar.gz -C /usr/src
[root@php ~]# tar zxf php-5.6.27.tar.gz -C /usr/src
[root@php ~]# yum -y install libxml2-devel openssl-devel bzip2-devel
[root@php ~]# cd /usr/src/libmcrypt-2.5.7
[root@php libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install
[root@php libmcrypt-2.5.7]# cd ../php-5.6.27/
[root@php php-5.6.27]# ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts && make && make install

上面编译安装PHP的选项作用解释如下:

  • --prefix=/usr/local/php5.6 #安装位置
  • --with-mysql=mysqlnd #支持 mysql
  • --with-pdo-mysql=mysqlnd #支持 pdo 模块
  • --with-mysqli=mysqlnd #支持 mysqli 模块 #上面的三选项的作用:数据库与 php 不在一个服务器上,指定此种方式,安装数据库连接驱动。
  • --with-openssl #支持 openssl 模块
  • --enable-fpm #支持 fpm 模式
  • --enable-sockets #启用 socket 支持
  • --enable-sysvshm #启用系统共享内存支持
  • --enable-mbstring #多字节字串、像我们的中文就是多字节字串
  • --with-freetype-dir #支持 freetype、就要装 freetype-devel、跟字体相关的、字体解析工具
  • --with-jpeg-dir
  • --with-png-dir #上面的二选项的作用:处理 jpeg、png 图片的、php 可以动态生成 jpeg 图片
  • --with-zlib #是个压缩库、在互联网传输时用来压缩传输的
  • --with-libxml-dir=/usr #这个 libxml 是用来解析 xml 的、指定/usr 下
  • --enable-xml #支持 xml 的
  • --with-mhash #支持 mhash
  • --with-mcrypt=/usr/local/libmcrypt #libmcrypt-devel 这个程序包所指定的
  • --with-config-file-path=/etc #指定配置文件的存放路径的
  • --with-config-file-scan-dir=/etc/php.d #配置文件扫描路径
  • --with-bz2 #支持 BZip2

为了支持 apache 的 worker 或 event 这两个 MPM,编译时使用了--enable-maintainer-zts 选项。

#以下为调整PHP的配置文件及控制服务的启停
[root@php php-5.6.27]# cp php.ini-production /etc/php.ini    #复制源码中中提供的PHP配置文件
[root@php php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
#复制其服务控制脚本文件
[root@php php-5.6.27]# chmod +x /etc/init.d/php-fpm    #赋予执行权限
[root@php php-5.6.27]# chkconfig --add php-fpm    #添加为系统服务,以便支持systemctl管理
[root@php php-5.6.27]# chkconfig php-fpm on   #开启
#复制php-fpm提供的默认配置文件并编辑它
[root@php php-5.6.27]# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
[root@php php-5.6.27]# vim /usr/local/php5.6/etc/php-fpm.conf
listen = 192.168.20.5:9000    #监听地址是本机的IP9000端口
pm.max_children = 50         #最大启动的进程数
pm.start_servers = 5          #初始启动进程数
pm.min_spare_servers = 5     #最小空闲进程
pm.max_spare_servers = 35     #最大空闲进程
#修改完成后,保存退出即可
[root@php php-5.6.27]# systemctl start php-fpm    #启动PHP服务
[root@php php-5.6.27]# netstat -anput | grep php-fpm     #确认其9000端口以启动
[root@php ~]# mkdir -p /var/www/html        #创建其网页存放目录,须和apache服务器的网页存放路径一样
[root@php ~]# firewall-cmd --permanent --add-port=9000/tcp   #防火墙放行9000端口的流量
[root@php ~]# firewall-cmd --reload    #重载以便生效

3、配置apache服务器(切换到apache服务器进行以下操作)

[root@apache ~]# cd /usr/local/http-2.4.23/conf/
[root@apache conf]# vim httpd.conf     #编辑apache服务的主配置文件
#启用以下两个模块(将下面两行前面的“#”号去掉即可)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
Include conf/extra/httpd-vhosts.conf        #启用虚拟主机的配置文件
               ..............#省略部分内容
		AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
#定位到上面两行(注意,这两行一定是没有被注释的),然后写入下面两行配置,让apache可以识别php格式的页面
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
<IfModule dir_module>      #定位到该标签
    DirectoryIndex index.php index.html   #在index.html前添加index.php
</IfModule>
#至此保存退出即可
[root@apache conf]# vim extra/httpd-vhosts.conf     #编辑虚拟主机配置文件
#虚拟主机的配置文件如下
<VirtualHost *:80>
    ServerAdmin lv916551516@163.com
    DocumentRoot "/var/www/html"
    ServerName www.test.com
    ErrorLog "logs/test-error_log"
    CustomLog "logs/test-access_log" common
    ProxyRequests Off
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.20.5:9000/var/www/html/$1
<Directory "/var/www/html">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
#编辑完成后,保存退出
[root@apache conf]# mkdir -p /var/www/html/    #创建网页根目录
[root@apache conf]# echo this is a test file >> /var/www/html/index.html
[root@apache conf]# apachectl restart    #重启apache服务


以上虚拟主机的配置文件解释如下:

  • ProxyRequests off #关闭正向代理
  • ProxyPassMatch #把以.php 结尾的文件请求发送到 php-fpm 进程,php-fpm 至少需要知道运行的目录和 URI,所以这里直接在 fcgi://192.168.20.5:9000 后指明了这两个参数,其它的参数的传递已经被 mod_proxy_fcgi.so 进行了封装,不需要手动指定。
  • 特别注意的是,/var/www/html/需要与<VirtualHost >中的 DocumentRoot 后的路径一致
  • ProxyPassMatch #只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,^/(..php(/.)?)$ ,从网站(虚拟主机<VirtualHost >的根目录开始,匹配任何以 .php 结尾,或者在 .php 之后紧跟一个 / 再跟别的内容的路径。
  • ^ (caret) 和 $ (dollar)标志要匹配的路径的开始和结束
  • ( )括号里的内容可以用 $1 来表示,以方便后面引用它。
  • fcgi://192.168.20.5:9000 通过 mod_proxy_fcgi 来转发的代理,使用 fastCGI 协议,转到PHP-FPM 监听的端口。
  • /var/www/html #非常重要!必须与虚拟主机的路径匹配,且必须是对应 php 文件在操作系统中的绝对路径,否则会找不到文件。

4、回到PHP服务器,测试LAMP环境

#编写以下两个网页文件
[root@php ~]# cat /var/www/html/index.php   #用来显示PHP的版本信息
<?php
phpinfo();
?>
[root@php ~]# cat /var/www/html/test.php    #用来测试连接数据库
<?php
$link=mysqli_connect('192.168.20.6','lvjz','pwd@123');
if($link) echo "恭喜你,数据库连接成功!!!"; else echo "connect shibai";
mysqli_close($link);
?>

5、在MySQL服务器上添加用户,并赋予远程登录的权限

[root@localhost src]# mysql -uroot -p    
Enter password:            #验证数据库用户密码
mysql> create database bbs;        #创建专用的数据库
Query OK, 1 row affected (0.00 sec)
mysql> grant all on bbs.* to lvjz@192.168.20.5 identified by 'pwd@123';  #授权用户为lvjz
Query OK, 0 rows affected (0.01 sec)

客户端访问web服务器的www.test.com 进行测试:

客户端访问web服务器的www.test.com/test.php 进行测试:

看到上面两个测试页说明 apache、php、mysql 之间可以协同工作了。

三、web网站压力测试

网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。

性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。我比较习惯用apahce自带的ab工具。

ab 非常实用,它不仅可以对 apache 服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如 nginx、tomcat、IIS 等。

1、ab 的原理

ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问。它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。 ab 命令对发出负载的计算机要求很低,它既不会占用很高 CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似 CC gong击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。

2、ab的安装

ab 的安装非常简单,如果是源码安装 apache 的话,那就更简单了。apache 安装完毕后 ab命令存放在 apache 安装目录的 bin 目录下。如下: /usr/local/http2.4.23/bin/ab。 如果 apache 是通过 yum 的 RPM 包方式安装的话,ab 命令默认存放在/usr/bin 目录下。如下: which ab 注意:如果不想安装 apache 但是又想使用 ab 命令的话,我们可以直接安装 apache 的工具包 httpd-tools。如下: yum -y install httpd-tools 查看 ab 是否安装成功,可以切换到上述目录下,使用 ab –V 命令进行检测。

[root@apache conf]# ab -V     #好像报错了
ab: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory
[root@apache conf]# export    LD_LIBRARY_PATH="/usr/local/openssl/lib/"  
#执行该命令,设置环境变量即可
[root@apache conf]# ab -V
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
               .................... #省略部分内容

3、ab压力测试

[root@apache ~]# ab -c 500 -n 1000 127.0.0.1/index.html   #对本机的静态网页进行测试
#-n:在测试会话中所执行的请求个数(即总请求数)。
#-c:一次产生的请求个数(即 并发用户数 )。
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.4.23
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /index.html     #请求的资源
Document Length:        20 bytes     #HTTP 响应数据的正文长度

Concurrency Level:      500    #并发个数(并发用户数)
Time taken for tests:   2.093 seconds   #所有这些请求处理完成所花费的时间
Complete requests:      1000    #完成请求数
Failed requests:        0        #失败的请求数
Total transferred:      264000 bytes    
#表示所有请求的响应数据长度总和,包括每个 HTTP响应数据的头信息和正文数据的长度。
HTML transferred:       20000 bytes  #网页文件的大小(就是去除响应头部后的大小) 
Requests per second:    477.87 [#/sec] (mean)  
#吞吐量,计算方式:请求的次数/用户等待时间(Complete requests/Time taken for tests)
Time per request:       1046.320 [ms] (mean)   
#用户平均等待一个页面的时间,计算方式:用户等待时间/完成请求的次数(Complete requests/Concurrency Level)
Time per request:       2.093 [ms] (mean, across all concurrent requests)
#服务器处理一个请求花费的时间,计算方式:用户等待时间/完成请求的次数(Time taken for tests/Complete requests)
Transfer rate:          123.20 [Kbytes/sec] received
#用户请求的数据大小,计算方式:数据的总长度/用户等待时间(Total trnasferred/ Time taken for tests)
#这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。(即平均每秒网络上的流量)

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1  252 401.1    109    1262
Processing:    13  245 224.7    230     817
Waiting:        2  225 208.0    230     816
Total:         20  498 559.7    243    1812

Percentage of the requests served within a certain time (ms)
  50%    243
  66%    496
  75%    691
  80%    834
  90%   1760
  95%   1760
  98%   1762
  99%   1762
 100%   1812 (longest request)
以上部分的数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过 834ms,这个处理时间是指前面的 Time per request,即对于单个用户而言,平均每个请求的处理时间。

4、ab性能指标

在进行性能测试过程中有几个指标比较重要: 1)吞吐率(Requests per second) 服务器并发处理能力的量化描述,单位是 reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 注:吞吐率是基于并发用户数的。这句话代表了两个含义:

  • 吞吐率和并发用户数相关;
  • 不同的并发用户数下,吞吐率一般是不同的。

计算公式:总请求数/处理完成这些请求数所花费的时间,即 Request per second=Complete requests/Time taken for tests 必须要说明的是,这个数值表示当前机器的整体性能,值越大越好。 2)并发连接数(The number of concurrent connections) 并发连接数指的是某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。 3)并发用户数(Concurrency Level) 要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。 4)用户平均请求等待时间(Time per request) 计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即: Time per request=Time taken for tests/(Complete requests/Concurrency Level) 5)服务器平均请求等待时间(Time per request:across all concurrent requests) 计算公式:处理完成所有请求数所花费的时间/总请求数,即: Time taken for/testsComplete requests 可以看到,它是吞吐率的倒数。 同时,它也等于用户平均请求等待时间/并发用户数,即 Time per request/Concurrency Level

四、部署PHP加速软件Xcache

Xcache是一款用来为PHP页面做缓存的工具。当然,实际工作环境中,是不会对PHP动态页面来做缓存的,意义不大(动态页面嘛,数据更新较快)又占用内存空间。这里只是为了表现出,PHP动态页面,也是可以做缓存的。

1、安装Xcache

在对PHP部署时,我提供了一个下载的链接,其中包含了这个xcache这个源码包,上传至PHP服务器即可。

[root@php ~]# tar zxf xcache-3.2.0.tar.gz -C /usr/src
[root@php ~]# cd /usr/src/xcache-3.2.0/
[root@php xcache-3.2.0]# /usr/local/php5.6/bin/phpize   #使用PHP中的phpize生成configure文件
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226

[root@php xcache-3.2.0]# ./configure  --enable-xcache  --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config && make && make install
#安装完成后,记住结尾提示的路径,以后会用到,如下:
/usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/

2、创建Xcache缓存文件

[root@php ~]# touch /tmp/xcache
[root@php ~]# chmod 777 /tmp/xcache    #保证有写入权限

3、复制Xcache后台管理程序到网站根目录

[root@php xcache-3.2.0]# cp -r htdocs/ /var/www/html/xcache

4、配置PHP支持Xcache

[root@php xcache-3.2.0]# vim /etc/php.ini  #编辑PHP的主配置文件
#在文件末尾添加以下内容
[xcache-common]
extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so
#这就是指定安装Xcache后返回的目录
[xcache.admin]
xcache.admin.enable_auth = Off
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=60M
xcache.count =1
xcache.slots =8K
xcache.ttl=0
xcache.gc_interval =0
xcache.var_size=64M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc_interval =300
xcache.test =Off
xcache.readonly_protection = Off
xcache.mmap_path ="/tmp/xcache"
xcache.coredump_directory =""
xcache.cacher =On
xcache.stat=On
xcache.optimizer =Off
[xcache.coverager]
xcache.coverager =On
xcache.coveragedump_directory ="" 
[root@php xcache-3.2.0]# systemctl restart php-fpm   #重启PHP
[root@php xcache-3.2.0]# vim /etc/exports   #设置nfs

/var/www/html/       192.168.20.0/24(rw,sec=sys,sync,no_root_squash)

5、回到apache服务器,挂载nfs共享目录,以便同步网页根目录下的文件

[root@apache ~]# showmount -e 192.168.20.5  #确认可以查看到PHP共享的目录
Export list for 192.168.20.5:
/var/www/html 192.168.20.0/24
[root@apache ~]# mount -t nfs 192.168.20.5:/var/www/html/ /var/www/html/
#挂载
[root@apache ~]# df -hT /var/www/html/    #确认已挂载
文件系统                   类型  容量  已用  可用 已用% 挂载点
192.168.20.5:/var/www/html nfs4   39G  5.0G   34G   13% /var/www/html

6、测试

访问www.test.com/xcache ,即可看到如下页面:

至此,Linux 下安装 php 加速软件 Xcache 完成。

7、对apache的动态页面进行测试

[root@apache ~]# export LD_LIBRARY_PATH="/usr/local/openssl/lib/" 
[root@apache ~]# ab -c 100 -n 1000 http://192.168.20.4/index.php        #进行第一次测试
          ......#省略部分内容
Time taken for tests:   4.292 seconds
         ......#省略部分内容
Requests per second:    232.99 [#/sec] (mean)
          ......#省略部分内容
[root@apache ~]# ab -c 100 -n 1000 http://192.168.20.4/index.php        #进行第二次测试
         ......#省略部分内容
Time taken for tests:   1.631 seconds
          ......#省略部分内容
Requests per second:    613.29 [#/sec] (mean)
         ......#省略部分内容

查看Xcache的命中率:

五、部署bbs论坛

1、在PHP服务器上进行以下操作

bbs论坛的源码包为Discuz_7.0.0_FULL_SC_UTF8.zip,同样在我文章开头的链接中可以提取,并上传至PHP服务器。

[root@php ~]# unzip Discuz_7.0.0_FULL_SC_UTF8.zip    #解压
[root@php Discuz_7.0.0_FULL_SC_UTF8]# cp -r upload/ /var/www/html/bbs
[root@php Discuz_7.0.0_FULL_SC_UTF8]# chmod -R 777 /var/www/html/bbs/
[root@php ~]# vim /etc/php.ini     #修改PHP配置文件
short_open_tag = On   #将原来的Off修改为On
[root@php xcache-3.2.0]# systemctl restart php-fpm   #重启PHP

2、配置bbs(使用之前用来测试链接数据库的用户给bbs论坛使用即可)

浏览器访问www.test.com/bbs/install :

———————— 本文至此结束,感谢阅读 ————————