每隔几天,大概 100 个站点中就会有一个 VPS 崩溃。Apache 连接数达到几百个,mysql 请求数达到几百万个。这会导致 CPU 一直处于 100% 以上,并使服务器完全无法使用。重新启动几天后即可解决问题。如何找到罪魁祸首?
我已经将 mod_status 的扩展状态设置为 ON,但它仍然只显示最近的几个请求。不知道如何使用它来将范围缩小到 100 个站点。
其余时间,服务器仅使用 20-30% 的资源,因此不会因网站数量过多而超载。
答案1
我对您的服务器配置不太了解,但我会尽力提供帮助。
首先启动iptables
,不允许攻击你的服务器
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
之后我认为这logrotate
可以帮助我们找到影响力最大的网站。
安装logrotate
sudo apt-get install logrotate
要验证 logrotate 是否已成功安装,请在命令提示符中运行此命令。
logrotate
该实用程序的配置和默认选项logrotate
位于:
/etc/logrotate.conf
一些重要的配置设置是:rotation-interval、log-file-size、rotation-count 和 compression。
特定于应用程序的日志文件信息(用于覆盖默认值)保存在:
/etc/logrotate.d/
我的想法是监控 http 访问文件。访问量较大的网站必须有较大的访问日志。Logrotate
我们cron
会关注此事并向您发送有关问题的邮件...
编辑logrotate.conf
并添加一些代码
sudo nano /etc/logrotate.conf
/path_to_apache_logs/*.log {
size 1M
dateext
postrotate
/usr/bin/killall -HUP httpd
ls -ltr /path_to_apache_logs/ | mail -s "$HOSTNAME: Apache restarted and log files rotated" [email protected]
endscript
}
您必须定制
size
- 日志文件的大小,根据您的需要进行更改
path_to_apache_logs
- 根据日志路径更改路径vhost.conf
logrotate.conf
您可以找到有关定制的更多信息这里
设置为每 5 分钟cron
运行一次logrotate
*/5 * * * * root /usr/sbin/logrotate /etc/logrotate.conf
当你处于“攻击”状态时,你的访问日志将快速增长。Cron
将运行logrotate
检查日志文件大小,如果文件大小为 XX,将旋转日志,重新启动附件并向您发送邮件。
因为每个虚拟主机都有自己的访问文件,所以你会知道哪个网站是服务器“杀手”