之前写过一篇部署LAMP平台的博文:基于centos 7搭建LNMP架构,只是那个是基于同一台服务器部署的,用来做测试网站或者访问量不大的情况下,是可以应付的,那么?如果该web网站访问量特别大呢?
当需要搭建一个高效的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服务器。
示意图如下:
我这里环境如下:
我这里已经存在了Apache服务器和MySQL服务器,自行部署即可,可参考博文:Apache服务的安装及工作模式介绍;基于centos7搭建MySQL数据库。
这里直接开始部署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的选项作用解释如下:
上面的三选项的作用:数据库与 php 不在一个服务器上,指定此种方式,安装数据库连接驱动。
================================================
上面的二选项的作用:处理 jpeg、png 图片的、php 可以动态生成 jpeg 图片
============================================
为了支持 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 #重载以便生效
[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.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 <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 FollowSymLinksAllow Override NoneRequire 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服务
以上虚拟主机的配置文件解释如下:
中的 DocumentRoot 后的路径一致
的根目录开始,匹配任何以 .php 结尾,或者在 .php 之后紧跟一个 / 再跟别的内容的路径。
#编写以下两个网页文件 [root@php ~]# cat /var/www/html/index.php #用来显示PHP的版本信息 <? phpphpinfo(); ?> [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); ?>
[root@localhost src]# mysql -uroot -pEnter 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 之间可以协同工作了。
网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。
性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。我比较习惯用apahce自带的ab工具。
ab 非常实用,它不仅可以对 apache 服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如 nginx、tomcat、IIS 等。
ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问。它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。
ab 命令对发出负载的计算机要求很低,它既不会占用很高 CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似 CC gong击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
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 $> .................... #省略部分内容
[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.23Server Hostname: 127.0.0.1Server 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,即对于单个用户而言,平均每个请求的处理时间。
在进行性能测试过程中有几个指标比较重要:
服务器并发处理能力的量化描述,单位是 reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
注:吞吐率是基于并发用户数的。这句话代表了两个含义:
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
Xcache是一款用来为PHP页面做缓存的工具。当然,实际工作环境中,是不会对PHP动态页面来做缓存的,意义不大(动态页面嘛,数据更新较快)又占用内存空间。这里只是为了表现出,PHP动态页面,也是可以做缓存的。
在对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: 20131106Z end Module Api No: 20131226Z end 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/
[root@php ~]# touch /tmp/xcache [root@php ~]# chmod 777 /tmp/xcache #保证有写入权限
[root@php xcache-3.2.0]# cp -r htdocs/ /var/www/html/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 =1xcache.slots =8K xcache.ttl=0xcache.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)
[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
访问www.test.com/xcache ,即可看到如下页面:
至此,Linux 下安装 php 加速软件 Xcache 完成。
[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论坛的源码包为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 :
本文来源:https://blog.51cto.com/141547...
关注「 民工哥技术之路」微信公众号对话框回复关键字:1024可以获取一份最新整理的 2TB 技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。