Centos7.3 部署 LAMP 架构动静分离
一、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的安装与配置
环境部署:
这里我已经存在Apache和MySQL:
Apache安装可参考:https://blog.51cto.com/14227204/2459749
MySQL安装可参考:https://blog.51cto.com/14227204/2425596
1、部署PHP服务器:
下载我提供的PHP安装包并上传到PHP服务器:https://pan.baidu.com/s/1d2ETH7xgobxh33G7FYYvKw
提取码:xs8u
#首先需要为PHP安装依赖包[root@php php]# yum -y install libxml2-devel openssl-devel bzip2-devel[root@php php]# tar zxf libmcrypt-2.5.7 [root@php php]# cd 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 ..[root@php php]# tar zxf php-5.6.27.tar.gz [root@php php]# 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
- --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.171.133:9000 #监听地址是本机的IP9000端口pm.max_children = 50 #最大启动的进程数pm.start_servers = 5 #初始启动进程数pm.min_spare_servers = 5 #最小空闲进程pm.max_spare_servers = 35 #最大空闲进程#修改完成后,保存退出即可[root@php /]# service php-fpm restart # 重启PHP使配置生效Gracefully shutting down php-fpm . doneStarting php-fpm done[root@php /]# netstat -anput | grep 9000 # 查看是否运行tcp 0 0 192.168.171.133:9000 0.0.0.0:* LISTEN 3054/php-fpm: maste [root@php /]# firewall-cmd --permanent --add-port=9000/tcp # 配置防火墙放行流量success[root@php /]# firewall-cmd --reload # 重载防火墙使之生效
2、配置Apache服务器:
[root@apache /]# vim /usr/local/http-2.4.23/conf/httpd.conf # 编辑主配置文件#去掉以下两行的#号LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so ....................................#定位到Add Type开头的这两行,注意这两行不要被注释掉 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 .php ........................................... DirectoryIndex index.php index.html # 定位到此处,在index.html前添加index.php ..........................................Include conf/extra/httpd-vhosts.conf # 定位到此处,将#去掉,开启虚拟主机#到此就可以wq保存退出了[root@apache /]# vim /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf # 编辑虚拟主机配置文件#虚拟主机配置如下 ServerAdmin 848369866@qq.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.171.133:9000/var/www/html/$1Options FollowSymLinksAllowOverride NoneRequire all granted [root@apache /]# mkdir -p /var/www/html # 创建网站根目录[root@apache /]# echo test.com > /var/www/html/index.html # 编写测试网页[root@apache /]# 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 文件在操作系统中的绝对路径,否则会找不到文件。
3、测试LAMP:
#在PHP服务器中编辑这两个测试文件 [root@php /]# cat /var/www/html/index.php [root@php /]# cat /var/www/html/test.php
4、MySQL 服务器上创建用户并赋予远程登录的权限:
[root@mysql /]# mysql -u root -p # 登录Enter password: # 输入数据库密码mysql> create database bbs; # 创建专用数据库Query OK, 1 row affected (0.00 sec)mysql> grant all on bbs.* to zyz@192.168.171.133 identified by 'pwd@123'; # 授权用户zyzQuery OK, 0 rows affected, 1 warning (0.00 sec)
客户端访问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 /]# 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 /]# export LD_LIBRARY_PATH="/usr/local/openssl/lib/" # 执行此命令设置环境变量[root@apache /]# ab -VThis 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/
3、ab压力测试:
[root@apache /]# ab -c 500 -n 1000 127.0.0.1/index.html#-c:在测试会话中所执行的请求个数(即总请求数)#-n:一次产生的请求个数(即 并发用户数 )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: 9 bytes # HTTP 响应数据的正文长度Concurrency Level: 500 # 并发个数Time taken for tests: 0.807 seconds # 所有这些请求处理完成所花费的时间Complete requests: 1000 # 完成请求数Failed requests: 0 # 失败的请求数Total transferred: 251000 bytes#表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度HTML transferred: 9000 bytes # 网页文件的大小(去除响应头部的大小)Requests per second: 1238.40 [#/sec] (mean)#吞吐量,计算方式:请求的次数/用户等待时间(Complete requests/Time taken for tests)Time per request: 403.748 [ms] (mean)#用户平均等待一个页面的时间,计算方式:用户等待时间/完成请求的次数(Complete requests/Concurrency Level)Time per request: 0.807 [ms] (mean, across all concurrent requests)#服务器处理一个请求花费的时间,计算方式:用户等待时间/完成请求的次数(Time taken for tests/Complete requests)Transfer rate: 303.55 [Kbytes/sec] received#用户请求的数据大小,计算方式:数据的总长度/用户等待时间(Total trnasferred/ Time taken for tests)#这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。(即平均每秒网络上的流量)Connection Times (ms) min mean[+/-sd] median maxConnect: 0 2 1.6 1 5Processing: 1 78 138.1 9 802Waiting: 1 77 138.3 8 802Total: 2 79 139.2 11 805Percentage of the requests served within a certain time (ms) 50% 11 66% 16 75% 206 80% 208 90% 209 95% 405 98% 406 99% 805 100% 805 (longest request)以上部分的数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过 834ms,这个处理时间是指前面的 Time per request,即对于单个用户而言,平均每个请求的处理时间。
4、ab性能指标:
在进行性能测试过程中有几个指标比较重要:
吞吐率(Requests per second)
服务器并发处理能力的量化描述,单位是 reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
注:吞吐率是基于并发用户数的。这句话代表了两个含义:
- 吞吐率和并发用户数相关;
- 不同的并发用户数下,吞吐率一般是不同的。
计算公式:总请求数/处理完成这些请求数所花费的时间,即
Request per second=Complete requests/Time taken for tests
必须要说明的是,这个数值表示当前机器的整体性能,值越大越好。
并发连接数(The number of concurrent connections)
并发连接数指的是某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。
并发用户数(Concurrency Level)
要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。
用户平均请求等待时间(Time per request)
计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即:
Time per request=Time taken for tests/(Complete requests/Concurrency Level)服务器平均请求等待时间(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:
之前下载的软件包中就包含着xcache的源码包
[root@php php]# tar zxf xcache-3.2.0.tar.gz [root@php php]# cd 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-non-zts-20131226/
2、创建xcache缓存文件:
[root@php /]# touch /tmp/xcache[root@php /]# chmod 777 /tmp/xcache # 需要有写入权限
3、复制xcache后台管理程序到网站根目录:
[root@php /]# cd /php/xcache-3.2.0/[root@php xcache-3.2.0]# cp -r htdocs/ /var/www/html/xcache
4、配置PHP支持xcache:
[root@php /]# vim /etc/php.ini #在配置文件末尾添加以下内容[xcache-common]extension = /usr/local/php5.6/lib/php/extensions/no-debug-non-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 /]# service php-fpm restart Gracefully shutting down php-fpm . doneStarting php-fpm done
5、配置NFS,并回到Apache服务器挂载NFS共享目录,以便同步网页根目录下的文件:
[root@php /]# vim /etc/exports/var/www/html/ 192.168.171.0/24(rw,sec=sys,sync,no_root_squash)[root@php /]# systemctl restart nfs # 重启nfs使之生效#回到Apache服务器[root@apache /]# showmount -e 192.168.171.133 # 确认可以查看到PHP共享的目录Export list for 192.168.171.133:/var/www/html 192.168.171.0/24[root@apache /]# mount -t nfs 192.168.171.133:/var/www/html/ /var/www/html/ # 挂载到本地网站根目录[root@apache /]# df -hT192.168.171.133:/var/www/html nfs4 50G 4.8G 46G 10% /var/www/html
6、测试:
访问www.test.com/xcache 即可看到如下页面:
到此,php的加速软件xcache就安装完成
7、对Apache动态页面测试:
[root@apache /]# ab -c 100 -n 1000 http://192.168.171.134/index.php # 第一次测试............................. //Time taken for tests: 0.787 seconds............................. //Requests per second: 1270.78 [#/sec] (mean)............................. //[root@apache /]# ab -c 100 -n 1000 http://192.168.171.134/index.php # 第二次测试............................. //Time taken for tests: 0.755 seconds............................. //Requests per second: 1325.23 [#/sec] (mean)............................. //
查看Xcache的命中率:
五、部署bbs论坛
PHP服务器上操作:
之前下载的软件包中有bbs论坛的源码包,拉过来用即可
[root@php php]# unzip Discuz_7.0.0_FULL_SC_UTF8.zip [root@php php]# cd Discuz_7.0.0_FULL_SC_UTF8/[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 ...................... // 省略部分内容short_open_tag = On # 定位到此行,修改Off为On[root@php /]# service php-fpm restartGracefully shutting down php-fpm . doneStarting php-fpm done
配置bbs(使用之前用来测试链接数据库的用户给bbs论坛使用即可)
访问www.test.com/bbs/install