Apache优化(一)

一、Apache优化

在我们安装完Apache的时候虽然我们可以成功的访问到了页面,但是在实际环境中这样是远远不够的,还需要很多的调整优化才可以正常的提供服务。

1、Apache的优化配置

apache运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰,对于硬件指标中,对性能影响最大的就是内存了,对于静态的内容包括(图片,css文件等)它决定了apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取的内容的机会也就越少,大内存可以提高静态站点的速度;

对于动态高负载站点来说,每个请求保存的时间多一些,apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,而进程或者线程的数量与内存的笑傲近似成正比,因此增大内存对提高动态站点的负载和运行速度也是很有帮助的。

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

 

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

当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(默认为 5 个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork 模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。
缺点:由于在 mpm_prefork 模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。

优点:mpm_prefork 模块的优点在于它的每个子进程都会独立处理对应的单个请求
总结:Prefork 在效率上要比 Worker 要高,但是内存使用大得多不擅长处理高并发的场景。


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

总结:prefork效率速度要高于worker然而perfork内存等等要比worker要高,worker多进程多线程适合高并发场合下使用

Event 模式:
这是 Apache 最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,一worker 模式不同的是在于它解决了 keep-alive长连接的时候占用线程资源被浪费的问题,在event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程。

Apache2.4安装可以参考我这篇文章:http://blog.csdn.net/qq_39591494/article/details/78726580

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

Apache优化(一)_第1张图片

 


    StartServers             5      //Apache启动时默认的子进程数
    MinSpareServers          5      //Apache启动时最小的闲置进程数
    MaxSpareServers         10      //Apache启动时最大的闲置进程数

    MaxRequestWorkers      250      //设置了允许同时的最大请求数量-可以理解为并发 默认为250
    MaxConnectionsPerChild   0

 

设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild”个请求后将自动销毁。0 意味着无限,即子进程永不销毁。虽然缺省设为 0 可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。在 Apache2.3.9 之前称之为 MaxRequestsPerChild。

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

 

1)查看Apache加载模块

 

#[root@yankerp extra]# apachectl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 authn_file_module (shared)
 authn_core_module (shared)
 authz_host_module (shared)
 authz_groupfile_module (shared)
 authz_user_module (shared)
 authz_core_module (shared)
 access_compat_module (shared)
 auth_basic_module (shared)
 reqtimeout_module (shared)
 filter_module (shared)
 mime_module (shared)
 log_config_module (shared)
 env_module (shared)
 headers_module (shared)
 setenvif_module (shared)
 version_module (shared)
 mpm_event_module (shared)
 unixd_module (shared)
 status_module (shared)
 autoindex_module (shared)
 dir_module (shared)
 alias_module (shared)

2)查看Apache工作模式

 

 

 

Apache优化(一)_第2张图片

目前我们的工作模式是event那么如何修改成prefork模式呢如下:

打开Apache主配置开启以下:(在开启prefork模式之前先关闭event模式)

修改前:

Apache优化(一)_第3张图片

修改后:

修改完后不需要重启,直接查看即可:

Apache优化(一)_第4张图片

 

Apache在worker模式下重要参数

我们还是打开MPM.conf文件往下滑就可以看到,如下:

[root@yankerp ~]# vim /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf

    StartServers    3    //Apache启动时默认开启的子进程数    

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

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

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

MaxRequestWorkers      400    //最大请求数量    

MaxConnectionsPerChild   0

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

 

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

 

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 选项引用

 

3、开启Apache的Zgip(deflate)功能

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

两张图理解,如下:

Apache优化(一)_第5张图片

Apache优化(一)_第6张图片

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

 

[root@yankerp ~]# vim /usr/local/http-2.4.23/conf/httpd.conf 

 

 

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

 

 

 

vim /usr/local/http-2.4.23/conf/httpd.conf

 


 DeflateCompressionLevel 9
 SetOutputFilter DEFLATE
 AddOutputFilterByType DEFLATE text/*
 AddOutputFilterByType DEFLATE application/ms* application/vnd*
 AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
 SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
 SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
 SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary


DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog logs/deflate_log.log deflate

 

DeflateCompressionLevel 9#压缩程度的等级,预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡。
SetOutputFilter DEFLATE #设置输出过滤器,对输出启用压缩,必须的,就像一个开关一样,告诉 apache 对传输到浏览器的内容进行压缩
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#设置不对后缀gif,jpg,jpeg,png 的图片文件进行压缩。注:?:表示不会捕获 ( )里内容了
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary#同上,就是设置不对 exe,tgz,gz 等的文件进行压缩
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary#同上就是设置不对 pdf,avi,mp3 等的文件进行压缩

Apache优化(一)_第8张图片

 

 

 

添加完成之后我们检测apache主配置是否配置成功使用apachectl -t来检测

随后我们打开谷歌浏览器访问http,在访问之前按F12键 出现以下信息表示成功!(若第一次没出现,刷新即可!)

Apache优化(一)_第9张图片

4、配置 mod_expires 模块
这个非常有用的优化,mod_expires 可以减少 20-30%左右的重复请求,让重复的用户对指定的页面请求结果都 CACHE 在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。

这个模块控制服务器应答时的expires头部内容和cache-control头的max-age指令,有效期可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。
未启用expire的效果如下

启用expire缓存

mod_expires 的安装配置:

启用 expires_module

LoadModule expires_module modules/mod_expires.so 在主配置中开启

Apache优化(一)_第10张图片

然后添加 Expires 配置规则 如下:

 


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 minute"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minute"

 

 

Apache优化(一)_第11张图片
添加完成后重新加载配置文件,再次测试

 

 

 

Apache优化(一)_第12张图片

ExpiresDefault 和 ExpiresByType 指令同样能够用易懂的语法格式进行定义:
ExpiresDefault " [plus] {}"
ExpiresByType type/encoding " [plus] {}"

其中是下列之一:
• 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"

有关 Apache Expires Module 的介绍,可以参阅其官方文档:http://httpd.apache.org/docs/2.4/mod/mod_expires.html

 

5、Apache禁止目录遍历

什么意思呢?比如我把网页根目录index.html删除,再次访问显示如下:



我们发现有2222这个图片,当我们在网页根目录下创建目录或文件时,它都会显示出来,如下:

Apache优化(一)_第13张图片

Apache优化(一)_第14张图片

将 Options Indexes FollowSymLinks 中的 Indexes 去掉,就可以禁止 Apache 显示该目录结构

Apache优化(一)_第15张图片

 

6、Apache 隐藏版本信息

以下是apache没有隐藏版本信息的访问

Apache优化(一)_第16张图片

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

2、修改 httpd-default.conf

vim   /usr/local/http-2.4.23/conf/extra/httpd-default.conf

找到
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature  off

Apache优化(一)_第17张图片

重启服务后测试:

Apache优化(一)_第18张图片

到这里已经隐藏了,但是有什么用呢?

攻击者往往是先通过扫描软件的版本信息然后进行针对性的攻击,在apache每个版本都会有一定的BUG攻击者就可以通过某个版本的某个BUG采取一些攻击行为!

 

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

 

以上环境为Apache2.4.23可以参考我的这篇文章进行安装:http://blog.csdn.net/qq_39591494/article/details/78726580

 

 

2017年倒计时!!!

这个图片插的就是很累,希望对您有所帮助,再见~~

 

 

你可能感兴趣的:(Apache,Linux,Linux入门到熟练)