基于centos 7部署LNMP动静分离以及部署Discuz论坛
博文结构
php的概念
部署lnmp
压力测试
部署
Discuz论坛
一.php的工作模式
- 三种工作模式
CGI模式:在这种模式下运行PHP,性能不是很好;apache模块:在这种模式下运行PHP,在LAMP平台部署及应用 就是使用的这种模式,使用apache调用php完成工作;FastCGI模式:在这种模式下运行PHP,PHP就是一处独立的进程,所有的PHP子进程都由PHP的一个叫做php-fpm的组件负责管理;- FastCGI 工作机制
首选客户端发起请求,请求一般分为两种:一种是静态请求,可以直接由Apache响应直接返回客户端所需资源;另一种动态请求,其中包含PHP或Perl这种脚本解释型语言,则由Apache服务器通过fastcgi协议调用php服务器执行并返回给Apache,由Apache向客户端返回客户端所需资源,如果这个过程中涉及到对数据的操作,此时php服务器还会通过mysql协议调用mysql服务器。如图:
二.部署lnmp动静分离
- 案例环境如下:
1台httpd服务器:192.168.148.129
1台php服务器:192.168.148.130
1台mysql服务器:192.168.148.131
搭建apache服务器
下载源码包
直接使用脚本安装搭建php
下载php软件包- 解决依赖关系
[root@localhost ~]# yum -y install libxml2-devel lzip2-devel libcurl-devel libmcrypt-devel openssl-devel bzip2-devel - 安装libmcrypt
[root@localhost ~]# tar zxf libmcrypt-2.5.7.tar.gz [root@localhost ~]# cd libmcrypt-2.5.7/[root@localhost libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install- 编译安装 php
[root@localhost ~]# tar zxf php-5.6.27.tar.gz [root@localhost ~]# cd php-5.6.27/[root@localhost 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(安装过程在15分钟左右)
- 相关选项的解释
--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 选项 如果使用 PHP5.3 以上版本,为了链接 MySQL 数据库,可以指定 mysqlnd,这样在本机就不 需要先安装 MySQL 或 MySQL 开发包了。mysqlnd 从 php 5.3 开始可用,可以编译时绑定到它 (而不用和具体的 MySQL 客户端库绑定形成依赖),但从 PHP 5.4 开始它就是默认设置了。 3- 提供 php 配置文件
[root@localhost php-5.6.27]# cp php.ini-production /etc/php.ini
- 为 php-fpm 提供脚本
[root@localhost php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm[root@localhost php-5.6.27]# chmod +x /etc/init.d/php-fpm [root@localhost php-5.6.27]# chkconfig --add php-fpm[root@localhost php-5.6.27]# chkconfig php-fpm on[root@localhost php-5.6.27]# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf- 提供 php-fpm 配置文件并编辑
[root@localhost php-5.6.27]# vim /usr/local/php5.6/etc/php-fpm.conf修改内容如下: pid = run/php-fpm.pid listen = 192.168.31.141:9000 \\本地ip地址(千万不能用127.0.0.1)pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 - 启动 php-fpm 服务
[root@localhost php-5.6.27]# service php-fpm startStarting php-fpm done[root@localhost php-5.6.27]# netstat -anpt | grep php-fpmtcp 0 0 192.168.148.130:9000 0.0.0.0:* LISTEN 130988/php-fpm: mas - 关闭防火墙或者输入以下命令:
[root@phpserver ~]# firewall-cmd --permanent --add-port=9000/tcp success [root@phpserver ~]# firewall-cmd --reload Success - 在该主机上新建虚拟主机目录用于存放网页文件
[root@localhost php-5.6.27]# mkdir -p /var/www/benet
配置 apache(切换到 apache 主机上操作)
在 Apache2.4 以后已经专门有一个模块针对 FastCGI 的实现,此模块为 mod_proxy_fcgi.so, 它其实是作为 mod_proxy.so 模块的扩充,因此,这两个模块都要加载 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so - 把前面#去掉
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/httpd.conf
- 建立一个目录作为虚拟主机的家目录
[root@localhost ~]# mkdir -p /var/www/benet
- 编辑主配置文件 httpd.conf,开启虚拟主机
同时定位 AddType;添加让 apache 能识别 php 格式的页面
AddType application/x-httpd-php .php并且定位至 DirectoryIndex:支持 php 格式的主页 (在它的中间加index.php)
- 配置虚拟主机支持使用 fcgi (把原有的删了添加)
[root@localhost ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf ServerAdmin admin@admin.com DocumentRoot "/var/www/benet" ServerName www.benet.com ServerAlias www.benet.com ErrorLog "logs/benet-error_log" CustomLog "logs/benet-access_log" common ProxyRequests Off //关闭正向代理 ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.148.130:9000/var/www/benet/$1 \\写php的IP地址 Options FollowSymLinks //禁止目录遍历 AllowOverride None //允许请求为空 Require all granted //允许所有客户端访问 [root@localhost ~]# apachectl -tSyntax OK[root@localhost ~]# apachectl restart//创建虚拟目录之后,重启httpd服务ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.1.3:9000/var/www/benet/$1 //把以.php 结尾的文件请求发送到 php-fpm 进程,php-fpm 至少需要知道运 行的目录和 URI,所以这里直接在 fcgi://192.168.1.3:9000 后指明了这两个参数,其它的参数的传递已经被 mod_proxy_fcgi.so 进行了封装,不需要手动指定。 特别注意的是,IP地址后面的目录路径需要与 中的 DocumentRoot 后的路径一致 。ProxyPassMatch 只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,^/(.*\.php(/.*)?)$ 从网站(虚拟主机 的根目录开始,匹配任何以 .php 结尾,或者在 .php 之后 紧跟一个 / 再跟别的内容的路径。 ^ (caret) 和 $ (dollar)标志要匹配的路径的开始和结束 ( )括号里的内容可以用 $1 来表示,以方便后面引用它。 fcgi:// 192.168.1.3:9000 通过 mod_proxy_fcgi 来转发的代理,使用 fastCGI 协议,转到 PHP-FPM 监听的端口。 /path/to/your/documentroot/ 非常重要!必须与虚拟主机的路径匹配,且必须是对应 php 文件在操作系统中的绝对路径。 否则会找不到文件。 $1 可以从原始请求扩展成整个请求路径的变量,这里指代前面( ) 里面匹配的那个路径(uri) - 在php服务器上创建测试网页
[root@localhost php-5.6.27]# vim /var/www/benet/index.php - 用客户机访问apache的ip
搭建mysql
下载软件包使用脚本一键安装- 编辑脚本安装
[root@localhost ~]# vim a.sh[root@localhost ~]# chmod a+x a.sh [root@localhost ~]# sh a.sh Starting MySQL. SUCCESS! mysql: [Warning] Using a password on the command line interface can be insecure.\\这是警告正常现象测试 LAMP 环境
- 在 mysql 主机上创建用于 php 服务器连接的 mysql 账户
[root@localhost ~]# mysql -u root -p123mysql> grant all on *.* to aaa@'192.168.148.%' identified by '123456';Query OK, 0 rows affected, 1 warning (0.00 sec)- 在php服务器填写测试脚本
[root@localhost php-5.6.27]# vim /var/www/benet/test1.php- 验证
看到上面两个测试页说明 apache、php、mysql 之间可以协同工作了。
压力测试
网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压 情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。
ab 是 apache 自带的压力测试工具。ab 非常实用,它不仅可以对 apache 服务器进行网站访 问压力测试,也可以对或其它类型的服务器进行压力测试。比如 nginx、tomcat、IIS 等。
下面我们开始介绍有关 ab 命令的使用:
1.ab 的原理
2.ab 的安装
3.ab 参数说明
4.ab 性能指标
5.ab 实际使用
6.测试 nginx 性能
1)ab 的原理 ab 是 apachebench 命令的缩写。 ab 的原理:ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访 问。它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测 试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。 ab 命令对发出负载的计算机要求很低,它既不会占用很高 CPU,也不会占用很多内存。但 却会给目标服务器造成巨大的负载,其原理类似 CC ***。自己测试使用也需要注意,否则 一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
2)ab 的安装
- 查看 ab 是否安装成功,可以切换到上述目录下,使用 ab -V 命令进行检测
[root@localhost ~]# /usr/local/http-2.4.23/bin/ab -V /usr/local/http-2.4.23/bin/ab: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory
解决:
如果 ab -V 命令出错,可以 exporexport LD_LIBRARY_PATH="/usr/local/openssl/lib/"
[root@localhost ~]# export LD_LIBRARY_PATH=/usr/local/openssl/lib/ \\//将所需模块所在路径导出为环境变量[root@localhost ~]# /usr/local/http-2.4.23/bin/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命令常用的参数有两个:
-n:在测试会话中所执行的请求个数(总请求数);-c:一次产生的请求个数(即并发用户数);[root@localhost ~]# cat /var/www/benet/index.htmlasdasdasdasdasdasd//创建Apache的首页文件[root@localhost ~]# ab -c 500 -n 10000 http://192.168.1.129/index.html//对192.168.1.129的Web服务器进行测试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 192.168.1.129 (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software: Apache/2.4.23Server Hostname: 192.168.1.129Server Port: 80Document Path: /index.html //请求的资源名称Document Length: 34 bytes //响应数据的正文长度Concurrency Level: 500 //并发个数Time taken for tests: 1.727 seconds //处理这些请求所花费的时间Complete requests: 10000 //成功请求完成的次数Failed requests: 0 //失败的请求次数Total transferred: 2780000 bytes //所有请求的响应数据长度总和HTML transferred: 340000 bytes //请求的正文数据总和Requests per second: 5788.87 [#/sec] (mean) //吞吐量-每秒请求数(计算公式:请求的次数/用户等待时间)吞吐量越大越好Time per request: 86.373 [ms] (mean) //用户平均等待时间(计算方式:用户等待时间/(请求的次数/并发))Time per request: 0.173 [ms] (mean, across all concurrent requests) //服务器平均等待时间(计算方式:用户等待时间/完成请求的次数)Transfer rate: 1571.59 [Kbytes/sec] received //用户请求的数据大小(计算方式:数据总长度/用户等待时间)Connection Times (ms) min mean[+/-sd] median maxConnect: 0 24 138.0 4 1034Processing: 8 50 93.8 16 822Waiting: 0 47 93.2 13 816Total: 12 74 168.7 20 1255Percentage of the requests served within a certain time (ms) 50% 20 66% 25 75% 31 80% 39 90% 222 95% 250 98% 832 99% 1050 100% 1255 (longest request) //这部分数据用于描述每个请求处理时间的分布情况- ab压力测试工具重要的性能指标
吞吐量:服务器并发处理能力的量化描述。指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐量。
注意:吞吐量是基于并发用户数的。这句话的含义:吞吐量和并发用户数有关;不同的并发用户数下,吞吐量是不同的;计算公式:总请求数/处理完成这些请求所花费的时间。2.并发连接数:并发连接数指的是某个时刻服务器所接收的请求数目,简单的讲,就是一个会话。
3.并发用户数:一个用户可以同时会产生一个会话或多个会话,也就是连接数;
4.用户平均等待时间:计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数);
5.服务器平均等待时间:计算公式:处理完成多有请求数所花费的时间/总请求数。也就是吞吐量的倒数。同时也就是用户平均等待时间/并发用户数。
- 安装php加速软件Xcache
下载Xcache
- CentOS7.2 下安装 php 加速软件 Xcache(在 php 主机上完成下面的操作
[root@localhost /]# tar zxf xcache-3.2.0.tar.gz [root@localhost /]# cd xcache-3.2.0/[root@localhost xcache-3.2.0]# /usr/local/php5.6/bin/phpizeConfiguring for:\\需要使用phpize命令来生成configure配置文件PHP Api Version: 20131106Zend Module Api No: 20131226Zend Extension Api No: 220131226[root@localhost 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- 安装后会出现一条路径非常重要后面步骤用到
- 编译配置参数详解:
--enable-xcache:启用xcache功能;--enable-xcache-coverager:用于测试加速器功效和附加性;--enable-xcache-optimizer:操作代码优化;- 创建 xcache 缓存文件
[root@localhost xcache-3.2.0]# touch /tmp/xcache[root@localhost xcache-3.2.0]# chmod 777 /tmp/xcache - 拷贝 xcache 后台管理程序到网站根目录
[root@localhost xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache
- 配置 php 支持 xcache
在最后一行添加以下内容
[root@localhost xcache-3.2.0]# vim /etc/php.ini [xcache-common]extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so[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 =On- 相关解释如下:
[xcache-common] extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so //启用php的xcache扩展功能[xcache.admin] xcache.admin.enable_auth = Off //关闭xcache认证[xcache] xcache.shm_scheme ="mmap" //决定xcache如何从系统共享内存//nmap是一种内存映射文件的方法xcache.size=60M //所用共享缓存的大小,如果设置为0,将无法使用xcache.count =1 //将cache切分成多少块,建议设置为cpu数 xcache.slots =8K //指作为hash槽个数的参考值xcache.ttl=0 //文件生存时间,设置为0将无限缓存xcache.gc_interval =0 //触发垃圾回收的时间间隔,默认为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 ="" //在遇到故障时,放置核心转储功能,必须是php可写入的目录,保留为空表示禁用xcache.cacher =On //使用opcode缓存,xcache.size=0时无效xcache.stat=On //使用stat发现检查脚本的更新xcache.optimizer =Off //禁用优化[xcache.coverager] xcache.coverager =On //启用代码覆盖信息采集器xcache.coveragedump_directory ="" //放置数据采集信息的目录位置,默认使用目录/tmp/pcovis- 将 xcache 目录拷贝到 apache 主机的网页文档目录下
[root@localhost xcache-3.2.0]# scp -r /var/www/benet/xcache/ root@192.168.148.129:/var/www/benet/- 重启php
[root@localhost xcache-3.2.0]# service php-fpm restartGracefully shutting down php-fpm . doneStarting php-fpm done- 测试
部署Discuz论坛
下载Discuz软件包
- 在php服务器上操作
[root@localhost /]# unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus[root@localhost /]# mv discus/Discuz_7.0.0_FULL_SC_UTF8/upload/ /var/www/benet/bbs[root@localhost /]# chown -R nobody:nobody /var/www/benet/bbs/[root@localhost /]# chmod -R 777 /var/www/benet/bbs/[root@localhost /]# vim /etc/php.ini short_open_tag = Off 改为short_open_tag = On[root@localhost /]# service php-fpm restartGracefully shutting down php-fpm . doneStarting php-fpm done- Mysql服务器进行以下操作
[root@localhost ~]# mysql -u root -p123mysql> create database bbs; \\创建数据库Query OK, 1 row affected (0.00 sec)Apache服务器进行以下操作
web 服务器也需要有静态文件[root@localhost /]# unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus[root@localhost /]# mv discus/Discuz_7.0.0_FULL_SC_UTF8/upload/ /var/www/benet/bbs[root@localhost /]# cd /var/www/benet/bbs [root@localhost bbs]# chown -R daemon config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/- 测试
出现这个页面我们还需要做一步
在php上操作
[root@localhost /]# scp -r /var/www/benet/bbs/ root@192.168.148.129:/var/www/benet/把php下的bbs复制到apache中按下f5刷新一下