AWS EC2中Apache2 Prefork读取请求突增致MaxRequestWorkers耗尽求助
分析与解决方案:EC2 Apache被内部OPTIONS请求耗尽进程
一、请求来源定位
从日志看,这些请求来自::1(IPv6回环地址)和实例内部主机名ip-xxx-xx-xx-xxx.ec2.internal,说明请求是从EC2实例自身发起的,并非外部流量。这类OPTIONS * HTTP/1.0请求常见于:
- 自定义健康检查脚本或crontab定时任务
- 第三方监控工具(如CloudWatch Agent、自定义监控脚本)
- 实例内部运行的某个服务异常循环发起请求
定位发起进程的方法
用ss命令关联本地连接的进程ID:
ss -tulpn | grep :80 | grep ESTAB | grep ::1
或者用tcpdump抓包匹配请求内容:
tcpdump -i lo6 port 80 and 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x4f505449' -nn
拿到进程ID后,执行ps aux | grep <PID>查看进程详情,即可找到请求发起方。
二、拦截与缓解方案
1. Apache配置层面精准拦截
在Apache主配置(/etc/apache2/apache2.conf)或对应虚拟主机配置中添加规则,拒绝来自回环地址的OPTIONS *请求:
# 启用重写引擎(未启用时添加) RewriteEngine On # 拦截来自::1的OPTIONS * 请求,返回403 RewriteCond %{REMOTE_ADDR} ^::1$ RewriteCond %{REQUEST_METHOD} ^OPTIONS$ RewriteCond %{REQUEST_URI} ^\*$ RewriteRule ^ - [F,L]
修改后重启Apache生效:
systemctl restart apache2
2. 调整Prefork参数缓解进程耗尽
若暂时无法定位根源,可调整Apache Prefork模式参数优化资源占用:
编辑/etc/apache2/mods-available/mpm_prefork.conf:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 200 # 根据实例内存调整,1G内存建议不超过100 MaxConnectionsPerChild 0 KeepAliveTimeout 2 # 缩短连接超时,快速释放进程 </IfModule>
重启Apache生效。
3. iptables本地拦截(临时备选)
若Apache规则无效,可通过iptables阻止本地回环的OPTIONS请求:
iptables -A INPUT -i lo -p tcp --dport 80 -s ::1 -m string --string "OPTIONS * HTTP/1.0" --algo bm -j DROP
注意:该规则会匹配请求内容,高并发下可能影响性能,仅作为临时应急方案。
三、排查AWS内部服务
检查是否是AWS官方服务发起的请求:
- 查看CloudWatch Agent配置,确认是否有重复或错误的80端口监控项
- 检查Systems Manager的Run Command或State Manager任务,是否存在定时执行的异常脚本
- 查看实例用户数据,确认启动脚本中是否包含异常请求逻辑
内容的提问来源于stack exchange,提问作者user774150
相关产品推荐
相关产品推荐

