lb5645284 发表于 2018-11-18 13:27:53

深度剖析apache 2.4web服务器(史上最全)

博主QQ:819594300
博客地址:http://zpf666.blog.51cto.com/
有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!一、   安装apache2.4.23
  新版本的httpd-2.4新增以下特性;
  ①新增模块;
  mod_proxy_fcgi(可提供fcgi代理)
  mod_ratelimit(限制用户带宽)
  mod_request(请求模块,对请求做过滤)
  mod_remoteip(匹配客户端的IP地址)
  ②对于基于IP的访问控制做了修改,不再支持allow,deny,order机制,而是统一使用require进行。
  ③还新增以下几条新特性;
  1、MPM支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能;
  --enable-mpms-shared=all--with-mpm=event
  2、支持event
  3、支持异步读写
  4、在每个模块及每个目录上指定日志级别
  5、增强版的表达式分析器
  6、每请求配置:,
  7、毫秒级别的keepalivetimeout
  8、基于FQDN的虚拟主机不再需要NameVirtualHost指令
  9、支持使用自定义变量
  

  安装环境:操作系统:Centos7.2,关闭selinux
  检查httpd包是否安装,如果安装了要则卸载

  上图所示没有安装过httpd,这下面开始安装工作:
  安装apache2.4.23
  需要下载下列所示的几个源码包:
  httpd-2.4.23.tar.gz
  apr-1.5.2.tar.gz
  apr-util-1.5.4.tar.gz
  zlib-1.2.8.tar.gz
  pcre-8.39.tar.gz
  注:apr(Apache Portable Runtime)Apache可移植运行库,它是一个对操作系统调用的抽象库,用来实现Apache内部组件对操作系统的使用,提高系统的可移植性。
  安装apr和apr-util:


  安装zlib:
\
  安装pcre:

  安装openssl:
  说明:安装apache2.4.23时会提示openssl版本过低,是因为centos7自带的版本openssl-1.0.1e,我们需要自己去下载openssl。
  下载openssl:
  #wgethttps://www.openssl.org/source/openssl-1.0.1u.tar.gz
  下面开始安装openssl:


  安装apache2.4.23:

  相关参数解释如下:
  --enable-so   支持动态共享模块即打开DSO支持
  --enable-rewrite支持url重写
  --enable-ssl   支持ssl
  --with-ssl=/usr/local/openssl    指定ssl安装位置
  --enable-cgi   启用cgi
  --enable-cgid:MPM   使用的是event或worker要启用cgid
  --enable-modules=most明确指明要静态编译到httpd二进制文件的模块为空格分隔的模块名列表、all或者mostall表示包含所有模块most表示包含大部分常用模块
  --enable-mods-shared=most   明确指明要以DSO方式编译的模块为空格分隔的模块名列表、all或者mostall表示包含所有模 块most表示包含大部分模块
  --enable-mpms-shared=all   启用MPM所有支持的模式这样event、worker、prefork就会以模块化的方式安装要用哪个就在 httpd.conf 里配置就好了。
  --with-mpm=event       指定启用的mpm模式默认使用enevt模式在apache的早期版本2.0默认prefork,2.2版本是worker2.4版本是event.
  --with-pcre=/usr/local/pcre      支持pcre
  --with-z=/usr/local/zlib      使用zlib压缩库
  --with-apr=/usr/local/apr   指定apr的安装路径
  --with-apr-util=/usr/local/apr-util   指定apr-util的安装路径
  --enable-expires      激活彧通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容即对网站图片、js、css等内容提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一。
  --enable-deflate     提供对内容的压缩传输编码支持一般是html、js、css等内容的站点。使用此参数会打打提高传输速度提升访问者访问的体验。在生产环境中这是apache调优的一个重要选项之一。
  优化http程序执行路径:

  修改配置文件httpd.conf,设置其中的ServerName值:
  例如:ServerName   www.benet.com


  开启apache服务器:

  设置开机后自动启动:

  编辑 /etc/init.d/httpd 文件,在首行 #!/bin/sh 下面加入两行:


  将 Apache 加入开机自动启动:

  启动编译好的 Apache 2.4.23:


  (注意:如果状态不是active(running),则重启一下httpd服务即可)
  以下是用service的方式开启httpd服务。

  查看一下httpd状态:

  下面解决这个问题:


  lynx安装上了,再次查看httpd状态:

  上图报错说:请求的URL /服务器状态这个服务器上不存在。(即server-status不存在),下面继续解决问题。





  返回了状态码是404:意思是请求被拒绝








  这样就看可以看到httpd的状态了。
  客户端测试访问(注意防火墙):
  先开启httpd服务例外:

  在一台客户机上访问测试:

  上图显示访问成功!
  二、   Apache的优化配置:
  apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰。各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript文件、css文件等),它决定了apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利
  其次是硬盘的速度,静态站点尤为突出,apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点也要不断的加载web程序(php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高apache的性能是有积极意义的。
  最后是cpu和网络,cpu影响的是web程序执行速度,网络影响流量大小。   
  1、apache的工作模式:
  ApacheHTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做“多进程处理模块”(Multi-Processing Module,MPM),也叫做工作模式。
  Prefork模式(一个非线程型的):
  其主要工作方式是:当Apache服务器启动后,mpm_prefork模块会预先创建多个子进程(默认为5个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。
  由于在mpm_prefork模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork在效率上要比Worker要高,但是内存使用大得多不擅长处理高并发的场景。
  Apache在prefork工作模式下影响性能的重要参数说明:


  每个配置项解释如下:
  
  StartServers            5
  #apache启动时候默认开始的子进程数
  MinSpareServers          5
  #最小的闲置子进程数
  MaxSpareServers      10
  #最大的闲置子进程数
  MaxRequestWorkers      250
  #MaxRequestWorkers设置了允许同时的最大接入请求数量。任何超过MaxRequestWorkers限制的请求将进入等候队列,在apache2.3.1以前的版本MaxRequestWorkers被称为MaxClients,旧的名字仍旧被支持。
  MaxConnectionsPerChild 500
  #设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。在Apache2.3.9之前称之为MaxRequestsPerChild。
  
  注1:MaxRequestWorkers是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。如果请求总数已达到这个值(可通过ps-ef |grep http | wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
  注2:prefork 控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
  (建议StartServers的值和MinSpareServers的值相等)
  注3:ServerLimit和MaxClients(MaxRequestWorkers)有什么区别呢?
  是因为在apache1时代,控制最大进程数只有MaxClients这个参数,并且这个参数最大值为256,并且是写死了的,试图设置为超过256是无效的,这是由于apache1时代的服务器硬件限制的。但是apache2时代由于服务器硬件的升级,硬件已经不再是限制,所以使用ServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值要不小于MaxClients。
  注4:查看Apache加载的模块

  (static的是静态模块,shared的是动态模块)


  (同上也有static和shared之分)
  或

  (只能查看编译到二进制文件中的静态模块)
  注5:如何查看Apache的工作模式呢?可以使用httpd -V 命令查看,另外使用httpd -l 也可以查看到(一般都用httpd -V)

  注6:如何修改prefork参数和启用prefork模式(httpd默认的模式是event模式)
  ①通过httpd-mpm.conf定义模块的配置信息


  ②修改httpd的主配置文件



  ③重启httpd服务,让修改的配置生效

  注意:在实际生产环境中,建议使用优雅启动,因为没有”servicehttpdreload”,等效作用的是“servicehttpdgraceful”

  或

  ④验证模式是否更改为prefork

  Worker模式(多线程多进程):
  和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)
  总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。
  Apache在worker工作模式下影响性能的重要参数说明:


  每个配置项解释如下:
  
  StartServers             3
  #apache启动时候默认开始的子进程数
  MinSpareThreads      75
  #最小空闲数量的工作线程
  MaxSpareThreads      250
  #最大空闲数量的工作线程
  ThreadsPerChild       25
  #每个子进程产生的线程数量
  MaxRequestWorkers      400
  #与prefork模式相同
  MaxConnectionsPerChild0
  #与prefork模式相同
  
  注1:Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;
  而MaxRequestWorkers 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程
  MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节 。
  注2:ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。
  注3:Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(系统配置的最大进程数量,最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。
  注4:进程与线程的区别
  线程是指进程内的一个执行单元,也是进程内的可调度实体。
  一个程序至少有一个进程,一个进程至少有一个线程.
  线程的划分尺度小于进程,使得多线程程序的并发性高。
  另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
  线程在执行过程中与进程还是有区别的,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
  进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
  线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
  一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
  总结进程与线程的区别:
  (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
  (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
  (3)线程是处理器调度的基本单位,但进程不是.
  (4)二者均可并发执行.
  进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
  进程和线程的区别在于:
  简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
  线程的划分尺度小于进程,使得多线程程序的并发性高。
  另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
  Event模式:
  这是Apache最新的工作模式,是worker模式的变种(升级版),它把服务进程从连接中分离出来,与worker模式不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event模式不能很好的支持https的访问(HTTP认证相关的问题)。
  (prefork、worker和event三种模式之间的转换,请参考prefork模式的注6,转换方法都是一样的。)
  2、apache配置参数

  1)KeepAlive On/Off
(默认是on)
  KeepAlive指的是保持连接活跃,换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive设为On。
  2)KeepAliveTimeout number
(默认是5秒)
  如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔,一般设置为3-5秒。
  3)MaxKeepAliveRequests 100   
(默认是100次)
  一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
  4)HostnameLookups on | off | double
(默认是off,建议保持off)
  如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。
  如果为了安全,建议使用double;为了加快访问速度,建议使用off。
  域名查找开启这个会增加apache的负担, 减慢访问速度建议关闭
  5)timeout 5
  推荐5 这个是 apache接受请求或者发出相应的时间超过这个时间断开
(默认60秒,建议调整为5秒)
  注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf设置并在httpd.conf文件中通过include选项引用


  MPM这个比较关键是影响并发效率的主要因素:

  1)StartServers      10
    设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以一般没有必要调整这个参数。
  2)MinSpareServers   10
    设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
  3)MaxSpareThreads   75
    设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。
  4)ServerLimit       2000
    服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
  5)MaxClients/MaxRequestWorkers         256
    用于客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
  6)MaxRequestsPerChild/MaxConnectionsPerChild 0
    设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100。所以一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试。
  注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf设置并在httpd.conf文件中通过include选项引用

  3、开启apache的Gzip(deflate)功能
  gzip可以极大的加速网站,有时压缩比率高到80%,最少都有40%以上,还是相当不错的。在Apache2之后的版本,模块名不叫gzip,而叫mod_deflate
  未使用Gzip:

  开启使用Gzip:

  如果要开启moddeflate的话,一定要打开下面二个模块:
  LoadModule deflate_module modules/mod_deflate.so
  LoadModule headers_module modules/mod_headers.so
  设置压缩比率,取值范围在 1(最低) 到9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源。
  mod_deflate模块检查及安装:

  看到到没有有可能是没有启动,去httpd.conf配置文件看一下是否有deflate_module这个模块。


  现在两个必须有的模块都有了。
  如果没有安装,则按下面几种方法解决:
  a.编译时安装方法
   编译的时候跟上--enable-deflate即可实现安装
  b.DSO方式安装
  ①先切到apache源码包mod_deflate所在的目录下

  ②以DSO的方式编译安装到apache中


  注意:安装mod_deflate模块需要加参数“-I”,除此之外的其他的模块都不需要“-I”。
  ③检查mod_deflate和mod_headers是否安装,成功安装这里会显示出该文件

  ④成功安装完毕后,要优雅启动httpd服务

  apxs命令参数说明:
  -c 此选项表示需要执行编译操作。
  -i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
  -a 此选项自动增加一个LoadModule行到httpd.conf文件中,以启用此模块,或者,如果此行已经存在,则启用之。
  -I 此选项直接传递到给连接命令,用于增加自定义的库文件。
  额外说明个参数:
  -A 与 -a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
  注:如果的其他httpd版本实验环境下(如httpd2.2.17)
  #/usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_deflate.c
  #/usr/local/http2.2/bin/apxs -c -i -a/root/httpd-2.2.17/modules/metadata/mod_headers.c
  如果重启的时候出现错误:
  引用出现的错误:
  Cannotload /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so:undefined symbol: inflateEnd
  则解决办法如下:
  需要在
  LoadModuledeflate_modulemodules/mod_deflate.so 的前面加载zlib.so
  这里需要注意的是LoadModule deflate_module需要放在LoadModulephp5_module之后
  说明如下:
  LoadFile/usr/lib/libz.so(x64系统中该库文件位于/usr/lib64目录下,可以软链接到/usr/lib下。注:如果在本实验环境下(即httpd2.4.24)ln -s/usr/local/zlib/lib/libz.so/usr/lib/)
  LoadModuledeflate_module   modules/mod_deflate.so
  重新启动httpd:
  #/usr/local/http2.4.23/bin/apachectl graceful #优雅启动httpd服务
  附:安装一个没有模块怎么安装?

  修改Apache配置文件开启gzip压缩传输:
  ①httpd.conf修改、增加配置参数:


  说明:打开httpd.conf后,先将上面两行配置前面的#号去掉,这样apache就会启用这两个模块,其中mod_deflate是压缩模块,就是对要传输到客户端的代码进行gzip压缩;mod_headers模块的作用是告诉浏览器页面使用了gzip压缩,如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载,而无法正常显示。
  ②在httpd.conf中加入以下代码,可以加到任何空白地方,不了解apache的话,如果担心加错地方,就放到http.conf文件的最后一行。
  注意:在添加代码前最好先查一查要添加的那两个代码,一定保证是存在的。

  每行意思解释如下:
  
        DeflateCompressionLevel6   #压缩程度的等级,预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡。
        SetOutputFilterDEFLATE    #设置输出过滤器,对输出启用压缩,必须的,就像一个开关一样,告诉apache对传输到浏览器的内容进行压缩
        #AddOutputFilterByTypeDEFLATE text/html text/plain text/xml application/x-javascriptapplication/x-httpd-php
         #AddOutputFilterByType DEFLATE image/*
         AddOutputFilterByType DEFLATE text/*   #设置对文件是文本的内容进行压缩,例如text/htmltext/css text/plain等.
        AddOutputFilterByTypeDEFLATE application/ms* application/vnd* application/postscriptapplication/javascript application/x-javascript          #对javascript文件进行压缩
        AddOutputFilterByTypeDEFLATE application/x-httpd-php application/x-httpd-fastphp#对php类型的文件进行压缩.
        SetEnvIfNoCaseRequest_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary#设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩。注:?:表示不会捕获 ( )里内容了
        SetEnvIfNoCaseRequest_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
  #同上,就是设置不对exe,tgz,gz等的文件进行压缩
        SetEnvIfNoCaseRequest_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #同上就是设置不对pdf,avi,mp3等的文件进行压缩
  
  设置日志输出!

  每行意思解释如下:
  DeflateFilterNoteInput input_info#声明输入流的byte数量
  DeflateFilterNoteOutput output_info#声明输出流的byte数量
  DeflateFilterNoteRatio ratio_info#声明压缩的百分比
  LogFormat'"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate#声明日志格式
  CustomLoglogs/deflate_log.log deflate
  修改完成后保存退出并重启httpd服务(优雅启动):

  使用谷歌浏览器测试访问,如下图显示结果:(提示:在访问测试页之前按F12键):
  
  在index.html里面加点数据,增大它的文件大小,另外再传一个测试图片:

  正式开始测试:
  在谷歌浏览器,按F12:


  查看日志:



  注:图片是不需要启用GZip压缩的,,如果不设置SetEnvIfNoCaseRequest_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary,则从GZip检测结果来看,压缩后的图片体积竟然大过原体积!这就解释了为什么图片不用启用GZip压缩的原因了!(其实有些图片压缩还是会变小的,大多数反而压缩了会变大)
        可以检测了几个门户网站的图片,还有Google、baidu的图片,统统都没有启用图片GZip压缩,只是启用了html、css、js等文件的GZip压缩,这就更加说明了GZip压缩不适用于图片上。另外,除了图片之外,flash的swf文件也是不用启用GZip压缩的。
  4、配置mod_expires模块
  这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。
  这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
  未启用expire的效果:

  启用expire缓存:
  ①mod_expires的安装配置:
  启用expires_module

  ②添加Expires配置规则

  ③优雅启动服务

  ④验证

  ExpiresDefault 和ExpiresByType 指令同样能够用易懂的语法格式进行定义:
  ExpiresDefault" {}"
  ExpiresByTypetype/encoding " {}"
  其中是下列之一:

[*]  access
[*]  now (等价于'access')
[*]  modification
  plus关键字是可选的。必须是整数,是下列之一:

[*]  years
[*]  months
[*]  weeks
[*]  days
[*]  hours
[*]  minutes
[*]  seconds
  例如,下列3个指令都表示文档默认的有效期是一个月:
  ExpiresDefault"access plus 1 month"
  ExpiresDefault"access plus 4 weeks"
  ExpiresDefault"access plus 30 days"
  有效期可以通过增加""子句进一步调整:
  ExpiresByTypetext/html "access plus 1 month 15 days 2 hours"
  ExpiresByTypeimage/gif "modification plus 5 hours 3 minutes"
  注意,如果你使用基于最后修改日期的设置,"Expires:"头将不会 被添加到那些并非来自于磁盘文件的内容。这是因为这些内容并不存在"最后修改时间"的属性。
  
  #GIF有效期为1个月(秒数)
  ExpiresByTypeimage/gif A2592000
  ExpiresByTypeimage/jpeg A2592000
  ExpiresByTypeimage/png A2592000
  ExpiresByTypeimage/x-icon A2592000
  ExpiresByTypeapplication/x-javascript A604800
  ExpiresByTypetext/plain A604800
  #HTML文档的有效期是最后修改时刻后的一星期
  ExpiresByTypetext/html M604800
  
  "M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。后面的时间则以秒计算。
  有关 Apache Expires Module 的介绍,可以参阅其官方文档:
  http://httpd.apache.org/docs/2.4/mod/mod_expires.html
  5、Apache禁止目录遍历
  将Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html文件时,就显示目录结构。
  我们先来看看什么是目录遍历:


  遍历目录就是把/usr/local/http-2.4.23/htdocs目录下的文件和子目录全是显示出来,这样做是很不安全的。




  6、apache隐藏版本信息
  测试默认 apache 的状态信息:

  ①主配置中启用httpd-default.conf
  去掉484行的注释“#”:

https://s1.51cto.com/wyfs02/M02/92/FB/wKioL1kGk-HSrlOrAADErOgRvJU520.jpg
  ②修改httpd-default.conf
https://s1.51cto.com/wyfs02/M01/92/FD/wKiom1kGk-Hg9ffYAADMDmkgMdI802.jpg
  改成下图所示的配置:
https://s1.51cto.com/wyfs02/M01/92/FB/wKioL1kGk-Hi9nBCAAI-p5Xm05I099.jpg
  ③优雅启动httpd服务
https://s1.51cto.com/wyfs02/M00/92/FD/wKiom1kGk-Lwyw7xAABv77rIB_E344.jpg
  ④测试隐藏版本号后 apache 的状态信息(还是能看见是apache,但是apache的版本看不见了)
https://s1.51cto.com/wyfs02/M02/92/FD/wKiom1kGk-LjfD07AAEsRg-ODVw776.jpg
  ⑤如果需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下include目录下的ap_release.h文件
  #define AP_SERVER_BASEVENDOR "Apache Software Foundation"#服务的供应商名称
  #define AP_SERVER_BASEPROJECT "Apache HTTPServer"#服务的项目名称
  #define AP_SERVER_BASEPRODUCT "Apache"        #服务的产品名
  #define AP_SERVER_MAJORVERSION_NUMBER 2#主要版本号
  #define AP_SERVER_MINORVERSION_NUMBER 4#小版本号
  #define AP_SERVER_PATCHLEVEL_NUMBER 23 #补丁级别
  #define AP_SERVER_DEVBUILD_BOOLEAN0 #
  上述列出的行,已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,对方就彻底不知道你的版本号了。
  7、Apache日志切割
  为什么要分割日志?
  随着网站的访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。
  方法1:使用rotatelogs(apache自带的工具)每隔一天记录一个日志
  编辑Apache的主配置文件,更改内容如下:
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGk-Pzb9X9AACcYzZtYhA216.jpg
  注释掉如下两行:
https://s5.51cto.com/wyfs02/M01/92/FD/wKiom1kGk-OwIhi9AABFMezpvC0969.jpg
https://s5.51cto.com/wyfs02/M02/92/FB/wKioL1kGk-Pi9u1tAABVVOjObb0966.jpg
  然后再添加如下两行:
https://s5.51cto.com/wyfs02/M01/92/FB/wKioL1kGk-Pj1OlHAADSqwpJ8Xo646.jpg
  截图中内容如下:
  ErrorLog"|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log86400"
  CustomLog"|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log86400" combined
  注:其中86400为轮转的时间单位为秒
  验证:查看logs目录下的日志文件
https://s5.51cto.com/wyfs02/M00/92/FD/wKiom1kGk-SxRENEAABZqf242Ug490.jpg
https://s2.51cto.com/wyfs02/M00/92/FB/wKioL1kGk-SD2PzTAAC3hK7Jbg4751.jpg
https://s2.51cto.com/wyfs02/M02/92/FD/wKiom1kGk-SQNcLjAAFD_GB0Hu4405.jpg
  注:优雅启动后会立即产生error日志,但是要一台客户机访问一下这台web服务器,才会产生access日志。
  说明:由于apache自带的日志轮询工具rotatelogs,据说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。
  方法2、使用 cronolog 为每一天建立一个新的日志
  安装cronolog程序:
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGk-TBmegSAAC0RuQd1O4400.jpg
  同上一种方法所示,注释掉276和305两行:
https://s5.51cto.com/wyfs02/M01/92/FD/wKiom1kGk-WBVmpjAABCjssXUSk466.jpg
https://s5.51cto.com/wyfs02/M00/92/FD/wKiom1kGk-WQ-BFfAABOmNxdFsU837.jpg
https://s5.51cto.com/wyfs02/M00/92/FB/wKioL1kGk-XDbL3cAACsMb6N-Cc137.jpg
  添加如下两行:
https://s5.51cto.com/wyfs02/M01/92/FD/wKiom1kGk-WDCgd0AAGEr21WJVA229.jpg
  说明:如果Apache中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件名改成不同的名字。
  扩展:
  ①这个保证了每天一个文件夹文件夹下每个小时产生一个log
https://s4.51cto.com/wyfs02/M01/92/FB/wKioL1kGk-by8M4AAAEGcm5eWqo701.jpg
https://s1.51cto.com/wyfs02/M01/92/FB/wKioL1kGk-aysxjDAAGHGTPrMaM264.jpg
  ②按天轮询(生产环境常见用法,推荐使用):
https://s4.51cto.com/wyfs02/M02/92/FD/wKiom1kGk-eTxkMIAAELeFvmwlc580.jpg
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGk-eDF0PQAAG_TWg0HSY689.jpg
  ③按小时轮询(生产环境较常见用法):
https://s4.51cto.com/wyfs02/M00/92/FD/wKiom1kGk-fDfqclAAErG2p9vtg012.jpg
https://s4.51cto.com/wyfs02/M00/92/FB/wKioL1kGk-iQgjXDAAHPtbWE6ok910.jpg
  注意:第一种方法和第二种方法这两个管道日志文件程序(即“|”)还有一点不同之处是使用cronolog 时如果日志是放在某个不存在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建,这一点要特别注意。
  7、配置防盗链
  说明:有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。
  举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源;
  解决这个问题的方法是配置下防盗链,让外来的盗不了链。
  方法1:Apache 防盗链的第一种实现方法,可以用rewrite实现。
  首先要确认 Apache 的rewrite module可用:
https://s4.51cto.com/wyfs02/M02/92/FD/wKiom1kGk-jji1m1AACEvX0I8Jk632.jpg
  从上图可以看出没有rewrite module模块,有两种原因,一是没有下载安装,二就是没有启用,我们先去看看httpd主配置文件里面有没有rewrite module这块模块,是不是没启动,如果有启动即可。
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGk-jCqbUaAACgESJWEh4564.jpg
https://s4.51cto.com/wyfs02/M00/92/FD/wKiom1kGk-mx0W3mAABrIESC0o4300.jpg
  (去掉158行的注释“#”即可)
https://s4.51cto.com/wyfs02/M00/92/FB/wKioL1kGk-nQKhuVAAEDqrUsg9I916.jpg
  然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
  https://s5.51cto.com/wyfs02/M00/92/FF/wKiom1kGo5jD1Lo-AAAv0yf2xac429.png
https://s4.51cto.com/wyfs02/M01/92/FD/wKiom1kGk-mRBnH9AACtPZWNUk0377.jpg
  截图中内容如下:
  RewriteEngineOn
  RewriteCond%{HTTP_REFERER} !^$
  RewriteCond%{HTTP_REFERER} !benet\.com/.*$
  RewriteCond%{HTTP_REFERER} !www\.benet\.com/.*$
  RewriteRule.*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png
  注:相关选项的解释
  1.RewriteEngine On #启用rewrite,要想rewrite起作用,必须要写上
  2.RewriteCond test-string condPattern #写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。
  3.RewriteRule Pattern Substitution #规则
  4.%{HTTP_REFERER}:服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
  5.[ NC]指的是不区分大小写,强制重定向 redirect
  6.字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
  防盗链配置的说明:
  1.红色部分: 表示自己的信任站点。对我的站点来说,设置为 http://www.benet.com 和 http://benet.com
  2.绿色部分: 要保护文件的扩展名(以|分开)。以这些为扩展名的文件,必须通过红色标注的网址引用,才可以访问。
  3.蓝色部分: 定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的about/ nolink.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:RewriteRule .*\.(gif|jpg|png)$ -
https://s4.51cto.com/wyfs02/M01/92/FD/wKioL1kGpCjiJfD_AAAPGEbYc3Q785.png
  注: (强制URL为被禁止的forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
  注:
  RewriteCond%{HTTP_REFERER}!^$
  上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。
  RewriteCond %{HTTP_REFERER} !benet\.com/.*$
  RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$
  设置允许访问的HTTP来源,包括网站自身。
  RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png
  将不满足referer条件的访问重定向至nolink.png。nolink.png位于允许“盗链”的目录about中,要相当注意,不然,警告信息和图片将无法在对方网站上显示。
  注意:测试时要清除济浏览器缓存
  现在开始测试:
  ①在httpd主配置文件末尾新加入了那五行,保存退出,要优雅启动
  

https://s4.51cto.com/wyfs02/M01/92/FB/wKioL1kGlBew9fsIAADJImaAYek083.jpg
  ②准备两张测试图片
https://s5.51cto.com/wyfs02/M01/92/FB/wKioL1kGlBiAQTh7AAEYEXxuMB0933.jpg
  ③在httpdB的首页上盗链(即做超链接)httpdA网站的paoche.jpg资源
https://s5.51cto.com/wyfs02/M02/92/FD/wKiom1kGlBjhLuntAAC297jdcHc510.jpg
  ④修改httpdB和客户机的hosts文件
https://s5.51cto.com/wyfs02/M02/92/FD/wKiom1kGlBiwSRs9AADAVwy4h98331.jpg
https://s5.51cto.com/wyfs02/M02/92/FB/wKioL1kGlBjTXGsIAABA0R9mPbQ911.jpg
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGlBnhdA6UAABPdXoggFY163.jpg
  ⑤在一台客户机上进行测试
https://s4.51cto.com/wyfs02/M00/92/FD/wKiom1kGlBnwplHxAACqJqVBf0Q404.jpg
https://s2.51cto.com/wyfs02/M00/92/FB/wKioL1kGlBnDpUo9AAC32VD2noQ299.jpg
  实验成功了,需要注意的是,如果是在实验环境下,不要忘记开启两台web服务器的80端口例外。
  方法2:通过判断浏览器头信息来阻止某些请求,即利用SetEnvIfNoCase和access。
  说明:这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。
  语法: SetEnvIfNoCase attribute regex [!]env-variable[=value][[!]env-variable[=value]] ...
  SetEnvIfNoCase当满足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。
  注:Referer :指明了请求当前资源原始资源的URL,使用referer是可以防盗链。
  然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:
https://s4.51cto.com/wyfs02/M01/92/FD/wKiom1kGlBrAsY1SAAFFpDVFTRM956.jpg
https://s2.51cto.com/wyfs02/M00/92/FD/wKiom1kGlBqRtLDMAAEkO43xJ64810.jpg
  截图中内容如下:
  SetEnvIfNoCaseReferer "^$" local_ref
  SetEnvIfNoCaseReferer "www.benet.com/.*$" local_ref
  SetEnvIfNoCaseReferer "benet.com/.*$" local_ref
  
  # 2.4版本以下的,接着新添加如下内容:
  方法一:
      Order Deny,Allow
      Allow from env=local_ref
      Deny from all
  方法二:
      Order Allow,Deny
Allow from env=local_ref
  #2.4版本以上,接着新添加如下内容:
https://s2.51cto.com/wyfs02/M01/92/FB/wKioL1kGlBqCF4V7AACCHCRis1E613.jpg
  截图中内容如下:
Require alldenied
      Require env local_ref
  
  下面开始测试:
  ①修改完了httpd主配置文件,要优雅启动:
https://s2.51cto.com/wyfs02/M00/92/FB/wKioL1kGlBrBVTsnAAD0p2yV0Kg453.jpg
  ②在一台客户机上测试(先清除客户机的浏览器缓存,再测试)
https://s2.51cto.com/wyfs02/M01/92/FD/wKiom1kGlBvx6Na1AACf9itIcx0703.jpg
https://s2.51cto.com/wyfs02/M02/92/FD/wKiom1kGlBuBbHFyAAH7USF8bac523.jpg
  三、fcgi模式编译安装LAMP+xcache
  php的工作模式:
  php在lamp环境下共有三种工作模式:CGI模式、apache模块、FastCGI模式。CGI模式下运行PHP,性能不是很好。作为apache的模块方式运行,在以前的课程中编译安装lamp已经介绍过了。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服务器。
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGlBzSs1m7AAJl42JPAt4846.jpg
  编译环境及各软件版本:
  

  Linux
  Web服务器
  Php
  Mysql数据库
  xcache
  Centos7.2
  Httpd-2.4.23
  php-5.4.26
  Mysql5.7
  xcache-3.1.0
  主机规划
  至少3台主机,操作系统都是centos7.2.网段在192.168.1.0,
   网关192.168.1.1
  分配如下:
  1台httpd服务器(192.168.1.7)
  1台php服务器(192.168.1.8)
  1台mysql服务器(192.168.1.9)
  编译安装LAMP:

[*]  编译安装apache(请参考前面apache的安装)
[*]  编译安装mysql(请参考mysql安装)
[*]  FastCGI方式安装php
  下面安装php服务器:
  1、解决依赖关系
https://s3.51cto.com/wyfs02/M01/92/FB/wKioL1kGlByxXNd0AACWLyzN1Gc663.jpg
  安装libmcrypt:
https://s3.51cto.com/wyfs02/M00/92/FD/wKiom1kGlByQJJQcAADkY0PK07g130.jpg
  2、编译安装php
https://s3.51cto.com/wyfs02/M02/92/FD/wKiom1kGlB3B_JlUAAJYl0Jjkz8577.jpg
  上面截图的内容如下:
  ./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选项
  说明:如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。
  3、提供php配置文件
https://s4.51cto.com/wyfs02/M00/92/FB/wKioL1kGlB2g7l7wAAChd3an_bA753.jpg
  4、为php-fpm提供脚本
https://s3.51cto.com/wyfs02/M01/92/FD/wKiom1kGlB2RuTtDAACUiNrqlYU836.jpg
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGlB6CfTZ0AAHKQdF-9LY214.jpg
  5、提供php-fpm配置文件并编辑
https://s4.51cto.com/wyfs02/M01/92/FB/wKioL1kGlB6RDmPQAADh-NChxx0656.jpg
https://s3.51cto.com/wyfs02/M02/92/FD/wKiom1kGlB6DDNjnAABEEvT3Jyw191.jpg
https://s3.51cto.com/wyfs02/M00/92/FD/wKiom1kGlB-S-0FzAABHgyTUEhg413.jpg
https://s3.51cto.com/wyfs02/M02/92/FB/wKioL1kGlB-CbxOPAABEwynjtNk515.jpg
https://s5.51cto.com/wyfs02/M00/92/FB/wKioL1kGlB-Bv7WWAAA7us6QvRI977.jpg
https://s3.51cto.com/wyfs02/M00/92/FD/wKiom1kGlCCxZcbmAABSBrp3E-w805.jpg
https://s5.51cto.com/wyfs02/M00/92/FB/wKioL1kGlCCRoGdYAABV5LUgQuE646.jpg
  启动php-fpm服务:
https://s5.51cto.com/wyfs02/M01/92/FD/wKiom1kGlCDQiHw-AADhsJCWOsE132.jpg
https://s3.51cto.com/wyfs02/M01/92/FD/wKiom1kGlCGiK3dXAAEjhZoX4No440.jpg
  在该主机上新建虚拟主机目录用于存放网页文件:
https://s3.51cto.com/wyfs02/M01/92/FB/wKioL1kGlCGxcl8uAADkxiXVbhA333.jpg
  至此php安装配置完毕,下面配置apache通过fastcgi协议调用php。
  6、配置apache(切换到apache主机上操作)
  说明:在Apache2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此,这两个模块都要加载。
https://s3.51cto.com/wyfs02/M02/92/FD/wKiom1kGlEnxyf2gAAJy5YC8XAs460.jpg
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGlErD_CT7AAE2KcO0-NI594.jpg
  下面这两行去掉注释“#”即可:
https://s1.51cto.com/wyfs02/M02/92/FB/wKioL1kGlEqAePL9AAB2DSYNNys103.jpg
https://s4.51cto.com/wyfs02/M00/92/FD/wKiom1kGlErgDJH2AABVmwvDpYQ030.jpg
  建立一个目录作为虚拟主机的家目录:
https://s2.51cto.com/wyfs02/M00/92/FB/wKioL1kGlEvQh9e6AADrWvPYjso905.jpg
  编辑主配置文件httpd.conf,开启虚拟主机:
https://s2.51cto.com/wyfs02/M01/92/FD/wKiom1kGlEvS2uiJAAEknZh5czg030.jpg
  去掉下面这一行的注释“#”:
https://s2.51cto.com/wyfs02/M02/92/FD/wKiom1kGlEuzxoTBAABqfZRlIYY282.jpg
  同时定位 AddType;添加下面两行:让apache能识别php格式的页面:
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGlEziRNwZAACmV185-ek483.jpg
  并且定位至DirectoryIndex:支持php格式的主页(添加index.php(最好添加在最前面)
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGlEzzpwUWAABzKs60PC0678.jpg
  配置虚拟主机支持使用fcgi:
https://s1.51cto.com/wyfs02/M01/92/FD/wKiom1kGlEzB23nQAAFlZ9JO-q0270.jpg
https://s2.51cto.com/wyfs02/M01/92/FB/wKioL1kGlE2who7yAAIJJDg-uzY700.jpg
  截图的内容如下:
  
      ServerAdmin webmaster@benet.com
      DocumentRoot "/var/www/benet"
      ServerName www.benet.com
      ServerAlias benet.com
      ErrorLog"logs/benet.com-error_log"
      CustomLog"logs/benet.com-access_log" common
      ProxyRequests Off
      ProxyPassMatch ^/(.*\.php(/.*)?)$fcgi://192.168.1.8:9000/var/www/benet/$1
      #
      #ProxyPassfcgi://192.168.1.8:9000/var/www/benet
      #
     
      Options FollowSymLinks
      AllowOverride None
      Require all granted
     
  
  注意:本配置文件下面的那个虚拟主机实例删除掉。
  上面的配置项解释如下:
  ProxyRequests off       #关闭正向代理
  ProxyPassMatch         #把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://192.168.1.8:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。
  特别注意的是,红色字体部分需要与中的 DocumentRoot 后的路径一致,ProxyPassMatch只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,^/(.*\.php(/.*)?)$
  从网站(虚拟主机的根目录开始,匹配任何以 .php 结尾,或者在 .php 之后紧跟一个 / 再跟别的内容的路径。
  ^(caret) 和 $ (dollar)标志要匹配的路径的开始和结束
  ()括号里的内容可以用 $1 来表示,以方便后面引用它。
  fcgi://192.168.1.81:9000通过 mod_proxy_fcgi 来转发的代理,使用 fastCGI 协议,转到 PHP-FPM 监听的端口。
  /path/to/your/documentroot/
  非常重要!必须与虚拟主机的路径匹配,且必须是对应 php 文件在操作系统中的绝对路径。否则会找不到文件。
  $1可以从原始请求扩展成整个请求路径的变量,这里指代前面( ) 里面匹配的那个路径(uri)
  补充:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。
  优雅启动httpd服务:
https://s5.51cto.com/wyfs02/M02/92/FD/wKiom1kGlE2Dvq2RAADchpKxJVs259.jpg
  下面测试LAMP环境:
  先在mysql主机上创建用于php服务器连接的mysql账户:
https://s2.51cto.com/wyfs02/M00/92/FD/wKiom1kGlE7SHIzyAADg8zYl5pA114.jpg
  Mysql服务器防火墙上开启3306端口例外:
https://s2.51cto.com/wyfs02/M00/92/FB/wKioL1kGlE6x4_e3AAEMwD19Fpo284.jpg
  在php服务器上的/var/www/benet目录下创建.php的测试页:
https://s3.51cto.com/wyfs02/M02/92/FB/wKioL1kGlE_i__XvAAEk5mZQIzs317.jpg
https://s3.51cto.com/wyfs02/M01/92/FD/wKiom1kGlE_wM9-cAAFqj4G-XQM922.jpg
  不要忘记web服务器也要开启80端口例外:
https://s5.51cto.com/wyfs02/M00/92/FD/wKiom1kGlFCAG37VAAEzoCo-pHA637.jpg
  在客户机上访问php测试页:
  现在客户机的hosts文件里面添加映射关系:
https://s3.51cto.com/wyfs02/M00/92/FB/wKioL1kGlFDjWab3AAC0sAFA2DY165.jpg
https://s3.51cto.com/wyfs02/M01/92/FD/wKiom1kGlFCjEZ2zAAAqNsy-8d8307.jpg
https://s3.51cto.com/wyfs02/M01/92/FB/wKioL1kGlFGxWRJnAAGowQsAp-M375.jpg
https://s3.51cto.com/wyfs02/M01/92/FB/wKioL1kGlFGyN6sAAAB7h397Qg0164.jpg
  可以看到上面两个测试页说明apache、php、mysql之间可以协同工作了。
  7、压力测试
  网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。
  性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。今天我们专门来介绍ab。
  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的安装非常简单,如果是源码安装apache的话,那就更简单了。apache安装完毕后ab命令存放在apache安装目录的bin目录下。如下:
https://s4.51cto.com/wyfs02/M02/92/FD/wKiom1kGlFHwntBuAAD3peDONEQ067.jpg
  注意1:如果apache是通过yum的RPM包方式安装的话,ab命令默认存放在/usr/bin目录下。
  注意2:注意:如果不想安装apache但是又想使用ab命令的话,我们可以直接安装apache的工具包httpd-tools。如下:
  yum-y install httpd-tools
  
  查看ab是否安装成功,可以切换到上述目录下,使用ab –V命令进行检测。如下:
https://s4.51cto.com/wyfs02/M02/92/FD/wKiom1kGlFKg7bE5AADxFShxTfg019.jpg
  上图显示检测结果报错了,以下是解决办法:
  ①先用find命令查看一下
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGlFLT-46CAAI6pCeTSRE592.jpg
  ②在搜索库文件的文件里添加libssl.so.1.0.0的路径
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGlFOAEK_DAACrDu4Zw5o318.jpg
https://s5.51cto.com/wyfs02/M00/92/FD/wKiom1kGlFPTAylSAADXeaqOL2E125.jpg
  ③执行ldconfig命令使其修改生效
https://s5.51cto.com/wyfs02/M00/92/FB/wKioL1kGlFPjXBOSAAC_kqHT8is856.jpg
  现在我们再来次查看检测一次:
https://s5.51cto.com/wyfs02/M00/92/FD/wKiom1kGlFTwoQUFAAE5vM4Savg301.jpg
  从上图看,问题已经解决了,可以查看到了。
  3)ab参数说明
  有关ab命令的使用,我们可以通过帮助命令进行查看。如下:
https://s2.51cto.com/wyfs02/M00/92/FB/wKioL1kGlFSyJi3jAACPuazdIXk245.jpg
  下面我们对这些参数,进行相关说明。如下:
  -n:在测试会话中所执行的请求个数(即总请求数)。
  -c:一次产生的请求个数(即并发用户数)。
  下面开始进行压力测试:
https://s2.51cto.com/wyfs02/M01/92/FD/wKiom1kGlFWwBeXqAAK89eAavAk130.jpg
https://s2.51cto.com/wyfs02/M01/92/FB/wKioL1kGlFfwFRwBAAWn8mbF_e8271.jpg
https://s2.51cto.com/wyfs02/M01/92/FD/wKiom1kGlFiAdHFTAAIQQpacpxU290.jpg
  上图中的这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过63ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。
  继续压力测试
  我们再来进行一次压力测试,此时并发用户数为1000,其他条件不变,查看两次测试结果的吞吐量差别。
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGlIeR7dGqAAI1NUeP0y4167.jpg
https://s2.51cto.com/wyfs02/M02/92/FD/wKiom1kGlIeT69cPAAIX_8BgfTE278.jpg
https://s2.51cto.com/wyfs02/M00/92/FD/wKiom1kGlIiTGasnAAIIuP81zKg541.jpg
  4)ab性能指标
  在进行性能测试过程中有几个指标比较重要:
  1、吞吐率(Requests per second)
  服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
  记住:吞吐率是基于并发用户数的。这句话代表了两个含义:
  a、吞吐率和并发用户数相关
  b、不同的并发用户数下,吞吐率一般是不同的
  计算公式:总请求数/处理完成这些请求数所花费的时间,即
  Requestper second=Complete requests/Time taken for tests
  必须要说明的是,这个数值表示当前机器的整体性能,值越大越好。
  2、并发连接数(The number of concurrent connections)
  并发连接数指的是某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。
  3、并发用户数(Concurrency Level)
  要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。
  4、用户平均请求等待时间(Time per request)
  计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即:
  Timeper request=Time taken for tests/(Complete requests/ConcurrencyLevel)
  5、服务器平均请求等待时间(Time per request:across all concurrentrequests)
  计算公式:处理完成所有请求数所花费的时间/总请求数,即:
  Timetaken for/testsComplete requests
  可以看到,它是吞吐率的倒数。
  同时,它也等于用户平均请求等待时间/并发用户数,即
  Timeper request/Concurrency Level
  8、CentOS7.2下安装php加速软件Xcache(在php主机上完成下面的操作)
  事先说明一下:
  php安装目录:/usr/local/php5.6
  php.ini配置文件路径:/etc/php.ini
  php网页根目录:/var/www/benet
  1)安装xcache
  wgethttp://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz      
   #下载
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGlIjwMrADAAIRXrimBSY067.jpg
https://s1.51cto.com/wyfs02/M02/92/FB/wKioL1kGlIny-x2dAADNaFBDvhk433.jpg
  2)创建xcache缓存文件
https://s1.51cto.com/wyfs02/M00/92/FD/wKiom1kGlImwJeuMAAE5q97Po-4575.jpg
  3)拷贝xcache后台管理程序到网站根目录
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGlImzbkrtAAERewZ4VI0546.jpg
  4)配置php支持xcache
https://s1.51cto.com/wyfs02/M01/92/FD/wKiom1kGlIqTLu4WAAC4T2cwyzM992.jpg
  在最后一行添加以下内容:
https://s4.51cto.com/wyfs02/M01/92/FB/wKioL1kGlIuRXnNDAANVc-JOLk4648.jpg
  将xcache目录拷贝到apache主机的网页文档目录下:
https://s4.51cto.com/wyfs02/M01/92/FD/wKiom1kGlIvSiEvqAACHMVNPyGU081.jpg
  5)测试
  重启php-fpm:
https://s4.51cto.com/wyfs02/M02/92/FD/wKiom1kGlIzAV0cpAAGM98D17Bw793.jpg
  浏览器打开网站根目录下面的xcache:
https://s4.51cto.com/wyfs02/M01/92/FB/wKioL1kGlI3CHuG9AALVwVQNxIA208.jpg
  警告的原因就是:没有设定系统的timezone。
  说明:从PHP 5.1.0,当对使用date() 等函数时,如果 timezone 设置不正确,在每一次调用时间函数时,都会产生 E_NOTICE 或者 E_WARNING 信息。而又在 PHP 5.1.0 中,date.timezone 这个选项,默认情况下是关闭的,无论用什么PHP 命令都是格林威治标准时间,但是PHP 5.3 中好像如果没有设置也会强行抛出了这个错误的,解决此问题,只要本地化一下就行了。
  解决办法如下:
  ①进入php.ini配置文件
  https://s4.51cto.com/wyfs02/M02/92/FD/wKioL1kGqIrB0qpkAAAYTkOXxN8167.png
  ②修改第913行,去掉注释“#”,并在后面加上PRC
  
https://s3.51cto.com/wyfs02/M02/92/FD/wKiom1kGlI3DxXKjAADO48BvvEw729.jpg
  ③重启php-fpm
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGlI6h9H_ZAAFyV2oVTiM202.jpg
  再次浏览验证一下:
https://s2.51cto.com/wyfs02/M00/92/FD/wKiom1kGlI-A7F91AALLt3zUQ6I042.jpg
  上图可以看出,警告信息已经被解决掉了。
  至此,Linux下安装php加速软件Xcache教程完成。
  下面执行ab压力测试:
  执行第一次压力测试:
https://s4.51cto.com/wyfs02/M02/92/FB/wKioL1kGlI_gB4cNAAKoDUAESwg826.jpg
https://s3.51cto.com/wyfs02/M00/92/FB/wKioL1kGlJDBkMdFAAJJXiwisPM082.jpg
https://s3.51cto.com/wyfs02/M01/92/FD/wKiom1kGlJDxZ_7uAAG3Y_ajEhs909.jpg
  执行第二次压力测试:
https://s3.51cto.com/wyfs02/M01/92/FB/wKioL1kGlJHgUBzpAAJSzMkFym8119.jpg
https://s3.51cto.com/wyfs02/M02/92/FD/wKiom1kGlJLAejXyAAI_IwJ4KA8408.jpg
https://s2.51cto.com/wyfs02/M02/92/FB/wKioL1kGlJLyOpxiAAG4YvGBmic198.jpg
  查看xcache的命中率:
  多浏览很多次下面的网页:
https://s4.51cto.com/wyfs02/M00/92/FD/wKiom1kGlJOhe0jyAAFUL6bDfBE205.jpg
  然后去看命中率:
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGlJTRHeB0AASV4STn9m0619.jpg
  9、部署bbs论坛
  ①Discuz的程序文件解压,并且将upload中所有文件放置到网站目录(php服务器的操作)
https://s5.51cto.com/wyfs02/M01/92/FD/wKiom1kGlJWyhQmnAAChIzSt8kA145.jpg
https://s3.51cto.com/wyfs02/M00/92/FD/wKiom1kGlJaBgrUAAAETmexafIk639.jpg
  ②设置php-fpm的服务用户为下面文件的属主或者对其设置写权限,否则安装时会报错
https://s3.51cto.com/wyfs02/M00/92/FB/wKioL1kGlJahdChFAADdwUaInw8109.jpg
https://s2.51cto.com/wyfs02/M01/92/FB/wKioL1kGlJfS1tNJAAETInWPSQ0731.jpg
  ③修改php.ini文件
https://s1.51cto.com/wyfs02/M01/92/FD/wKiom1kGlJeRo7YnAACvutQmJkE991.jpg
https://s2.51cto.com/wyfs02/M01/92/FB/wKioL1kGlJfSidhLAAA9uck6LEQ519.jpg
  ④重启php-fpm
https://s1.51cto.com/wyfs02/M02/92/FD/wKiom1kGlJjBuxLbAAF3ysIaJSw862.jpg
  web服务器也需要有静态文件(apache服务器上操作):
https://s1.51cto.com/wyfs02/M02/92/FD/wKiom1kGlJigOteUAACd-QSMU9c246.jpg
https://s5.51cto.com/wyfs02/M02/92/FB/wKioL1kGlJjRwLlxAAEUQywPdyk236.jpg
  设置httpd的服务用户对指定文件也需要有写权限:
https://s5.51cto.com/wyfs02/M00/92/FD/wKiom1kGlLSzVljuAAD5NbStwcc204.jpg
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGlLWg-7GrAAEMdKKNDak690.jpg
  在数据库服务器上创建bbs数据库及授权帐户:
https://s1.51cto.com/wyfs02/M00/92/FB/wKioL1kGlLXSP38LAAEdWBo03-4056.jpg
  都置完成之后,在客户机上输入
  http://www.benet.com/bbs/install即可安装
https://s1.51cto.com/wyfs02/M01/92/FD/wKiom1kGlLXDHKDAAAHRto0xJDQ383.jpg
https://s1.51cto.com/wyfs02/M01/92/FB/wKioL1kGlLbxqcCcAAHwY-0-Eew907.jpg
https://s2.51cto.com/wyfs02/M01/92/FD/wKiom1kGlLez0s2mAAJchGgP3dM661.jpg
  出现上面这种情况是由于php服务器安装了discuz之后导致程序发生变化从而导致动态服务器和静态服务器的程序不一致,只需要手动把bbs服务器的文件和web服务器进行一次同步即可,如果想实现自动同步,需要使用其他服务,如initory+rsync、sersync等工具。
  使用如下命令进行同步:
https://s4.51cto.com/wyfs02/M02/92/FD/wKiom1kGlLeBJRA9AACM-98mekw558.jpg
  动态服务器和静态服务器同步文件之后,再次访问bbs的网址就正常了:
https://s5.51cto.com/wyfs02/M01/92/FB/wKioL1kGlLfAMbeAAAFRVp28cpg572.jpg
  




页: [1]
查看完整版本: 深度剖析apache 2.4web服务器(史上最全)