首页 » PHP » Apache的各种优化以及安全配置详解

Apache的各种优化以及安全配置详解

原文 http://blog.csdn.net/Kangshuo2471781030/article/details/79174066

2018-01-28 02:00:13阅读(270)

简介:

Apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给Apache一个单独的主机以免受

到其他应用的干扰。各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、JavaScript文件、css文件等)

它决定了Apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就会越少,大内存可以极大提高静态站点的速度;

对动态高负载站点来说,每个请求保存的时间更多一些,Apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,

而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利。

其次是硬盘的速度,静态站点尤为突出,Apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点

也要不断的加载web程序(php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高

Apache的性能是有积极意义的。

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

 

一、Apache的几种工作模式以及调优

Apache详细安装过程请点击这条链接即可查看:http://blog.csdn.net/kangshuo2471781030/article/details/79171344

Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做

“多进程处理模块”(Multi-Processing Module,MPM),也叫做工作模式。

1.Prefork(一个非线程型的):

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

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

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

Apache的各种优化以及安全<a href=配置详解" src="http://img.blog.csdn.net/20180126171916741?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvS2FuZ3NodW8yNDcxNzgxMDMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

参数解释:

# prefork MPM

<IfModule mpm_prefork_module>

StartServers    5:#Apache启动时默认开始的子进程数

MinSpareServers  5 #最小的闲置子进程数

MaxSpareServer   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 httpd | 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时代由于服务器硬件的升级,硬件已经不再是限制,所以使用ServerServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值要不小于MaxClients。

(4.)查看Apache加载的模块

[root@kang ~]# apachectl -t -D DUMP_MODULES
Apache的各种优化以及安全配置详解

[root@kang ~]# apachectl -M
    或

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

Apache的各种优化以及安全配置详解

(5.)如何修改prefork参数和启用prefork模式

1.[root@kang ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf 
2.[root@kang ~]# vim /usr/local/http-2.4.23/conf/httpd.conf 
Apache的各种优化以及安全配置详解Apache的各种优化以及安全配置详解

重启httpd服务:

[root@kang ~]# service  httpd restart
Apache的各种优化以及安全配置详解

2.Work模式(多线程多进程):

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

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

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


Apache的各种优化以及安全配置详解

参数解释:

# worker MPM

<IfModule mpm_worker_module>

StartServers    3 :#apache启动时候默认开始的子进程数

MinSpareThreads   75:#最小空闲数量的工作线程

MaxSpareThreads  250:#最大空闲数量的工作线程

ThreadsPerChild   25:#每个子进程产生的线程数量

MaxRequestWorkers  400:#与prefork模式相同

MaxConnectionsPerChild  0:#与prefork模式相同

</IfModul>


注意:

(1.)work由主控制进程生成“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.)进程与线程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体。

与进程的区别是:

地址空间:进程内的一个执行单元,进程至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间。

资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

线程是处理器调度的基本单位,但进程不是

二者均可并发执行

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

进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。


3.Event模式:

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

Apache配置参数详解

(1.)keepAlive On/Off

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

(2.)KeepAliveTimeOutnumber

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

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹