每天晚上,当雅虎抓取网站并将其关闭时,我都会在 Centos 5 网络服务器上遇到麻烦。我在服务器遭受雅虎洪水攻击时对其进行了监控,内存从未耗尽,因此它从未到达交换分区。负载似乎从未超过 1.5。除非 Apache 暂时停止接受传入连接,否则我认为不会出现问题。
我怀疑该问题与服务器不接受任何新连接有关,但这对我来说是个模糊的领域。
有人能帮我弄清楚这里发生了什么事,或者给我提供一些我可以学习的材料吗?
编辑:
我在每 20 秒运行一次的 while 循环中运行了 Glenn Kelley 提供的 netstat 命令。当我注意到我开始同时获得超过 5 个 ESTABLISHED 连接(我的常态)时,CLOSE_WAIT 数量将开始攀升至 40 - 60 左右。此时,我将“mysqladmin proc stat”添加到 while 循环中,并注意到我有一个当时正在运行 mysqldump 的备份脚本。
显然,mysqldump 锁定了数据库中的所有表,从而阻止了写入操作。由于这个原因,以及雅虎抓取的时间恰好是每分钟 40 页,在达到 MaxClients 后,服务器最终将停止接受传入 Apache 的请求。
我现在正在研究使用 MySQL 复制来实现非锁定备份或寻找更好的时间来运行备份。使用带有 --skip-lock-tables 的 mysqldump 对我来说不是一个选择,而且我不能使用 mysqlhotcopy,因为我有几个 InnoDB 表。
答案1
您可以在这里做一些事情。
- 您是否已对服务器进行微调,以允许来自 1 IP 的 x 数量个连接?
- 安装 mod_evasive 应该会有很大帮助。
- 运行 netstat 查看是否有其他流量进入系统:
netstat -ntu | awk'{print $5}'| cut -d: -f1 | sort | uniq -c | sort -n
该命令将列出访问服务器的每个 IP 以及其拥有的连接数。
- 使用您最喜欢的编辑器(请先备份)编辑此文件 /usr/local/apache/conf/httpd.conf
更改主要选项:(当然根据你的喜好和需求进行调整)
最大保持活动请求数 50 (100) 保持活动超时 60 (30)
对以下每个变量进行可能有帮助的其他编辑:Timeout KeepAliv MinSpareServers MaxSpareServers MaxClients
每次改变 1 个 — 这样你就知道你改变了什么,以及...其中一个或另一个是否会有害或有帮助。
添加额外的 Anti-DDOS 工具也可能有帮助。InetBase 的脚本可能会有所帮助 - 具体取决于您的使用情况。
http://www.inetbase.com/scripts/ddos/
最后,一个简单的反向代理可能会带来很大的不同。NGINX 就是这样的一个代理
您是否在使用控制面板?如果是的话 - 知道哪一个 - 可能会帮助社区更好地帮助您......
答案2
我以前见过类似的东西。
我的猜测是,你有一个永远无法完成的错误链接...所以这个过程会等待...等待、等待、等待...下一个查询命中相同的链接...等待、等待、等待...
基本上,它会一直这样做,直到所有进程都被使用...然后你就可以接受 :(
检查记分牌(在重新启动服务器之前查看哪些 URL 被卡住了)
答案3
另外,请确保已启用 mysql 日志记录,并检查是否未达到 max_connections(假设您的 Web 应用程序正在使用 mysql)。
答案4
如果您能提供有关 Web 服务器配置方式、连接数、yahho 连接数、平均和最大持续时间的详细信息,那将会很有帮助。
听起来你对 maxClients 和 MaxKeepAliveRequests / KeepAliveTimeout 的组合设置不正确