目前总结出来的一些优化配置:
配置适用环境 linux + apache2.2(prefork模式) + jk1.2.26 + tomcat6
(a)apache端需要配置的核心参数:apache/conf/httpd.conf
- Timeout 10
- KeepAlive On
- MaxKeepAliveRequests 5
- KeepAliveTimeout 5
- <IfModule mpm_prefork_module>
- ServerLimit 3000
- StartServers 750
- MinSpareServers 5
- MaxSpareServers 100
- MaxClients 3000
- MaxRequestsPerChild 10000
- </IfModule>
(b)workers.properties配置:
- worker.list=loader
- worker.loader.type=lb
- #两tomcat负载均衡
- worker.loader.balance_workers=tomcat1,tomcat2
- #不同步session
- worker.loader.sticky_session=false
- #负载1
- worker.tomcat1.type=ajp13
- worker.tomcat1.host=localhost
- worker.tomcat1.port=8009
- #负载均衡因子,决定apache分发的比例
- worker.tomcat1.lbfactor=1
- worker.tomcat1.socket_timeout=10#配置超时时间
- worker.tomcat1.connection_pool_timeout=600#配置关闭空闲连接时间
- #负载2
- worker.tomcat2.type=ajp13
- worker.tomcat2.host=localhost
- worker.tomcat2.port=8109
- #负载均衡因子,决定apache分发的比例
- worker.tomcat2.lbfactor=1
- worker.tomcat2.socket_timeout=10#配置超时时间
- worker.tomcat2.connection_pool_timeout=600#配置关闭空闲连接时间
(c)tomcat/conf/server.xml配置:
- <Connector port="8009"
- enableLookups="false"
- maxProcessors="0"
- maxThreads="3000"
- minSpareThreads="100"
- maxSpareThreads="200"
- protocol="AJP/1.3"
- enableLookups="false"
- connectionTimeout="600000"
- redirectPort="8443" />
优化配置核心关键:
(一)prefork模式下(其他模式下不适用),apache需要优化的主要参数:
ServerLimit 3000
StartServers 750
MinSpareServers 5
MaxSpareServers 100
MaxClients 3000
MaxRequestsPerChild 10000
首先来看看apache各个参数的意义(引号里引用的是官方文档的描述):
(1)ServerLimit和MaxClients 服务器最大同时响应请求数
这个就是你当前配置的apache最大的并发响应数,对应的是apache的进程数,两个参数同时修改,MaxClients不得大于ServerLimit参数。
ServerLimit的大小,取决于你系统的资源,每个apache进程默认占用2M内存,基本可以按照这个公式来计算:最大内存*80%/2M=ServerLimit
(2)StartServers 750 启动时默认启动的进程数
这个参数默认是5,因为apache会通过自动启动新进程来增加响应服务的进程数,这个值不做调整的也是可以的,会由默认的5增加到满足服务的进程数,但是会出现开始启动时的卡住。
小启动参数有一个好处:就是可以让传递后后端tomcat的压力缓慢增加上来,而不是一下子增加压力。可以把这个调整到当前服务最大的并发数,当前服务最大并发连接数,可以通过监控apache进程个数:ps -ef | grep httpd | wc -l 来获得。不用调得太大,否则是无谓增加apache通过jk去跟tomcat建立的连接。
注意:apache进程跟tomcat建立连接后,不会释放此连接,会一直保持连接,直到timeout,如果没有timeout时间,就会永久连接。timeout的设置,会在后面jk配置里说明。
所以不要一次启动太多的apache进程,只启动足够用的进程即可。其他增加的流量,apache会自动调整进程数,直到MaxClients参数限定的范围。
(3)MinSpareServers 5 最小空闲进程
MinSpareServers指令设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。
(4)MaxSpareServers 10 最大空闲进程
MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
可以调整这两个参数,但是这两个参数的值不能设得太大,否则apache进程太多,会导致对应开启的tomcat进程也会很多。
官网上关于这两个参数都有这么句话:“将此参数设的太大通常是一个坏主意。”
在一台压力大(并发访问2800)的服务器上,MaxSpareServers这个值设置的是200。
设置了这个值的好处是不会有太多的空闲的进程在消耗资源,同时减少apache和tomcat的连接端口。
关闭空闲apache进程的同时,会释放jk连接,同时释放tomcat连接数,进而减少系统资源消耗。
(5)MaxRequestsPerChild 10000
"MaxRequestsPerChild指令设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。
将MaxRequestsPerChild设置成非零值有两个好处:
* 可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
* 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
注意
对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。"
也就是说实际上这个时候子进程最大连接数等于MaxRequestsPerChild*MaxKeepAliveRequests
所以在开启KeepAlive后,需要同时设置MaxRequestsPerChild和MaxRequestsPerChild,确保每个apache进程在服务一定请求数后会关闭,重新开启新的子进程,避免apache进程异常导致的内存泄露和资源占用。
(6)Keep-Alive
默认:ON
发送的请求,在MaxRequestsPerChild里面只算一个,不管这个连接发送了多少个请求。
(7)MaxKeepAliveRequests
默认:100
"一个建立好的Keep-Alive连接,允许发送的请求的个数。一旦建立连接,要么就是个数达到了断开,要么就是等KeepAliveTimeout时间到了断开连接。
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。"
这个数字的设置,必须考虑在一个时间段内,同一个用户访问你的服务会发多少请求。要结合KeepAliveTimeout参数来考虑。
举个例子,用户需要间隔时间不大于KeepAliveTimeout的时间内,连续请求10个文件,那么这个参数就应该设置成10,如果用户在连续时间里不断请求访问,则这个数值得设置得更多。否则就重新建立连接下载。一旦用户连续进行了10个请求后,并且这个用户肯定在完成这些请求后的5秒内不会再请求,甚至要在之后的很长时间后请求,那么这个KeepAliveTimeout时间就可以设置得很短,以便尽早断开这种用户,把资源让个其他用户。
(8)KeepAliveTimeout
默认:5
"在一个建立好的Keep-Alive连接上,在MaxKeepAliveRequests个数未满的情况下,等待下一个请求的时间。"
如果有请求到达,那么apache等待IO响应的timeout时间时间开始生效,timeout时间没等到响应,连接被断开;如果KeepAliveTimeout时间内,没有请求到达,连接就被断开。
具体设置可以参考配合MaxKeepAliveRequests参数。同时这个参数又受TimeOut参数影响,在一次成功连接中,TimeOut时间内没有等到响应,也会断开连接。
(9)TimeOut
默认:300
"TimeOut指令用于设置Apache等待以下三种事件的时间长度:
1. 接受一个GET请求耗费的总时间。
2. POST或PUT请求时,接受两个TCP包之间的时间。
3. 应答时TCP包传输中两个ACK包之间的时间。
我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。”
(二 )调整jk参数配置和tomcat设置
jk连接主要给每个worker添加了两个参数:
worker.tomcat1.type=ajp13
worker.tomcat1.host=localhost
worker.tomcat1.port=8109
worker.tomcat1.lbfactor=1
worker.tomcat1.socket_timeout=10
worker.tomcat1.connection_pool_timeout=600
首先来了解一下这两个配置参数:
worker.tomcat1.socket_timeout=10
worker.tomcat1.connection_pool_timeout=600
socket_timeout默认为0
设置JK与远程服务器的Socket连接超时秒数,如果超出此秒数则产生一个错误,并再次重试。如果为0,JK会一直等下去。在连接出现异常的时候,尽快关闭连接,从而保证无用的socket会被回收。
connection_pool_timeout:默认值0,单位秒
在连连池中维护的非活动连接连续多少秒后被释放。如果为0,则不释放。详细可以参考tomcat官方文档,jk在处理连接的时候,是用一个线程池建立跟tomcat的连接,并且把所有连接都放在连接池。如果这个值为0的时候,它就不会释放任何已经空闲的连接,也就是说这个连接池在某个瞬间压力很大的话,被撑大了就不会小下来。所以这个值一定不能使用默认的0,必须修改。官方推荐是10分钟,也就是600秒。一旦设置了这个值,就一定要注意:必 须同时设置对应的tomcat的ajp连接器配置里的connectionTimeout参数大小跟它完全一致!同时必须注意这两个参数单位不一样:jk connection_pool_timeout单位是秒,而tomcat connectionTimeout单位是毫秒。
来解释一下为什么必须设置两个参数完全一致:这两个参数的意思是在连接空闲多长时间后关闭空闲连接(不包括活动的连接)。想象一下这边apache jk模块开启了一个连接A,连接到tomcat的B,这个连接被固化了,保持在连接池里。这个时候,如果A突然关闭,导致的结果是B返回的数据不知道给谁,tomcat会抛出socket异常;如果B突然关闭,则A突然失去连接,无法进行程序响应,会返回错误给用户。这就是所谓的半连接,一半是开的,另 外一半却关闭了,并且这个时候还不知道对方已经关了,程序会一直单方面开启着自己的这一半,导致资源浪费。所以必须设置两个的空闲关闭时间一致,这样两边同时开启,在空闲时间等待到了相同的时间后,同时关闭。这样jk和tomcat建立的连接在空闲时会慢慢变小,从而保证资源不被浪费,空闲的socket被关闭回收。
调整tomcat配置参数
minSpareThreads="100"
maxSpareThreads="200"
connectionTimeout="600000"
空闲线程不用太多,减少系统负载。同时设置 connectionTimeout和jk的connection_pool_timeout一致,保证空闲连接的同时回收。高并发情况下,这个时间可以设置得短一些,比如:20000 ms
此配额的优点是:
apache空闲线程少,同时产生的通过jk和tomcat建立的永久连接也少,并且和tomcat的连接能在空闲一定时间后自动回收。占用系统socket连接少。
可以通过以下命令对比查看各状态的socket连接:
查看当前tcp/ip连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
查看tcp/ip连接数:cat /proc/net/sockstat
参考文档链接:
apache2.2文档:
- prefork模块说明:
- 中文:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/prefork.html
- 英文:http://httpd.apache.org/docs/2.2/mod/prefork.html
- 各配置参数说明:
- 中文:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mpm_common.html
- 英文:http://httpd.apache.org/docs/2.2/mod/mpm_common.html
tomcat6参数说明文档:http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html
jk workers.properties
参数说明文档:http://tomcat.apache.org/connectors-doc/reference/workers.html
相关推荐
二、Apache 2.2新特性与优化 1. 更强的安全性:Apache 2.2引入了增强的安全特性,如支持SFTP协议,增强了SSL/TLS安全配置,以及对mod_security模块的支持,帮助防御HTTP攻击。 2. 模块改进:更新了多个核心模块,如...
### Apache2.2安全配置和性能优化 #### 安全配置 **Apache禁止目录遍历:** 为了确保Apache服务器的安全性,防止恶意用户通过遍历目录来获取未授权的文件或者敏感信息,需要对Apache进行相应的配置。在Apache中,...
4. **性能优化**:Apache 2.2提供了多种性能优化策略,如MPM(多进程模块)的选择,预读取(Prefork)、线程化(Worker)或者事件驱动(Event)模式,以及缓存机制和GZIP压缩等。 5. **错误处理与调试**:手册会...
8. **代理功能**:`mod_proxy`模块可以将Apache配置为反向代理,用于负载均衡或隐藏后端服务器。 9. **FastCGI支持**:除了直接集成PHP外,Apache 2.2也支持通过FastCGI接口运行PHP,这在某些情况下可能比`mod_php`...
本手册将深入探讨Apache 2.2的配置、管理和优化,帮助用户充分利用这一强大的开源工具。 一、Apache 2.2安装与配置 1. 安装过程:在不同的操作系统上(如Linux、Windows、Mac OS)安装Apache 2.2的步骤有所不同。...
3. 性能优化:通过配置缓存模块(如mod_cache)、负载均衡(mod_proxy)和多线程模型(如MPM Worker或MPM Prefork),可以提升服务器性能和响应速度。 四、虚拟主机 Apache 2.2支持在同一台服务器上托管多个独立的...
总之,“Apache 2.2完全手册”会深入探讨这些主题,并提供详细的配置示例和故障排除策略,是管理和优化Apache服务器的宝贵资源。通过深入学习,你可以更好地驾驭这个强大的Web服务器,为你的网站提供高效、安全的...
Apache2.2可以作为反向代理服务器,通过mod_proxy模块转发请求到其他服务器,实现负载均衡或内容缓存。mod_cache可以将经常访问的资源存储在本地,提高响应速度。 总之,Apache2.2中文手册是一个全面的参考资料,...
5. **性能优化**:Apache 2.2引入了MPM(多进程模块),如Prefork MPM和Worker MPM,它们分别对应于进程模型和线程模型,以提高服务器处理并发请求的能力。用户可以根据服务器硬件资源和负载情况选择合适的MPM。 6....
### Apache2.2配置文件详解:深入理解Apache Web服务器配置 Apache HTTP Server是全球最广泛使用的Web服务器之一,其灵活性和可定制性为网站开发者提供了强大的功能与控制能力。在Apache2.2版本中,主要的配置文件...
打开`C:\Apache24\conf\httpd.conf`,这是Apache的主要配置文件。我们需要在这里设置PHP模块的支持。找到`#LoadModule php_module modules/mod_php.so`这行,去掉前面的注释符号,使其变为`LoadModule ...
2. MPM(多进程模块):Apache 2.2有多种MPM,如Prefork、Worker和Event,选择合适的MPM可以优化服务器性能。 六、安全设置 1. SSL/TLS:通过mod_ssl模块提供HTTPS支持,配置证书和密钥,保障数据传输的安全。 2....
4. **性能优化**:Apache2.2手册还涵盖性能调整策略,如使用预加载(mod_prefork)或线程化模型(mod_mpmt),以及如何通过调整MaxClients、KeepAliveTimeout等参数来提高服务器响应速度和处理能力。 5. **日志和...
本手册详细介绍了Apache2.2的配置、管理和优化,是学习和深入理解Apache服务器操作的关键资源。 一、Apache2.2的基础架构 Apache2.2基于模块化设计,这意味着你可以根据需求选择安装和启用哪些功能模块。这些模块...
通过阅读**Apache2.2中文手册.chm**,用户可以深入了解Apache2.2的配置、管理和优化,从而更好地利用这个强大的Web服务器。这份手册详细解答了各种常见问题,并提供了丰富的实例来帮助读者理解和实践。
Apache 2.2 是一个非常重要的开源Web服务器软件,它基于C语言编写,广泛应用于Linux系统。源码包是理解其工作原理、进行定制化开发或优化性能的基础。本源码包提供了完整的Apache 2.2版本源代码,对于学习C网络编程...
对于使用mod_jk与Tomcat进行负载均衡的情况,也需要切分mod_jk的日志: ```apacheconf JkLogFile "|D:/Program Files/Apache Software Foundation/Apache2.2/bin/cronolog.exe D:/Program Files/Apache Software ...