我有一台运行 apache2、php 和 MySQL 的 centos 6 服务器。apache 配置有几个虚拟站点,因为服务器运行六个网站,其中三个站点使用 MySQL,另外三个不使用。
最近我发现使用 MySQL 的网站崩溃了 - 报告错误“无法连接到 sql 数据库..”
查看日志后,似乎有多个 apache 实例正在运行,占用了我的所有内存 - 这导致服务器终止 MySQL 进程,以防止服务器死机,并且片刻之后它会恢复(有时我必须修复一些表)
为了尝试控制这种情况,我将 max_connections 降低到 100 - 但这并没有帮助
现在我不确定我是否需要更多内存(安装 1GB)或者我是否受到 DoS 攻击。老实说,我们确实预计服务器的流量会很大,但我如何知道单个 IP 是否在持续访问该服务器?
如果有帮助的话,我在下面粘贴了一些“正常操作”期间的输出
free -m
total used free shared buffers cached
Mem: 992 771 221 0 15 87
-/+ buffers/cache: 668 323
Swap: 976 39 937
ps aux | grep apache
apache 17148 0.1 3.4 430836 35036 ? S 06:34 0:10 /usr/sbin/httpd
apache 17150 0.1 3.3 430592 34560 ? S 06:34 0:12 /usr/sbin/httpd
apache 17157 0.1 3.3 333192 33896 ? S 06:34 0:13 /usr/sbin/httpd
apache 17164 0.1 3.3 333712 33984 ? S 06:34 0:09 /usr/sbin/httpd
apache 17167 0.1 3.4 430576 34584 ? S 06:34 0:12 /usr/sbin/httpd
apache 17168 0.1 3.3 430064 34312 ? S 06:34 0:11 /usr/sbin/httpd
apache 17176 0.1 3.3 430564 34560 ? S 06:34 0:11 /usr/sbin/httpd
apache 17184 0.1 3.4 432124 35500 ? S 06:34 0:08 /usr/sbin/httpd
apache 17186 0.1 3.3 430088 34384 ? S 06:34 0:14 /usr/sbin/httpd
apache 17188 0.1 3.3 333464 34028 ? S 06:34 0:13 /usr/sbin/httpd
apache 17190 0.1 3.4 430548 34616 ? S 06:34 0:08 /usr/sbin/httpd
apache 17193 0.1 3.3 333372 33548 ? S 06:34 0:12 /usr/sbin/httpd
apache 17195 0.1 3.4 333716 34672 ? S 06:34 0:11 /usr/sbin/httpd
apache 17225 0.1 3.3 430044 33584 ? S 06:35 0:10 /usr/sbin/httpd
apache 17239 0.1 3.4 430568 34796 ? S 06:35 0:11 /usr/sbin/httpd
apache 17241 0.1 3.3 430480 34284 ? S 06:35 0:11 /usr/sbin/httpd
apache 17290 0.1 3.4 430948 34824 ? S 06:35 0:10 /usr/sbin/httpd
apache 21095 0.1 3.1 331300 32344 ? S 08:15 0:01 /usr/sbin/httpd
apache 30858 0.1 3.2 430148 33304 ? S Aug04 0:49 /usr/sbin/httpd
apache 31996 0.1 3.2 430168 33480 ? S Aug04 0:48 /usr/sbin/httpd
答案1
看起来您需要更多 RAM。您还可以减少 HTTPd 进程的最大数量或 PHP 的最大内存参数。
答案2
我同意@PauRudnitskiy 的观点,但在投入更多内存来解决问题之前,你应该考虑一些事情。
就像 Paul 所说的那样,查看您的 Apache 配置,查看允许的最大子进程数和连接数。如果最大子进程数也是正在运行的进程数,那么可能是您遇到了问题。
还可以使用以下命令检查系统负载
uptime
它看起来像这样
02:22:35 启动 4:07,4 个用户,平均负载:0.10、0.08、0.06
如果后面的数字平均负载“看起来很大,这表明你正在受到攻击。只需将最大的数字除以你拥有的 CPU 核心数,如果结果大于 1,则意味着你的 CPU 已满。
最后,我要补充的是,我向您展示的内容实际上是要查看您是否处于流量高峰或额外负载之下。您需要查看您的 apache 日志,以尝试查看您是否受到某种攻击,通常这可以通过同一个 ip 地址向页面发出大量请求以及普通用户不会做的其他事情来查看。