codecamp

Linux 详解Apache 2.4web服务器

防伪码我若不勇敢谁替我坚强。

一、 安装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、每请求配置<If>, <Elseif>
7、毫秒级别的keepalive timeout
8、基于FQDN的虚拟主机不再需要NameVirtualHost指令
9、支持使用自定义变量

安装环境操作系统Centos7.2关闭selinux

检查httpd包是否安装如查安装则卸载

1
[root@www ~]# rpm -q httpd



1、安装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

1
2
3
4
[root@www ~]# tar zxf apr-1.5.2.tar.gz 
[root@www ~]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@www apr-1.5.2]# make&& make install


1
2
3
4
[root@www ~]# tar zxf apr-util-1.5.4.tar.gz 
[root@www ~]# cd apr-util-1.5.4/
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@www apr-util-1.5.4]# make&& make install


 

安装zlib

1
2
3
4
[root@www ~]# tar zxf zlib-1.2.8.tar.gz 
[root@www ~]# cd zlib-1.2.8/
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@www zlib-1.2.8]# make&& make install


安装pcre

1
2
3
4
[root@www ~]# tar zxf pcre-8.39.tar.gz 
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@www pcre-8.39]# make&& make install


安装openssl

安装apache2.4.23时提示openssl版本过低centos7自带版本openssl-1.0.1e

下载openssl

1
2
3
4
5
#wget  https://www.openssl.org/source/openssl-1.0.1u.tar.gz
[root@www ~]# tar zxf openssl-1.0.1u.tar.gz 
[root@www ~]# cd openssl-1.0.1u/
[root@www openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@www openssl-1.0.1u]# make&& make install


1
2
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl


安装apache2.4.23

1
2
3
4
[root@www ~]# tar zxf httpd-2.4.23.tar.gz 
[root@www ~]# cd httpd-2.4.23/
[root@www httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite  --with-pcre=/usr/local/pcre
--with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate


相关参数解释

--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二进制文件的模块<MODULE-LIST>为空格分隔的模块名列表、all或者mostall表示包含所有模块most表示包含大部分常用模块

--enable-mods-shared=most:明确指明要以DSO方式编译的模块<MODULE-LIST>为空格分隔的模块名列表、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调优的一个重要选项之一。

1
[root@www httpd-2.4.23]# make&& make install



优化http程序执行路径

1
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/



修改配置文件httpd.conf设置其中的ServerName值

例如ServerName www.benet.com

开启apache服务器

1
# /usr/local/http-2.4.23/bin/apachectl start



开机后自动启动

1
2
[root@ww
w httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd


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

1
2
3
[root@www httpd-2.4.23]# vi /etc/init.d/httpd
# chkconfig: 35 85 15
# description: apache 2.4.23


将 Apache 加入开机自动启动

1
2
[root@www httpd-2.4.23]# chkconfig --add httpd
[root@www httpd-2.4.23]# chkconfig httpd on


启动编译好的 Apache 2.4.23

1
2
3
[root@www httpd-2.4.23]# service  httpd start
[root@www httpd-2.4.23]# netstat -anplt | grep 80
tcp6       0      0 :::80                   :::*       LISTEN      4807/httpd


客户端测试访问注意防火墙

二、 Apache的优化配置

apache所运行的硬件环境都是对性能影响最大的因素即使不能对硬件进行升级也最好给apache一个单独的主机以免受到其他应用的干扰。各个硬件指标中对性能影响最大的是内存对于静态内容图片、javascript文件、css文件等它决定了apache可以缓存多少内容它缓存的内容越多在硬盘上读取内容的机会就越少大内存可以极大提高静态站点的速度对动态高负载站点来说每个请求保存的时间更多一些apache的mpm模块会为每个请求派生出相应的进程或线程分别处理而进程或线程的数量与内存的消耗近似成正比因此增大内存对提高动态站点的负载和运行速度也极为有利 

其次是硬盘的速度静态站点尤为突出apache不断的在读取文件并发送给相应的请求硬盘的读写是极其频繁的动态站点也要不断的加载web程序(php等)一个请求甚至要读取十几个文件才能处理完成因此尽可能的提高硬盘速度和质量对提高apache的性能是有积极意义的。 

最后是cpu和网络cpu影响的是web程序执行速度网络影响流量大小。    

 

1、apache的工作模式

Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做“多进程处理模块”Multi-Processing ModuleMPM也叫做工作模式。

Prefork模式一个非线程型的

其主要工作方式是当Apache服务器启动后mpm_prefork模块会预先创建多个子进程(默认为5个)每个子进程只有一个线程当接收到客户端的请求后mpm_prefork模块再将请求转交给子进程处理并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时mpm_prefork模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。

由于在mpm_prefork模块中每个请求对应一个子进程因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应的单个请求这样如果其中一个请求出现问题就不会影响到其他请求。Prefork在效率上要比Worker要高但是内存使用大得多不擅长处理高并发的场景。

Apache在prefork工作模式下影响性能的重要参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
# prefork MPM
<IfModule mpm_prefork_module>
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。
</IfModule>


注1MaxRequestWorkers是这些指令中最为重要的一个设定的是 Apache可以同时处理的请求是对Apache性能影响最大的参数。如果请求总数已达到这个值可通过ps -ef|grep http|wc -l来确认那么后面的请求就要排队直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大可以处理的请求就越多建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器那么初始值就是4000/2=2000。

注2prefork 控制进程在最初建立“StartServers”个子进程后为了满足MinSpareServers设置的需要创建一个进程等待一秒钟继续创建两 个再等待一秒钟继续创建四个……如此按指数级增加创建的进程数最多达到每秒32个直到满足MinSpareServers设置的值为止。这种模式 可以不必在请求到来时再产生新的进程从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数如果空闲进程数大于这个 值Apache会自动kill掉一些多余进程。这个值不要设得过大但如果设的值比MinSpareServers小Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大可考虑同时加大MinSpareServers和MaxSpareServers。  

注3ServerLimit和MaxClientsMaxRequestWorkers有什么区别呢

是因为在apache1时代控制最大进程数只有MaxClients这个参数并且这个参数最大值为256并且是写死了的试图设置为超过256是无效的这是由于apache1时代的服务器硬件限制的。但是apache2时代由于服务器硬件的升级硬件已经不再是限制所以使用ServerLimit这个参数来控制最大进程数ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前值要不小于MaxClients。

注4查看Apache加载的模块

1
2
3
4
5
[root@www ~]#apachectl -t -D DUMP_MODULES
[root@www ~]# apachectl-M
[root@www ~]# apachectl–l


如何查看Apache的工作模式呢可以使用httpd -V 命令查看另外使用httpd -l 也可以查看到

注5如何修改prefork参数和启用prefork模式

1
2
3
4
1.[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
2.[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf


3.重启httpd服务

Worker模式(多线程多进程)

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

总的来说prefork方式速度要稍高于worker然而它需要的cpu和memory资源也稍多于woker。

Apache在worker工作模式下影响性能的重要参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# worker MPM
<IfModule mpm_worker_module>
StartServers             3
#apache启动时候默认开始的子进程数
MinSpareThreads         75
#最小空闲数量的工作线程
MaxSpareThreads        250
#最大空闲数量的工作线程
ThreadsPerChild         25
#每个子进程产生的线程数量
MaxRequestWorkers      400
#与prefork模式相同
MaxConnectionsPerChild   0
#与prefork模式相同
</IfModule>


注1Worker 由主控制进程生成“StartServers”个子进程每个子进程中包含固定的ThreadsPerChild线程数各个线程独立地处理请求。同样 为了不在请求到来时再生成线程MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数

而MaxRequestWorkers 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载控制进程将派生新的子进程 

MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大可以按照实际情况相应调节 。

注2ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64如果负载较大64也是不够的。这时要显式使用 ThreadLimit指令它的最大缺省值是20000。 

注3Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的应该大于等于MaxRequestWorkers。如果负载很大现有的子进程数不能满足时控制进程会派生新的子进程。默认最大的子进程总数是16加大时 也需要显式声明ServerLimit系统配置的最大进程数量最大值是20000。需要注意的是如果显式声明了ServerLimit那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers而且MaxRequestWorkers必须是ThreadsPerChild的整数倍否则 Apache将会自动调节到一个相应值。

注4进程与线程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
(4)二者均可并发执行.

进程和线程都是由操作系统所体会的程序运行的基本单元系统利用该基本单元实现系统对应用的并发性。

进程和线程的区别在于

简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 
线程的划分尺度小于进程使得多线程程序的并发性高。 
另外进程在执行过程中拥有独立的内存单元而多个线程共享内存从而极大地提高了程序的运行效率。 

Event模式

这是Apache最新的工作模式是worker模式的变种它把服务进程从连接中分离出来一worker模式不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题在event工作模式中会有一些专门的线程用来管理这些keep-alive类型的线程当有真实请求过来的时候将请求传递给服务器的线程执行完毕后又允许它释放。这增强了在高并发场景下的请求处理。event模式不能很好的支持https的访问HTTP认证相关的问题。

2、apache配置参数

1KeepAlive On/Off
  KeepAlive指的是保持连接活跃换一句话说如果将KeepAlive设置为On那么来自同一客户端的请求就不需要再一次连接避免每次请求都要新建一个连接而加重服务器的负担。一般情况下图片较多的网站应该把KeepAlive设为On。

2KeepAliveTimeOut number
  如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话第一次连接就会中断再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔一般设置为3-5秒。

3MaxKeepAliveRequests 100
  一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面通常达不到这个上限就完成连接了。

4HostnameLookups on|off|double
如果是使用on那么只有进行一次反查如果用double那么进行反查之后还要进行一次正向解析只有两次的结果互相符合才行而off就是不进行域名验证。
如果为了安全建议使用double为了加快访问速度建议使用off。

域名查找开启这个会增加apache的负担, 减慢访问速度建议关闭

5timeout 5

推荐5 这个是 apache接受请求或者发出相应的时间超过这个时间断开

注以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf设置并在httpd.conf文件中通过include选项引用

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

1StartServers        10
  设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以一般没有必要调整这个参数。

2MinSpareServers     10
  设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

3MaxSpareThreads     75
  设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。

4ServerLimit       2000
  服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效以restart方式重启动将不会生效。

5MaxClients/MaxRequestWorkers         256
  用于客户端请求的最大请求数量最大子进程数任何超过MaxClients限制的请求都将进入等候队列。默认值是256如果要提高这个值必须同时提高ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器那么初始值就是4000/2=2000。

6MaxRequestsPerChild /MaxConnectionsPerChild 0
  设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限即子进程永不销毁。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100。所以一般情况下如果你发现服务器的内存直线上升建议修改该参数试试。

注以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf设置并在httpd.conf文件中通过include选项引用

3、开启apache的Gzipdeflate功能

gzip可以极大的加速网站有时压缩比率高到80%,最少都有40%以上还是相当不错的。在Apache2之后的版本模块名不叫gzip,而叫mod_deflate

未使用Gzip

开启使用Gzip

如果要开启deflate的话,一定要打开下面二个模块

LoadModule deflate_module modules/mod_deflate.so

LoadModule headers_module modules/mod_headers.so

设置压缩比率,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源.

mod_deflate模块检查及安装

1
2
[root@www ~]# /usr/local/http-2.4.23/bin/apachectl -M | grep deflate
 deflate_module (shared)


如果没有安装

a.编译时安装方法

 编译的时候跟上--enable-deflate即可实现安装
b.DSO方式安装

1
2
3
4
[root@www ~]# cd /root/httpd-2.4.23/modules/filters/ #切到apache源码包mod_deflate所在的目录下# /usr/local/http-2.4.23/bin/apxs
-c -i -a mod_deflate.c  #以dso的方式编译安装到apache中
# /usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_headers.c#以dso的方式编译安装到apache中[root@www filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so  
#检查mod_deflate是否安装成功安装这里会显示出该文件

-rwxr-xr-x. 1 root root 98144 Oct 22 23:14 /usr/local/http-2.4.23/modules/mod_deflate.so

apxs命令参数说明 
-i  此选项表示需要执行安装操作以安装一个或多个动态共享对象到服务器的modules目录中。 
-a  此选项自动增加一个LoadModule行到httpd.conf文件中以启用此模块或者如果此行已经存在则启用之。 
-c  此选项表示需要执行编译操作。

如果重启的时候出现错误

引用

Cannot load /usr/local/apache/modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so: undefined symbol: inflateEnd

需要在 LoadModule deflate_module  modules/mod_deflate.so 的前面加载zlib.so

这里需要注意的是LoadModule deflate_module需要放在LoadModule php5_module之后

引用

LoadFile /usr/lib/libz.so(x64系统中该库文件位于/usr/lib64目录下可以软链接到/usr/lib下

LoadModule deflate_module     modules/mod_deflate.so

 

重新启动httpd:

1
# /usr/local/http2.4.23/bin/apachectl graceful  #优雅启动httpd服务


修改Apache配置文件开启gzip压缩传输

http.conf修改、增加配置参数

1
2
LoadModule deflate_module     modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so


打开httpd.conf后先将上面两行配置前面的#号去掉这样apache就会启用这两个模块其中mod_deflate是压缩模块就是对要传输到客户端的代码进行gzip压缩mod_headers模块的作用是告诉浏览器页面使用了gzip压缩如果不开启mod_headers那么浏览器就会对gzip压缩过的页面进行下载而无法正常显示。

在httpd.conf中加入以下代码可以加到任何空白地方不了解apache的话如果担心加错地方就放到http.conf文件的最后一行

注在添加代码前最好先查一查要添加的代码是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
<IfModule mod_deflate.c>
        DeflateCompressionLevel 9# 压缩程度的等级预设可以采用 6 这个数值以维持耗用处理器效能与网页压缩质量的平衡。
        SetOutputFilter DEFLATE   #设置输出过滤器对输出启用压缩必须的就像一个开关一样告诉apache对传输到浏览器的内容进行压缩
        #AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
        #AddOutputFilterByType DEFLATE image/*
        AddOutputFilterByType DEFLATE text/*#设置对文件是文本的内容进行压缩例如text/html  text/css  text/plain等.
        AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript  #对javascript文件进行压缩
        AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #对php类型的文件进行压缩.
        SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary  #设置不对后缀gifjpgjpegpng的图片文件进行压缩。注?:表示不会捕获 ( )里内容了
  
        SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary#同上就是设置不对exetgzgz等的文件进行压缩
        SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary #同上就是设置不对pdfavimp3等的文件进行压缩
</IfModule>


#设置日志输出

1
2
3
4
5
DeflateFilterNote Input input_info#声明输入流的byte数量
DeflateFilterNote Output output_info#声明输出流的byte数量
DeflateFilterNote Ratio ratio_info#声明压缩的百分比
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate#声明日志格式
CustomLog logs/deflate_log.log deflate


修改完成后保存退出并重启httpd服务

使用谷歌浏览器测试访问如下图显示结果提示在访问测试页之前按F12键

查看日志

1
2
3
[root@www htdocs]# cat ../logs/deflate_log.log
"GET /test.html HTTP/1.1" 6421/19949 (32%)
"GET /test1.html HTTP/1.1" 1360/4266 (31%)


注图片是不需要启用GZip压缩的从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的效果

1
2
3
4
5
6
7
8
9
10
[root@www htdocs]# curl -I 192.168.31.83/12.png
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 15:52:37 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Vary: Accept-Encoding
Content-Type: image/png


 

启用expire缓存

mod_expires的安装配置

启用expires_module

LoadModule expires_module modules/mod_expires.so

然后添加Expires配置规则

1
2
3
4
5
6
7
8
9
10
11
12
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType application/x-javascript "now plus 5 day"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 minutes"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minutes"
</IfModule>


验证

1
2
3
4
5
6
7
8
9
10
11
12
[root@www htdocs]# curl -I 192.168.31.83/12.png
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:00:57 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Cache-Control: max-age=60
Expires: Tue, 25 Oct 2016 16:01:57 GMT
Vary: Accept-Encoding
Content-Type: image/png


 

ExpiresDefault 和ExpiresByType 指令同样能够用易懂的语法格式进行定义

ExpiresDefault "<base> [plus] {<num><type>}"
ExpiresByType type/encoding "<base> [plus] {<num><type>}"

其中<base>是下列之一

access

now (等价于'access ')

modification

plus 关键字是可选的。<num>必须是整数<type>是下列之一

years

months

weeks

days

hours

minutes

seconds

例如下列3个指令都表示文档默认的有效期是一个月

1
2
3
4
5
6
ExpiresDefault "access plus 1 month"ExpiresDefault "access plus 4 weeks"ExpiresDefault "access plus 30 days"
有效期可以通过增加"<num><type>"子句进一步调整
ExpiresByType text/html "access plus 1 month 15 days 2 hours"ExpiresByType image/gif "modification plus 5 hours 3 minutes"
注意如果你使用基于最后修改日期的设置"Expires:"头将不会 被添加到那些并非来自于磁盘文件的内容。这是因为这些内容并不存在"最后修改时间"的属性。
# GIF有效期为1个月秒数ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByType image/png A2592000 ExpiresByType image/x-icon A2592000 ExpiresByType
application/x-javascript A604800 ExpiresByType text/plain A604800 # HTML文档的有效期是最后修改时刻后的一星期 ExpiresByType text/html M604800 </IfModule>


"M"表示源文件的最后修改时刻"A"表示客户端对源文件的访问时刻。后面的时间则以秒计算。

有关 Apache Expires Module 的介绍可以参阅其官方文档:

http://httpd.apache.org/docs/2.4/mod/mod_expires.html

 

4、Apache禁止目录遍历

将Options Indexes FollowSymLinks中的Indexes 去掉就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html文件时就显示目录结构。

5、apache 隐藏版本信息

测试默认 apache 的状态信息

1
2
3
4
5
6
7
8
9
10
11
[root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:09:09 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Tue, 25 Oct 2016 16:09:09 GMT
Content-Type: text/html


1、主配置中启用httpd-default.conf

1
Include conf/extra/httpd-default.conf


2、修改httpd-default.conf

文件/usr/local/http-2.4.23/conf/extra/httpd-default.conf

找到

1
2
3
4
5
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature off


重启 apache 测试

测试隐藏版本号后 apache 的状态信息

[

1
2
3
4
5
6
7
8
9
10
11
root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:14:32 GMT
Server: Apache
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Cache-Control: max-age=0
Expires: Tue, 25 Oct 2016 16:14:32 GMT
Content-Type: text/html


如果你需要彻底将版本之类的信息进行改头换面你就需要在编译之前做准备或者进行从新编译了。在重新编译时修改源码包下include目录下的ap_release.h文件

1
2
3
4
5
6
7
8
9
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"  #服务的项目名称
#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_BOOLEAN  0  #


上述列出的行已经给出了注释大家可以修改成自己想要的然后编译安装之后对方就彻底不知道你的版本号了。

 

6、Apache日志切割

为什么要分割日志
随着
网站的访问越来越大WebServer产生的日志文件也会越来越大如果不对日志进行分割那么只能一次将大的日志(如Apache的日志)整个删除这样也丢失了很多对网站比较宝贵的信息因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等因此管理好这些海量的日志对网站的意义是很大的。 

方法1:使用rotatelogsapache自带的工具每隔一天记录一个日志

辑Apache的主配置文件更改内容如下
注释掉如下两行

1
2
ErrorLog logs/error_log
CustomLog logs/access_log common

然后添加如下两行

1
2
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined


注其中86400为轮转的时间单位为秒

验证查看logs目录下的日志文件

1
2
[root@www ~]# ls /usr/local/http-2.4.23/logs/
access_20161026.log  access_log  deflate_log.log  error_20161026.log  error_log  httpd.pid


由于apache自带的日志轮询工具rotatelogs据说在进行日志切割时容易丢日志因此我们通常使用cronolog进行日志轮询。

方法2、使用 cronolog 为每一天建立一个新的日志

安装cronolog程序

下载cronolog  

1
2
3
[root@www ~]# tar zxf cronolog-1.6.2.tar.gz
[root@www ~]# cd cronolog-1.6.2/
[root@www cronolog-1.6.2]# ./configure && make && make install


 

主配置文件中的使用方法

1
2
ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined


如果Apache中有多个虚拟主机最好每个虚拟主机中放置一个这样的代码并将日志文件名改成不同的名字。

扩展

这个保证了每天一个文件夹文件夹下每个小时产生一个log

CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined

 

按天轮询生产环境常见用法推荐使用
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined


按小时轮询生产环境较常见用法
CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined

 

验证查看logs目录下的日志文件

[

1
2
root@www ~]# ls /usr/local/http-2.4.23/logs/
access-20161026.log  access_log  deflate_log.log  error-20161026.log  error_log  httpd.pid


注意

这两个管道日志文件程序还有一点不同之处是使用 cronolog 时如果日志是放在某个不存在的路径则会自动创建目录而使用 rotatelogs 时不能自动创建这一点要特别注意

 

7、配置防盗链

有时候你的网站莫名其妙的访问量变大不要高兴的太早有可能是被别人盗链了。

举个例子比如你搭了个discuz论坛里面有些热点图片、视频然后别人将他网站上访问图片的地址重定向到你的discuz上这样他的服务器就可以空闲出来了也就是说别人访问他网站的图片视频消耗的确是你服务器的资源

解决这个问题的方法是配置下防盗链让外来的盗不了链

方法1Apache 防盗链的第一种实现方法可以用rewrite实现。

首先要确认 Apache 的rewrite module可用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@www ~]# apachectl -M | grep rewrite
rewrite_module (shared)
打开 httpd.conf确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在找到自己网站对应的配置的地方如在主配置文件中或虚拟主机中加入下列代码
ServerName www.benet.com
#防盗链配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]


注相关选项的解释

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]指的是不区分大小写,[R]强制重定向 redirect

6.字母L表示如果能匹配本条规则那么本条规则是最后一条(Last)忽略之后的规则

防盗链配置的说明

1. 红色部分: 表示自己的信任站点。对我的站点来说设置为 http://www.benet.com 和 http://benet.com

2. 绿色部分: 要保护文件的扩展名(以|分开)。以这些为扩展名的文件必须通过红色标注的网址引用才可以访问。

3. 蓝色部分: 定义被盗链时替代的图片让所有盗链 jpg、gif、swf 等文件的网页显示网页文档根目录下的about/ nolink.png 文件注意替换显示的图片不要放在设置防盗链的目录中并且该图片文件体积越小越好。当然你也可以不设置替换图片而是使用下面的语句即可RewriteRule .*\.(gif|jpg|png)$ - [F]

注[F] (强制URL为被禁止的 forbidden),强制当前URL为被禁止的即立即反馈一个HTTP响应代码403(被禁止的)。

RewriteCond%{HTTP_REFERER}!^$ 
上面这一行意在允许空“HTTP_REFERER”的访问即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。

RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]

RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]

设置允许访问的HTTP来源包括网站自身

RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]

将不满足referer条件的访问重定向至nolink.pngnolink.png位于允许“盗链”的目录about中要相当注意不然警告信息和图片将无法在对方网站上显示。 

注意测试时要清除济浏览器缓存

方法2通过判断浏览器头信息来阻止某些请求即利用SetEnvIfNoCase和access。

这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。

语法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

SetEnvIfNoCase 当满足某个条件时为变量赋值即根据客户端请求属性设置环境变量

注Referer 指明了请求当前资源原始资源的URL使用referer是可以防盗链

然后在找到自己网站对应的配置的地方如在主配置文件中或虚拟主机中加入下列代码

1
2
3
4
SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer "benet.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif)">


# 2.4版本以下的

方法一

    Order Deny,Allow

    Allow from env=local_ref

    Deny from all

方法二

    Order Allow,Deny

    Allow from env=local_ref

 

#2.4版本以上方法如下

    Require all denied

    Require env local_ref

</filesmatch>

 

三、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服务器。

编译环境及各软件版本

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.197.0/24 网关192.168.197.2

分配如下

1台httpd服务器192.168.31.83

1台php服务器192.168.31.141

1台mysql服务器192.168.31.225

编译安装LAMP

编译安装apache(请参考前面apache的安装)

编译安装mysql(请参考mysql安装)

FastCGI方式安装php

1、解决依赖关系

1
[root@phpserver ~]# yum -y install libxml2-devel libcurl-devel openssl-devel bzip2-devel


安装libmcrypt

1
2
3
[root@phpserver ~]# tar zxf libmcrypt-2.5.7.tar.gz
[root@phpserver ~]# cd libmcrypt-2.5.7/
[root@phpserver libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install


2、编译安装php

1
2
3
4
5
[root@phpserver ~]# tar zxf php-5.6.27.tar.gz
[root@phpserver ~]# cd php-5.6.27/
[root@phpserver 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
[root@phpserver php-5.6.27]# make&& make install


相关选项的解释

1
2
3
4
5
6
7
8
9
10
11
12
13
--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图片

1
2
3
4
5
6
7
--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配置文件

1
[root@phpserver php-5.6.27]# cp php.ini-production /etc/php.ini


4、为php-fpm提供脚本

1
2
3
4
[root@phpserver php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@phpserver php-5.6.27]# chmod +x /etc/init.d/php-fpm
[root@phpserver php-5.6.27]# chkconfig --add php-fpm
[root@phpserver php-5.6.27]# chkconfig php-fpm on


5、提供php-fpm配置文件并编辑

1
2
# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
[root@phpserver ~]# vi /usr/local/php5.6/etc/php-fpm.conf


修改内容如下

1
2
3
4
5
6
pid = run/php-fpm.pid
listen = 192.168.31.141:9000
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35


启动php-fpm服务

1
2
3
4
5
6
7
8
[root@phpserver ~]# service  php-fpm start
Starting php-fpm  done
[root@phpserver ~]# netstat -anpt | grep php-fpm
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      25456/php-fpm: mast
[root@phpserver ~]# firewall-cmd --permanent --add-port=9000/tcp
success
[root@phpserver ~]# firewall-cmd --reload
Success


在该主机上新建虚拟主机目录用于存放网页文件

1
[root@phpserver ~]# mkdir -p /var/www/benet


至此php安装配置完毕下面配置apache通过fastcgi协议调用php

6、配置apache(切换到apache主机上操作)

在Apache2.4以后已经专门有一个模块针对FastCGI的实现此模块为mod_proxy_fcgi.so它其实是作为mod_proxy.so模块的扩充因此这两个模块都要加载

1
2
3
4
5
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
[root@www ~]# apachectl -M | grep proxy
proxy_module (shared)
 proxy_fcgi_module (shared)


建立一个目录作为虚拟主机的家目录

1
[root@www ~]# mkdir -p /var/www/benet


编辑主配置文件httpd.conf开启虚拟主机

启用Include conf/extra/httpd-vhosts.conf

同时定位 AddType添加下面两行让apache能识别php格式的页面

1
2
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps


并且定位至DirectoryIndex支持php格式的主页

1
DirectoryIndex index.php index.html #添加index.php最好添加在最前面


 

配置虚拟主机支持使用fcgi

[

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    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.31.141:9000/var/www/benet/$1
    #<LocationMatch "^(.*\.php(/.*)?)$">
#  ProxyPass fcgi://192.168.31.141:9000/var/www/benet
    #</LocationMatch>
<Directory "/var/www/benet">
Options  FollowSymLinks
       AllowOverride None
       Require all granted
</Directory>
</VirtualHost>


其中

ProxyRequests off #关闭正向代理

ProxyPassMatch把以.php结尾的文件请求发送到php-fpm进程php-fpm至少需要知道运行的目录和URI所以这里直接在fcgi://192.168.31.141:9000后指明了这两个参数其它的参数的传递已经被mod_proxy_fcgi.so进行了封装不需要手动指定。

特别注意的是红色字体部分需要与<VirtualHost >中的 DocumentRoot 后的路径一致

ProxyPassMatch
只有满足特定正则模式的内容才会匹配并执行此规则这里的模式是^/(.*\.php(/.*)?)$
从网站虚拟主机<VirtualHost >的根目录开始匹配任何以 .php 结尾或者在 .php 之后紧跟一个 / 再跟别的内容的路径。

^ (caret) 和 $ (dollar)标志要匹配的路径的开始和结束

( )括号里的内容可以用 $1 来表示以方便后面引用它。

fcgi:// 192.168.31.141:9000通过 mod_proxy_fcgi 来转发的代理使用 fastCGI 协议转到 PHP-FPM 监听的端口。

/path/to/your/documentroot/
非常重要必须与虚拟主机的路径匹配且必须是对应 php 文件在操作系统中的绝对路径。否则会找不到文件。

$1可以从原始请求扩展成整个请求路径的变量这里指代前面( ) 里面匹配的那个路径uri

 

充Apache httpd 2.4以前的版本中要么把PHP作为Apache的模块运行要么添加一个第三方模块支持PHP-FPM实现。

测试LAMP环境

在mysql主机上创建用于php服务器连接的mysql账户

mysql> grant all on *.* to testuser@'%' identified by '123456;

注意防火墙要允许mysql连接。

在php服务器上的/var/www/benet目录下创建.php的测试页

1
2
3
4
5
6
7
8
9
10
[root@phpserver ~]# cat /var/www/benet/index.php
<?php
phpinfo();
?>
[root@phpserver ~]# cat /var/www/benet/test1.php
<?php
$link=mysql_connect('192.168.31.225','testuser','123456');
if ($link)echo "connection success......";
mysql_close();
?>


测试访问php测试页

看到上面两个测试页说明apache、php、mysql之间可以协同工作了。

7、压力测试

网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下才能真正体现出软件、硬件等各种设置不当所暴露出的问题。

性能测试工具目前最常见的有以下几种ab、http_load、webbench、siege。今天我们专门来介绍ab。

ab是apache自带的压力测试工具。ab非常实用它不仅可以对apache服务器进行网站访问压力测试也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

下面我们开始介绍有关ab命令的使用

1ab的原理

2ab的安装

3ab参数说明

4ab性能指标

5ab实际使用

6测试nginx性能

1ab的原理

ab是apachebench命令的缩写。

ab的原理ab命令会创建多个并发访问线程模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的因此它既可以用来测试apache的负载压力也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。

ab命令对发出负载的计算机要求很低它既不会占用很高CPU也不会占用很多内存。但却会给目标服务器造成巨大的负载其原理类似CC攻击。自己测试使用也需要注意否则一次上太多的负载。可能造成目标服务器资源耗完严重时甚至导致死机。

2ab的安装

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命令进行检测。如下

1
2
3
4
[root@www ~]# /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/


3ab参数说明

有关ab命令的使用我们可以通过帮助命令进行查看。如下

[root@cent05 ~]# ab--help

下面我们对这些参数进行相关说明。如下

-n在测试会话中所执行的请求个数(即总请求数)。

-c一次产生的请求个数并发用户数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@www ~]# ab -c 500 -n 10000 http://192.168.31.83/index.html
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.31.83 (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
Server Hostname:        192.168.31.83
Server Port:            80
  
Document Path:          /index.html    #请求的资源
Document Length:        312 bytes#HTTP响应数据的正文长度
  
Concurrency Level:      500#并发个数并发用户数
Time taken for tests:   1.452 seconds#所有这些请求处理完成所花费的时间 
Complete requests:      10000#完成请求数
Failed requests:        0#失败的请求数
Non-2xx responses:      10000
Total transferred:      4760000 bytes#表示所有请求的响应数据长度总和包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度仅仅为web服务器流向用户PC的应用层数据总长度。 
HTML transferred:       3120000 bytes# 表示所有请求的响应数据中正文数据的总和也就是减去了Total transferred中HTTP响应数据中的头信息的长度。
Requests per second:    7530.93 [#/sec] (mean) #吞吐量-每秒请求数。计算公式Complete requests/Time taken for tests
Time per request:       66.393 [ms] (mean) #用户平均请求等待时间计算公式Time token
for tests/Complete requests/Concurrency Level。
Time per request:       0.133 [ms] (mean, across all concurrent requests)#服务器平均请求等待时间计算公式Time taken for tests/Complete requests。
Transfer rate:          3500.71 [Kbytes/sec] received#表示这些请求在单位时间内从服务器获取的数据长度计算公式Total trnasferred/ Time taken for tests这个统计很好的说明服务器的处理能力达到极限时其出口宽带的需求量。即平均每秒网络上的流量
  
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:       10   27   7.3     27      48
Processing:     4   37  36.5     32     439
Waiting:        2   27  37.0     21     435
Total:         30   64  37.6     60     470
  
Percentage of the requests served within a certain time (ms)
  50%     60
  66%     63
  75%     64
  80%     66
  90%     71
  95%     76
  98%     89
  99%    261
 100%    470 (longest request)
这部分数据用于描述每个请求处理时间的分布情况比如以上测试80%的请求处理时间都不超过66ms这个处理时间是指前面的Time per request即对于单个用户而言平均每个请求的处理时间。


继续压力测试
我们再来进行一次压力测试此时并发用户数为1000其他条件不变查看两次测试结果的吞吐量差别

4ab性能指标

在进行性能测试过程中有几个指标比较重要

1、吞吐率Requests per second

服务器并发处理能力的量化描述单位是reqs/s指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数称之为最大吞吐率。

记住吞吐率是基于并发用户数的。这句话代表了两个含义

a、吞吐率和并发用户数相关

b、不同的并发用户数下吞吐率一般是不同的

计算公式总请求数/处理完成这些请求数所花费的时间即

Request per second=Complete requests/Time taken for tests

必须要说明的是这个数值表示当前机器的整体性能值越大越好。

2、并发连接数The number of concurrent connections

并发连接数指的是某个时刻服务器所接受的请求数目简单的讲就是一个会话。

3、并发用户数Concurrency Level

要注意区分这个概念和并发连接数之间的区别一个用户可能同时会产生多个会话也即连接数。

4、用户平均请求等待时间Time per request

计算公式处理完成所有请求数所花费的时间/总请求数/并发用户数即

Time per request=Time taken for tests/Complete requests/Concurrency Level

5、服务器平均请求等待时间Time per request:across all concurrent requests

计算公式处理完成所有请求数所花费的时间/总请求数即

Time taken for/testsComplete requests

可以看到它是吞吐率的倒数。

同时它也等于用户平均请求等待时间/并发用户数即

Time per 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

1
2
3
4
5
6
7
8
9
10
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz #下载
[root@phpserver ~]# tar zxf xcache-3.2.0.tar.gz #解压
[root@phpserver ~]# cd xcache-3.2.0/ #进入安装目录
[root@phpserver xcache-3.2.0]# /usr/local/php5.6/bin/phpize#用phpize生成configure配置文件
[root@phpserver xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config  #配置
[root@phpserver xcache-3.2.0]# make && make install  #编译、安装
  
Installing shared extensions:     /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/
安装完成之后出现下面的界面记住以下路径后面会用到
/usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/


2创建xcache缓存文件

1
2
# touch /tmp/xcache
# chmod 777 /tmp/xcache


3拷贝xcache后台管理程序到网站根目录

1
[root@phpserver xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache


4配置php支持xcache

vi / etc/php.ini #编辑配置文件在最后一行添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[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.stat=On
xcache.optimizer =Off
[xcache.coverager]
xcache.coverager =On
xcache.coveragedump_directory =""


将xcache目录拷贝到apache主机的网页文档目录下

1
[root@phpserver ~]# scp -r /var/www/benet/xcache/ root@192.168.31.83:/var/www/benet/


6测试

service php-fpm restart #重启php-fpm

浏览器打开网站根目录下面的xcache

http://http://192.168.31.83/xcache可以看到如下页面

至此Linux下安装php加速软件Xcache教程完成

执行ab压力测试

执行第一次压力测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@www ~]# ab -c 100 -n 1000 http://192.168.31.83/index.php
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.31.83 (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
Server Hostname:        192.168.31.83
Server Port:            80
  
Document Path:          /index.php
Document Length:        85006 bytes
  
Concurrency Level:      100
Time taken for tests:   1.773 seconds
Complete requests:      1000
Failed requests:        368
   (Connect: 0, Receive: 0, Length: 368, Exceptions: 0)
Total transferred:      85259504 bytes
HTML transferred:       85013504 bytes
Requests per second:    563.88 [#/sec] (mean)
Time per request:       177.344 [ms] (mean)
Time per request:       1.773 [ms] (mean, across all concurrent requests)
Transfer rate:          46948.95 [Kbytes/sec] received
  
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    1   2.7      0      16
Processing:    31  167  73.7    140     406
Waiting:       23  162  73.1    136     401
Total:         40  168  73.0    141     406
  
Percentage of the requests served within a certain time (ms)
  50%    141
  66%    152
  75%    176
  80%    188
  90%    294
  95%    389
  98%    396
  99%    400
 100%    406 (longest request)


执行第二次压力测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@www ~]# ab -c 100 -n 1000 http://192.168.31.83/index.php
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.31.83 (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
Server Hostname:        192.168.31.83
Server Port:            80
  
Document Path:          /index.php
Document Length:        85006 bytes
  
Concurrency Level:      100
Time taken for tests:   1.264 seconds
Complete requests:      1000
Failed requests:        316
   (Connect: 0, Receive: 0, Length: 316, Exceptions: 0)
Total transferred:      85257983 bytes
HTML transferred:       85011983 bytes
Requests per second:    790.93 [#/sec] (mean)
Time per request:       126.434 [ms] (mean)
Time per request:       1.264 [ms] (mean, across all concurrent requests)
Transfer rate:          65852.24 [Kbytes/sec] received
  
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    1   2.7      0      11
Processing:    33  120  20.6    120     180
Waiting:       28  115  20.0    115     179
Total:         44  121  19.2    121     180
  
Percentage of the requests served within a certain time (ms)
  50%    121
  66%    124
  75%    127
  80%    128
  90%    147
  95%    159
  98%    166
  99%    169
 100%    180 (longest request)


查看xcache的命中率

9、部署bbs论坛

Discuz的程序文件解压并且将upload中所有文件放置到网站目录(php服务器的操作)

#unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus

# mv discuz/upload/ /var/www/benet/bbs

设置php-fpm的服务用户为下面文件的属主或者对其设置写权限否则安装时会报错

#cd  /var/www/benet/bbs

#chown -R nobody config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/

#chmod -R 777 uc_server/data/

修改php.ini文件

short_open_tag = On

# service php-fpm restart

web服务器也需要有静态文件(apache服务器上操作)

#unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus

# mv Discuz/upload/ /var/www/benet/bbs

设置httpd的服务用户对指定文件也需要有写权限

#cd  /var/www/benet/bbs

#chown -R daemon config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/

在数据库服务器上创建bbs数据库及授权帐户

mysql> create database bbsdb;

Query OK, 1 row affected (0.01 sec)

mysql> grant all on bbsdb.* to runbbs@'%' identified by 'pwd@123';

Query OK, 0 rows affected, 1 warning (0.03 sec)

 

置完成之后输入httd//192.168.31.83/bbs/install即可安装

填写数据库的相关信息添加数据库服务器的地址和MariaDB创建的数据库和用户密码而后在设置bbs的管理员帐号密码就可以继续安装了。

剩下的根据提示安装即可。

出现上面这种情况是由于php服务器安装了discuz之后导致程序发生变化从而导致动态服务器和静态服务器的程序不一致只需要手动把bbs服务器的文件和web服务器进行一次同步即可如果想实现自动同步需要使用其他服务如initory+rsync、sersync等工具。

#scp -r /var/www/benet/bbs/* root@192.168.31.83:/var/www/benet/bbs/

动态服务器和静态服务器同步文件之后再次访问bbs的网址就正常了。

 


本文出自 “一盏烛光” 博客,谢绝转载!

Linux 详解http协议
Linux Zibbix3.0安装详解
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }