长治网站建设
Apache2.2安全配置和性能优化



Apache2.2安全配置和性能优化


一、 Apache禁止目录遍历


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




二、 apache 隐藏版本信息
1.隐藏Apache版本信息


测试默认 apache 的状态信息
[root@1314it conf]# curl -Is localhost
HTTP/1.1 200 OK
Date: Tue, 16 Nov 2010 04:20:15 GMT
Server: Apache/2.2.3 (CentOS) DAV/2 PHP/5.1.6 mod_perl/2.0.4 Perl/v5.8.8
X-Powered-By: PHP/5.1.6
Connection: close
Content-Type: text/html; charset=GB2312


[root@1314it conf]#


修改主配置文件 httpd.conf
ServerSignature Off
ServerTokens Prod


重启 apache 测试


测试隐藏版本号后 apache 的状态信息
[root@1314it conf]# curl -Is localhost
HTTP/1.1 200 OK
Date: Tue, 16 Nov 2010 04:21:41 GMT
Server: Apache
X-Powered-By: PHP/5.1.6
Connection: close
Content-Type: text/html; charset=GB2312


[root@1314it conf]#
三、 apache隐藏banner(版本),关闭trace
Apache Banner的隐藏方法, 
修改httpd.conf文件,设置以下选项:
ServerTokens ProductOnly
ServerSignature Off
关闭trace-method
TraceEnable off
另外apache可以在编译的时候,故意混淆banner信息,达到隐藏的目的


四、 apache并发数调整
在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf
可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行 apachectl -l 来查看:
Compiled in modules:
              core.c
              prefork.c
              http_core.c
              mod_so.c
看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:
<IfModule mpm_prefork_module>
   StartServers    5
   MinSpareServers  5
   MaxSpareServers  10
   MaxClients     150
   MaxRequestsPerChild   0
</IfModule>
2.要加到多少?
连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。
查看当前的连接数可以用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l
计算httpd占用内存的平均数:
ps aux|grep -v grep|awk '/httpd/{sum+=;n++};END{print sum/n}'
由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。
服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368
约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)
五、 控制最大连接数的MaxClients ,因此可以尝试配置为:
<IfModule mpm_prefork_module>
                StartServers                      5
                MinSpareServers                   5
                MaxSpareServers                  10
                ServerLimit                    5500
                MaxClients                     5000
                MaxRequestsPerChild               100
</IfModule>
注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。
重启httpd后,通过反复执行pgrep httpd|wc -l 来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访 问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。
(MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)
更佳最大值计算的公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5


六、 Apache日志切割
方法1、使用 cronolog 为每一天建立一个新的日志
安装cronolog程序
主配置文件中的使用方法
ErrorLog "|bin/cronolog logs/error_%Y%m%d.log"
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined
虚拟主机配置文件中的使用方法
ServerAdmin webmaster@localhost
DocumentRoot "E:/htdocs"
ServerName localhost
ErrorLog "|bin/cronolog logs/localhost/error_%Y%m%d.log"
CustomLog "|bin/cronolog logs/localhost/access_%Y%m%d.log" combined
方法2使用 rotatelogs 每隔一天记录一个日志
主配置文件中的使用方法


ErrorLog "|bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
虚拟主机配置文件中的使用方法


ServerAdmin webmaster@localhost
DocumentRoot "E:/htdocs"
ServerName localhost
ErrorLog "|bin/rotatelogs -l logs/localhost/error_%Y%m%d.log 86400"
CustomLog "|bin/rotatelogs -l logs/localhost/access_%Y%m%d.log 86400" combined


注意:
这两个管道日志文件程序还有一点不同之处是使用 cronolog 时如果日志是放在某个不存在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建,这一点要特别注意
七、 apache对页面进行压缩和页面缓存来提升性能


Apache来对页面进行压缩和页面缓存来提升性能.为了实现这些功能需要三个模块mod_deflate、mod_expires和mod_headers


要实现这些东西的配置先在httpd.conf文件下找到下面三个地方
文本代码
#LoadModule deflate_module   modules/mod_deflate.so   
#LoadModule expires_module   modules/mod_expires.so   
#LoadModule headers_module   modules/mod_headers.so  
    同时去掉前面的“#”,这些模块功能已经开启了,下面我们在配置GZIP和Expires了。配置GZIP和Expires也很容易,我们只需要在httpd.conf 配置文件中启用并进行相关的配置即可,配置如下:
文本代码
<IfModule   mod_expires.c>    
 ExpiresActive   on   
 ExpiresDefault "now plus 1   day"  
 ExpiresByType image/x-icon "access plus 10   year"  
 ExpiresByType image/gif "access plus 1   month"  
 ExpiresByType image/jpeg "access plus 1   month"  
 ExpiresByType text/css "now plus 1   month"  
 ExpiresByType text/javascript "now plus 1   month"  
 ExpiresByType application/x-javascript "now plus 1   month"  
 ExpiresByType text/html "now plus 5   minutes"  
 ExpiresByType text/plain "now plus 1   month"  
 ExpiresByType image/js "access plus 1   month"  
 ExpiresByType application/x-shockwave-flash "access plus 1   week"  
 <FilesMatch   ".(gif|jpe?g|png)$">   
  Header set   Cache-Control "max-age=604800"  
  Header unset   ETag   
 </FilesMatch>   
</IfModule>   
FileETag   none   
<ifmodule   mod_deflate.c>   
 DeflateCompressionLevel   9  
 AddOutputFilterByType DEFLATE text/html text/plain text/xml   application/x-httpd-jsp   
 AddOutputFilter DEFLATE js   css   
</ifmodule>   
<Location   "/">   
 SetOutputFilter   DEFLATE   
 BrowserMatch ^Mozilla/4   gzip-only-text/html   
 BrowserMatch ^Mozilla/4.0[678]   no-gzip   
 BrowserMatch bMSIE !no-gzip   !gzip-only-text/html   
 SetEnvIfNoCase Request_URI   .(?:gif|jpe?g|png)$ no-gzip dont-vary   
 Header append Vary   User-Agent   env=!dont-vary   
</Location>  




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


第1步
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压缩过的页面进行下载,而无法正常显示。
第2步
  在httpd.conf中加入以下代码,可以加到任何空白地方,不了解apache的朋友,如果担心加错地方,就放到http.conf文件的最后一行,如果是虚拟服务器可以写.htaccess文件里面,然后放在项目下即可。
<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE    #必须的,就像一个开关一样,告诉apache对传输到浏览器的内容进行压缩


    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


    AddOutputFilterByType DEFLATE text/* #设置对文件是文本的内容进行压缩,例如text/html  text/css  text/plain等
    AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript #这段代码你只需要了解application/javascript application/x-javascript这段就可以了,这段的意思是对javascript文件进行压缩
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp #这段是告诉apache对php类型的文件进行压缩


    BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x 有一些问题,所以只压缩文件类型是text/html的
    BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08 有更多的问题,所以不开启压缩
    BrowserMatch bMSIE !no-gzip !gzip-only-text/html # IE浏览器会伪装成 Netscape ,但是事实上它没有问题
</IfModule>

ServerTokens ProductOnly
ServerSignature Off
TraceEnable off


<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    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
    AddOutputFilterByType DEFLATE text/*
    AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4.0[678] no-gzip
    BrowserMatch bMSIE !no-gzip !gzip-only-text/html
</IfModule>

2006-2014 IT0355.com 山西中联科创科技有限公司. All Rights Reserved.
电话:0355-3728808 传真:0355-3728808
ICP备案号:晋ICP备06003721号本站已通过国际W3C认证
关键字:中联科创,长治网站建设,长治网站推广,长治网络工程,长治软件开发,山西网站建设,山西软件开发 长治五金网