Centos 7.3部署LAMP架构动静分离
博文大纲:
- 一、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.conflisten = 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.soLoadModule proxy_fcgi_module modules/mod_proxy_fcgi.soInclude 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 #定位到该标签 DirectoryIndex index.php index.html #在index.html前添加index.php #至此保存退出即可[root@apache conf]# vim extra/httpd-vhosts.conf #编辑虚拟主机配置文件#虚拟主机的配置文件如下 ServerAdmin lv916551516@163.com DocumentRoot "/var/www/html" ServerName www.test.com ErrorLog "logs/test-error_log" CustomLog "logs/test-access_log" common ProxyRequests OffProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.20.5:9000/var/www/html/$1Options FollowSymLinksAllowOverride NoneRequire all granted #编辑完成后,保存退出[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/需要与
中的 DocumentRoot 后的路径一致 - ProxyPassMatch #只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,^/(..php(/.)?)$ ,从网站(虚拟主机
的根目录开始,匹配任何以 .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的版本信息[root@php ~]# cat /var/www/html/test.php #用来测试连接数据库
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'; #授权用户为lvjzQuery 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 -VThis 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 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: Apache/2.4.23Server Hostname: 127.0.0.1Server Port: 80Document 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 maxConnect: 1 252 401.1 109 1262Processing: 13 245 224.7 230 817Waiting: 2 225 208.0 230 816Total: 20 498 559.7 243 1812Percentage 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: 20131106Zend Module Api No: 20131226Zend 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=60Mxcache.count =1xcache.slots =8Kxcache.ttl=0xcache.gc_interval =0xcache.var_size=64Mxcache.var_count =1xcache.var_slots =8Kxcache.var_ttl=0xcache.var_maxttl=0xcache.var_gc_interval =300xcache.test =Offxcache.readonly_protection = Offxcache.mmap_path ="/tmp/xcache"xcache.coredump_directory =""xcache.cacher =Onxcache.stat=Onxcache.optimizer =Off[xcache.coverager]xcache.coverager =Onxcache.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 :
-------- 本文至此结束,感谢阅读 --------