部署LAMP动静分离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署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/1d2ETH7xgobxh23G7FYYvKw
    提取码: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.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     #最大空闲进程
    #修改完成后,保存退出即可
    [root@php /]# service php-fpm restart              # 重启PHP使配置生效
    Gracefully shutting down php-fpm . done
    Starting 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.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保存退出了
    [root@apache /]# vim /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf              # 编辑虚拟主机配置文件
    #虚拟主机配置如下
    <VirtualHost *:80>
    ServerAdmin 848369866@qq.com
    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>
    [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/需要与<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服务器中编辑这两个测试文件 
    [root@php /]# cat /var/www/html/index.php 
    <?php
    phpinfo();
    ?>
    [root@php /]# cat /var/www/html/test.php 
    <?php
    $link=mysqli_connect(‘192.168.171.135‘,‘zyz‘,‘pwd@123‘);
    if($link) echo "恭喜你,数据库连接成功!!!"; else echo "connect shibai";
    mysqli_close($link);
    ?>

    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‘;               # 授权用户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 命令进行检测。

    [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 -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压力测试:

    [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 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的源码包
[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:         20131106
Zend Module Api No:      20131226
Zend 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=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 =""
#写完后保存退出
[root@php /]# service php-fpm restart 
Gracefully shutting down php-fpm . done
Starting 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 -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动态页面测试:

[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 restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

配置bbs(使用之前用来测试链接数据库的用户给bbs论坛使用即可)
访问www.test.com/bbs/install

技术图片

技术图片
技术图片
技术图片
技术图片

以上是关于部署LAMP动静分离的主要内容,如果未能解决你的问题,请参考以下文章

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

求大神指导Centos7 源码编译安装Nginx+PHP 配置动静分离

HAProxy+LAMP动静分离

Nginx+lamp构建动静分离项目

Nginx+Apache 动静分离

Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第一部分(LAMP)