MySQL 错误:连接数过多

MySQL 错误:连接数过多

从今天起,我的网站也出现连接错误...

PDOException: SQLSTATE[08004] [1040] Too many connections in lock_may_be_available() (line 167 of /home/sevensibir/domains/7sib.ir/public_html/includes/lock.inc).

我认为这是一次攻击,因为当我跑步时mysqltuner.pl我得到了:

[!!] Highest connection usage: 100%  (152/151)

但我知道我每天大约有 500 次访问。我如何发现这是否是一次攻击?我该如何阻止它?

答案1

我认为这是一次攻击,因为当我运行 mysqltuner.pl 时,我得到了

不。

这里没有任何证据支持您的假设。如果您无法确认这种流量水平是异常的,那么您就没有进行足够的监控。

但我知道我每天大约有 500 次访问

对于容量管理来说,这是一个无用的统计数据。您需要知道有多少并发连接、它们持续多长时间以及其中有多少比例用于静态内容。然后您需要开始问自己为什么数据库中出现了这么多连接 - 您可能允许在 Web 服务器上建立太多连接。

您需要做的第一件事是安装机器以便能够快速回答这些问题,然后您就可以开始考虑确保服务连续性的措施。对于 DOS 预防,您可以使用 iptables 做很多事情,使用应用程序防火墙或反馈工具(如 fail2ban)很有帮助,但放置基于事件的反向代理服务器将产生最大的影响。调整您的应用程序,特别是 MySQL 查询应该可以提供更大的容量。容量的快速修复方法是检查您的 PHP 代码是否明确关闭 mysql 连接 - 如果没有,则添加一个自动添加文件,该文件通过 register_shutdown_function() 调用 mysql_close()

答案2

可能不是攻击。您的应用程序打开了太多与 MySQL 的连接。这可能是 DDoS 造成的(或者仅仅是大量合法流量)。但是,更可能是您的应用程序(Drupal)没有正确关闭连接。这可能是它根本没有关闭它们(您是否使用了“持久”连接?——如果是,则不要使用)或者只是花费太长时间才能完成,因此在关闭连接之前花费了太长时间。

答案3

您可以阅读日志,并在 Web 服务器的访问日志中查看这些连接来自何处。另外,请确保您的 mysql 具有足够高的最大连接数(请参阅my.cnf并检查max_connections=)。

如果您仍然觉得自己受到了攻击,可以尝试 OSSEC 之类的 HIDS。它会自动检测发出过多请求的 IP。您可能需要针对您的应用程序对此进行微调。

答案4

PDOException = 您的网站要求提供大量信息。

如果您的 MySQL 服务器无法从网络访问,并且只能通过 Web 服务器的 localhost 进行连接,那么可能不行。这更表明您的服务器性能不足或 MySQL 配置错误,需要进行调整以跟上您网站产生的流量。

要查看您的网站是否受到攻击,您需要查阅服务器日志。大多数人都低估了当他们的客户 Google、Yahoo、Bing、百度和 Yandex 决定同时扫描他们的网站时,他们的网站会产生什么样的流量。是的,这是一种拒绝服务事件但并非攻击。

您的服务器因为无法处理流量而崩溃。您需要通读 Web 服务器访问日志来确定这一点,Weblog Expert 等分析工具可以帮助您完成此过程。一旦确定了流量来源,您才能确定它是恶意的还是服务器上的有效流量过多而无法跟上。

相关内容