部署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/1d2ETH7xgobxh23G7FYYvKw
提取码:xs8u#首先需要为PHP安装依赖包 [ php]# yum -y install libxml2-devel openssl-devel bzip2-devel [ php]# tar zxf libmcrypt-2.5.7 [ php]# cd libmcrypt-2.5.7/ [ libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install [ libmcrypt-2.5.7]# cd .. [ php]# tar zxf php-5.6.27.tar.gz [ php]# cd php-5.6.27/ [ 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的配置文件及控制服务的启停 [ php-5.6.27]# cp php.ini-production /etc/php.ini #复制源码中中提供的PHP配置文件 [ php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm #复制其服务控制脚本文件 [ php-5.6.27]# chmod +x /etc/init.d/php-fpm #赋予执行权限 [ php-5.6.27]# chkconfig --add php-fpm #添加为系统服务,以便支持systemctl管理 [ php-5.6.27]# chkconfig php-fpm on #开启 #复制php-fpm提供的默认配置文件并编辑它 [ php-5.6.27]# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf [ php-5.6.27]# vim /usr/local/php5.6/etc/php-fpm.conf listen = 192.168.171.133:9000 #监听地址是本机的IP9000端口 pm.max_children = 50 #最大启动的进程数 pm.start_servers = 5 #初始启动进程数 pm.min_spare_servers = 5 #最小空闲进程 pm.max_spare_servers = 35 #最大空闲进程 #修改完成后,保存退出即可 [ /]# service php-fpm restart # 重启PHP使配置生效 Gracefully shutting down php-fpm . done Starting php-fpm done [ /]# netstat -anput | grep 9000 # 查看是否运行 tcp 0 0 192.168.171.133:9000 0.0.0.0:* LISTEN 3054/php-fpm: maste [ /]# firewall-cmd --permanent --add-port=9000/tcp # 配置防火墙放行流量 success [ /]# firewall-cmd --reload # 重载防火墙使之生效
2、配置Apache服务器:
[ /]# vim /usr/local/http-2.4.23/conf/httpd.conf # 编辑主配置文件 #去掉以下两行的#号 LoadModule proxy_module modules/mod_proxy.so LoadModule 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 ........................................... <IfModule dir_module> DirectoryIndex index.php index.html # 定位到此处,在index.html前添加index.php </IfModule> .......................................... Include conf/extra/httpd-vhosts.conf # 定位到此处,将#去掉,开启虚拟主机 #到此就可以wq保存退出了 [ /]# vim /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf # 编辑虚拟主机配置文件 #虚拟主机配置如下 <VirtualHost *:80> ServerAdmin 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.171.133:9000/var/www/html/$1 <Directory "/var/www/html"> Options FollowSymLinks AllowOverride None Require all granted </Directory> </VirtualHost> [ /]# mkdir -p /var/www/html # 创建网站根目录 [ /]# echo test.com > /var/www/html/index.html # 编写测试网页 [ /]# 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 文件在操作系统中的绝对路径,否则会找不到文件。
3、测试LAMP:
#在PHP服务器中编辑这两个测试文件 [ /]# cat /var/www/html/index.php <?php phpinfo(); ?> [ /]# cat /var/www/html/test.php <?php $link=mysqli_connect(‘192.168.171.135‘,‘zyz‘,‘‘); if($link) echo "恭喜你,数据库连接成功!!!"; else echo "connect shibai"; mysqli_close($link); ?>
4、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 identified by ‘‘; # 授权用户zyz Query OK, 0 rows affected, 1 warning (0.00 sec)
客户端访问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 命令进行检测。[ /]# ab -V # 额..... 报错了 ab: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory [ /]# export LD_LIBRARY_PATH="/usr/local/openssl/lib/" # 执行此命令设置环境变量 [ /]# ab -V 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/
3、ab压力测试:
[ /]# 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 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: 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 max Connect: 0 2 1.6 1 5 Processing: 1 78 138.1 9 802 Waiting: 1 77 138.3 8 802 Total: 2 79 139.2 11 805 Percentage 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的源码包 [ php]# tar zxf xcache-3.2.0.tar.gz [ php]# cd xcache-3.2.0/ [ 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 [ 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缓存文件:
[ /]# touch /tmp/xcache [ /]# chmod 777 /tmp/xcache # 需要有写入权限
3、复制xcache后台管理程序到网站根目录:
[ /]# cd /php/xcache-3.2.0/ [ xcache-3.2.0]# cp -r htdocs/ /var/www/html/xcache
4、配置PHP支持xcache:
[ /]# 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=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 ="" #写完后保存退出 [ /]# service php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done
5、配置NFS,并回到Apache服务器挂载NFS共享目录,以便同步网页根目录下的文件:
[ /]# vim /etc/exports /var/www/html/ 192.168.171.0/24(rw,sec=sys,sync,no_root_squash) [ /]# systemctl restart nfs # 重启nfs使之生效 #回到Apache服务器 [ /]# showmount -e 192.168.171.133 # 确认可以查看到PHP共享的目录 Export list for 192.168.171.133: /var/www/html 192.168.171.0/24 [ /]# mount -t nfs 192.168.171.133:/var/www/html/ /var/www/html/ # 挂载到本地网站根目录 [ /]# df -hT 192.168.171.133:/var/www/html nfs4 50G 4.8G 46G 10% /var/www/html
6、测试:
访问www.test.com/xcache 即可看到如下页面:
到此,php的加速软件xcache就安装完成
7、对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) ............................. // [ /]# 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论坛的源码包,拉过来用即可
[ php]# unzip Discuz_7.0.0_FULL_SC_UTF8.zip [ php]# cd Discuz_7.0.0_FULL_SC_UTF8/ [ Discuz_7.0.0_FULL_SC_UTF8]# cp -r upload/ /var/www/html/bbs [ Discuz_7.0.0_FULL_SC_UTF8]# chmod -R 777 /var/www/html/bbs [ /]# vim /etc/php.ini ...................... // 省略部分内容 short_open_tag = On # 定位到此行,修改Off为On [ /]# service php-fpm restart Gracefully shutting down php-fpm . done Starting php-fpm done
配置bbs(使用之前用来测试链接数据库的用户给bbs论坛使用即可)
访问www.test.com/bbs/install
相关推荐
全文使用的环境如题,主机使用的是腾讯云主机。内容应该会是linux和apache这些所有部分都有一点,因为是遇见一个问题就记录一个。 尝试清除浏览器缓存/换一个浏览器验证/重启服务器的apache服务