千家信息网

Centos7.3 部署 LAMP 架构动静分离

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,一、LAMP动静分离当需要搭建一个高效的web架构时,采用动静分离无疑是最好的选择,这篇博文将写下来LAMP的动静分离部署方式。所谓LAMP?LAMP架构是目前最成熟的企业网站应用模式之一,指的是协同
千家信息网最后更新 2024年11月27日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




0