博文结构
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
[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 start
Starting php-fpm done
[root@localhost php-5.6.27]# netstat -anpt | grep php-fpm
tcp 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
<VirtualHost *:80>
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地址
<Directory "/var/www/benet">
Options FollowSymLinks //禁止目录遍历
AllowOverride None //允许请求为空
Require all granted //允许所有客户端访问
</Directory>
</VirtualHost>
[root@localhost ~]# apachectl -t
Syntax 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地址后面的目录路径需要与<VirtualHost> 中的 DocumentRoot 后的路径一致 。ProxyPassMatch 只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,^/(.*\.php(/.*)?)$ 从网站(虚拟主机<VirtualHost> 的根目录开始,匹配任何以 .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
<?php
phpinfo();
?>
- 用客户机访问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 -p123
mysql> 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
<?php
$link=mysql_connect('192.168.148.131','aaa','123456');
if($link) echo "恭喜你,数据库连接成功!!!"; else echo "connect shibai";
mysql_close($link);
?>
- 验证
看到上面两个测试页说明 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.html
asdasdasdasdasdasd
//创建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 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.4.23
Server Hostname: 192.168.1.129
Server Port: 80
Document 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 max
Connect: 0 24 138.0 4 1034
Processing: 8 50 93.8 16 822
Waiting: 0 47 93.2 13 816
Total: 12 74 168.7 20 1255
Percentage 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
- 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/phpize
Configuring for:
\\需要使用phpize命令来生成configure配置文件
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend 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=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-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 restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
- 测试
部署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 restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
- Mysql服务器进行以下操作
[root@localhost ~]# mysql -u root -p123
mysql> 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刷新一下
来源:51CTO
作者:mb5d03569e7eb16
链接:https://blog.51cto.com/14400213/2461345