Apache优化3---java web开发总结(二):linux + apache2.2(prefork模式) + jk1.2.26 + tomcat6

本文介绍Apache服务器的优化配置,包括httpd.conf文件中的核心参数调整、workers.properties文件中的负载均衡配置及tomcat/conf/server.xml中的优化设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

a)apache 端需要配置的核心参数: apache/conf/httpd.conf

Xml 代码  

  1. Timeout 10  
  2. KeepAlive On  
  3. MaxKeepAliveRequests 5  
  4. KeepAliveTimeout 5  
  5.   
  6. <IfModule mpm_prefork_module>  
  7.     ServerLimit       3000  
  8.     StartServers      750  
  9.     MinSpareServers   5  
  10.     MaxSpareServers   100  
  11.     MaxClients        3000  
  12.     MaxRequestsPerChild   10000  
  13. </IfModule>  



(b)workers.properties 配置:  

Xml 代码  

  1. worker.list=loader  
  2.   
  3. worker.loader.type=lb  
  4. # 两 tomcat 负载均衡   
  5. worker.loader.balance_workers=tomcat1,tomcat2  
  6. # 不同步 session  
  7. worker.loader.sticky_session=false  
  8.   
  9. # 负载 1  
  10. worker.tomcat1.type=ajp13  
  11. worker.tomcat1.host=localhost  
  12. worker.tomcat1.port=8009  
  13. # 负载均衡因子,决定 apache 分发的比例   
  14. worker.tomcat1.lbfactor=1  
  15. worker.tomcat1.socket_timeout=10# 配置超时时间   
  16. worker.tomcat1.connection_pool_timeout=600# 配置关闭空闲连接时间   
  17.   
  18. # 负载 2  
  19. worker.tomcat2.type=ajp13  
  20. worker.tomcat2.host=localhost  
  21. worker.tomcat2.port=8109  
  22. # 负载均衡因子,决定 apache 分发的比例   
  23. worker.tomcat2.lbfactor=1  
  24. worker.tomcat2.socket_timeout=10# 配置超时时间   
  25. worker.tomcat2.connection_pool_timeout=600# 配置关闭空闲连接时间   



(c)tomcat/conf/server.xml 配置:  

Xml 代码  

  1. <Connector port="8009"   
  2.        enableLookups="false"  
  3.        maxProcessors="0"  
  4.        maxThreads="3000"  
  5.        minSpareThreads="100"  
  6.        maxSpareThreads="200"  
  7.        protocol="AJP/1.3"   
  8.        enableLookups="false"  
  9.        connectionTimeout="600000"  
  10.        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 | grephttpd | 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 单位是秒,而 tomcatconnectionTimeout 单位是毫秒。

来解释一下为什么必须设置两个参数完全一致:这两个参数的意思是在连接空闲多长时间后关闭空闲连接 ( 不包括活动的连接 ) 。想象一下这边 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值