You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:44:50