一、 安装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=event2)支持event3)支持异步读写4)在每个模块及每个目录上指定日志级别5)增强版的表达式分析器6)每请求配置:<If>,<Elseif>7)毫秒级别的keepalive timeout8)基于FQDN的虚拟主机不再需要NameVirtualHost指令9)支持使用自定义变量

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

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

 [root@www ~]# rpm -q httpd

安装apache2.4.23

1)下载源码包:

httpd-2.4.23.tar.gzapr-1.5.2.tar.gzapr-util-1.5.4.tar.gzzlib-1.2.8.tar.gzpcre-8.39.tar.gz

注:apr(Apache Portable Runtime)Apache可移植运行库,它是一个对操作系统调用的抽象库,用来实现Apache内部组件对操作系统的使用,提高系统的可移植性。

2)安装apr和apr-util
 [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[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
3)安装zlib
 [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
4)安装pcre
 [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
5)安装openssl

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

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[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

错误排查:

在linux下编译安装openssl, 执行./config的时候出现如下错误:

 make: Warning: File `Makefile.org' has modification time 3.1e+07 s in the futureMakefile is older than Makefile.org, Configure or config.Reconfigure the source tree (via './config' or 'perl Configure'), please.make: *** [Makefile] Error 1

从字面的意思就可以看出, 其实就是系统时间问题, 你仔细看下你的系统时间可能和目前的时间有很大的差距使用data命令或者ntpd把时间调整过来就不会提示错误啦。

调整方法:

 date  -s  “2016-10-25 21:20:30”
6)安装apache2.4.23
 [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[root@www httpd-2.4.23]# make && make install

相关参数解释:--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或者most,all表示包含所有模块,most表示包含大部分常用模块--enable-mods-shared=most: 明确指明要以DSO方式编译的模块,<MODULE-LIST>为空格分隔的模块名列表、all或者most,all表示包含所有模 块,most表示包含大部分模块--enable-mpms-shared=all: 启用MPM所有支持的模式,这样event、worker、prefork就会以模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了。--with-mpm=event: 指定启用的mpm模式,默认使用enevt模式,在apache的早期版本2.0默认prefork,2.2版本是worker,2.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调优的一个重要选项之一。


7)优化http程序执行路径
 [root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/[root@www httpd-2.4.23]# vim /usr/local/http-2.4.23/conf/httpd.confServerName www.benet.com            //设置其中的ServerName值,否则启动报错
8)开启apache服务器:
 /usr/local/http-2.4.23/bin/apachectl start
9)设置开机后自动启动
 [root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd[root@www httpd-2.4.23]# vi /etc/init.d/httpd       //在首行 #!/bin/sh 下面加入两行# chkconfig: 35 85 15# description: apache 2.4.23
10)将 Apache 加入开机自动启动:
 [root@www httpd-2.4.23]# chkconfig --add httpd[root@www httpd-2.4.23]# chkconfig httpd on
11)启动编译好的 Apache 2.4.23:
 [root@www httpd-2.4.23]# service  httpd start[root@www httpd-2.4.23]# netstat -anplt | grep 80tcp6       0      0 :::80                   :::*       LISTEN      4807/httpd
12)客户端测试访问(注意防火墙)
 [root@www httpd-2.4.23]# firewall-cmd --add-service=http --permanent success[root@www httpd-2.4.23]# firewall-cmd --reload success

二、 Apache的优化配置

apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰。

各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript文件、css文件等),它决定了apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利

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

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

1、apache的工作模式:

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

Prefork模式(一个非线程型的):

工作原理:

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

由于在mpm_prefork模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。

Prefork在效率上要比Worker要高,但是内存使用大得多不擅长处理高并发的场景。

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

 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>

注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。  

注3:ServerLimit和MaxClients(MaxRequestWorkers)有什么区别呢?

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

注4:查看Apache加载的模块

 [root@www ~]#apachectl -t -D DUMP_MODULES

  [root@www ~]# apachectl  -M

 [root@www ~]# apachectl –l

如何查看Apache的工作模式呢?可以使用httpd -V 命令查看

 [root@www ~]# httpd -VServer version: Apache/2.4.23 (Unix)Server built:   Oct 25 2016 10:51:39Server's Module Magic Number: 20120211:61Server loaded:  APR 1.5.2, APR-UTIL 1.5.4Compiled using: APR 1.5.2, APR-UTIL 1.5.4Architecture:   64-bitServer MPM:     worker  threaded:     yes (fixed thread count)    forked:     yes (variable process count)Server compiled with....

注5:如何修改prefork参数和启用prefork模式1)[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf

 <IfModule mpm_prefork_module>    StartServers             10         //由5修改为i0    MinSpareServers          5     MaxSpareServers         10     MaxRequestWorkers      250     MaxConnectionsPerChild   0 </IfModule>

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服务

 [root@www ~]# service httpd stop[root@www ~]# service httpd start[root@www ~]# ps aux | grep 'httpd' | grep -v 'grep'root      52814  0.0  0.2 153696  5312 pts/3    T    13:12   0:00 vim httpd-mpm.confroot      53860  0.0  0.1  72404  1952 ?        Ss   14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53861  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53862  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53863  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53864  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53865  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53866  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53867  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53868  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53869  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k startdaemon    53870  0.0  0.0  72404  1448 ?        S    14:41   0:00 /usr/local/http-2.4.23/bin/httpd -k start
Worker模式(多线程多进程):

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

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

 worker MPM<IfModule mpm_worker_module>    StartServers             3          //apache启动时候默认开始的子进程数    MinSpareThreads         75          //最小空闲数量的工作线程    MaxSpareThreads        250          //最大空闲数量的工作线程    ThreadsPerChild         25          //每个子进程产生的线程数量    MaxRequestWorkers      400          //与prefork模式相同    MaxConnectionsPerChild   0          //与prefork模式相同</IfModule>
  • 注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:进程与线程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体,与进程的区别:(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是.(4)二者均可并发执行.进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

Event模式:

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

2、apache配置参数

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

注:以上配置项可在/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选项引用