小生博客:http://xsboke.blog.51cto.com
小生 Q Q:1770058260
-------谢谢您的参考,如有疑问,欢迎交流
一、 Apache优化:工作模式
Apache2.4版本有三个模式,prefork、worker、event,而在apache2.4版本之前没有event工作模
式,查看工作模式:httpd -V
线程与进程的区别
l 进程:维护程序所需资源,不处理用户的请求
l 线程:处理应用所需要完成的操作,在此也就是处理用户的请求
l 一个程序至少有一个进程,一个进程至少有一个线程
l 进程在执行过程中有独立的内存单元,而线程共享进程的内存单元
Prefork工作模式
l Prefork首先创建多个子进程,然后每个子进程只有一个线程,通过线程处理客户端请求,所以prefork每个进程只能处理一个请求
l 优点:Prefork适用于对稳定性和效率要求较高的生产环境,因为每个线程都独享一个进程
l 缺点:在处理多并发高负载时,prefork工作模式将占用大量的内存
例:配置prefork工作模式
Prefork参数配置:httpd-mpm.conf
如果最大请求进程数超过256需要在MaxRequestWorkers参数前添加参数ServerLimit并且指定最大并发数,2.3.1以前的版本MaxRequestWorkers被称为MaxClients,现在依然支持这个参数。一般最大请求进程数设置为物理内存的1/2
Apache的主配置文件:httpd.conf
重启apache服务,并查看工作模式
3. Worker工作模式
l Worker首先创建多个子进程,然后每个子进程创建多个线程,一个线程可以处理一个请求,所以
worker工作模式中一个子进程可以处理多个请求
l 优点:适用于高并发的生产环境,因为线程是共享子进程的内存的,所以内存占用较少
l 缺点:如果一个线程出现问题,也会导致同一子进程下的其他线程出现问题
例:配置worker工作模式
worker参数配置:httpd-mpm.conf
ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果需要设置为64以上,那就需要在这个参数前添加ThreadLimit参数,它的最大缺省值是20000
Worker的MaxRequestWorkers参数和perfork的MaxRequestWorkers参数一样,如果需要设置
为256以上,则在这个参数前还需要添加参数ServerLimit并且指定最大请求子进程数
Apache的主配置文件:httpd.conf
重启httpd服务,并且查看工作模式
4. Event模式
l Event就是worker模式的变种,他解决的keep-alive长连接的时候占用线程资源被浪费的问题,
在event模式中会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时
候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处
理。
l 缺点:event模式不能很好的支持https的访问(HTTP认证相关的问题)。
二、 Apache优化:配置参数
三、 Apache优化:开启Gzip压缩传输
Gzip的模版名叫mod_deflate,使用此功能必须安装此模版
Gzip压缩可以将响应的数据压缩,以降低带宽占用,比如一个100KB的文件压缩成10KB进行传输
设置压缩比率,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源
未使用Gzip压缩时
使用Gzip压缩后
压缩传输需要的模版:mod_deflate.so和mod_headers.so
安装压缩传输需要的模版
l 可以使用DSO方式安装,上面已经讲解过安装方法,这里不再复述
l 在生产环境中,因为是动态安装的模版,安装模版后,最好使用httpd的优雅启动去重新加载配置,这样不会影响httpd服务的运行
2. 修改httpd.conf配置文件
启用deflate和headers模版
为了方便调用libz.so
执行命令:ln -s /usr/local/zlib/lib/libz.so /usr/lib/
添加压缩传输的相关代码
还可以设置日志输出:就是将输入输出的流量记录到日志(生产环境一般不用)
重启httpd服务
3. 测试
首先在存放网页的目录下创建两个文件,一个.png文件(不进行压缩传输),一个.php文件(进行
传输压缩)
本例使用的是QQ浏览器
首先访问png结尾的图片
访问php网页
通过查看日志验证
四、 Apache优化:expires缓存
Mod_expires模块可以通过在客户机上缓存,减少20%-30%左右的重复请求
1. 首先查看未启用时的应答报文
2. 启用expires模块
修改httpd.conf配置文件,启用expires模版。并且添加expires配置规则
ExpiresByType命令格式:
ExpiresByType type/encoding "<base> [plus] {<num> <type>}"
解释:
type/encoding:类型/编码
<base>:指定缓存时间以什么为起点,access和now是以客户机的访问时间为起点,modification是以此文件的修改时间为起点
Plus:关键字,可选<num>:指定缓存时长,必须是整数<type>:缓存时长的单位,常用有month(月)、weeks(周)、days(天)、hours(小时)、minutes(分钟)、seconds(秒)、years(年)
Access可以写为A时间长可以以秒计并且不添加时长单位,如:ExpiresByType image/gif A2592000
3. 重启httpd服务,并且进行验证
通过curl命令获取响应头部
五、 apache优化:禁止目录遍历
当找不当某个web服务器的页面时,浏览器将会遍历整个web目录,并且显示,这样是极不安全的
没有禁止遍历目录前
1. 修改httpd主配置文件,禁止目录遍历
2. 重启服务,并且进行测试
六、 Apache优化:在应答首部中隐藏版本信息
未隐藏前
在应答报文中包含程序名及其版本号,是极不安全的,这很有可能成为攻击者的一个机会
1. 隐藏版本号
当apache安装后,就只能隐藏版本号了,程序名是隐藏不了的
现在我们隐藏版本号
首先修改模版文件:htttpd-default.conf文件
然后修改httpd.conf配置文件
重启httpd服务,使配置生效
然后再次查看相应报文,发现server只标识了程序名,版本号被隐藏
2. 自定义程序名和版本号
必须在编译安装apache前,通过修改源码文件,才能实现隐藏程序名
首先修改源码包include目录下的ap_release.h文件
将这些值修改为自己想要的值,然后再编译安装,应答报文里面的程序名及其版本号就彻底改
变了
我将这些值修改为:
然后编译安装,访问web服务器,发现响应报文不再显示真正的程序名和版本号
本文出自 “小生BK” 博客,请务必保留此出处http://xsboke.blog.51cto.com/12096269/1914370
原文地址:http://xsboke.blog.51cto.com/12096269/1914370