![Apache 是否停滞了?/server-status 显示超过 240 个请求,例如“OPTIONS * HTTP/1.0”200 - “-”“Apache(内部虚拟连接)”](https://linux22.com/image/511283/Apache%20%E6%98%AF%E5%90%A6%E5%81%9C%E6%BB%9E%E4%BA%86%EF%BC%9F%2Fserver-status%20%E6%98%BE%E7%A4%BA%E8%B6%85%E8%BF%87%20240%20%E4%B8%AA%E8%AF%B7%E6%B1%82%EF%BC%8C%E4%BE%8B%E5%A6%82%E2%80%9COPTIONS%20*%20HTTP%2F1.0%E2%80%9D200%20-%20%E2%80%9C-%E2%80%9D%E2%80%9CApache%EF%BC%88%E5%86%85%E9%83%A8%E8%99%9A%E6%8B%9F%E8%BF%9E%E6%8E%A5%EF%BC%89%E2%80%9D.png)
一些细节:
- 网络服务器:Apache/2.2.13 (FreeBSD) mod_ssl/2.2.13 OpenSSL/0.9.8e
- 操作系统:FreeBSD 7.2-RELEASE
- 这是一个 FreeBSD 监狱。
- 我相信我使用 Apache‘prefork’ MPM(我运行 FreeBSD 的默认设置)。
- 我使用 MaxClients 的默认值(256)
我已启用 mod_status,并将“ExtendedStatus On”设置为“开”。当我查看 /server-status 时,我看到了一些常规请求。我还看到来自“localhost”的 240 多个请求,如下所示。
37-0 - 0/0/1 . 0.00 1510 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
38-0 - 0/0/1 . 0.00 1509 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
39-0 - 0/0/3 . 0.00 1482 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
40-0 - 0/0/6 . 0.00 1445 0 0.0 0.00 0.00 127.0.0.2 www.example.gov OPTIONS * HTTP/1.0
我昨天还看到来自本地主机的大约 2417 个请求,如下所示:
Apr 14 11:16:40 192.168.16.127 httpd[431]: www.example.gov 127.0.0.2 - - [15/Apr/2010:11:16:40 -0700] "OPTIONS * HTTP/1.0" 200 - "-" "Apache (internal dummy connection)"
页面位于http://wiki.apache.org/httpd/InternalDummyConnection说“这些请求非常正常,一般来说你不需要担心它们”,但我不太确定。
为什么有超过 230 个这样的连接?这些是活动连接吗?如果我有“MaxClients 256”,并且有超过 230 个这样的连接,那么我的网络服务器似乎已经危险地接近耗尽可用连接了。Apache 似乎只需要少数这些“内部虚拟连接”
我们昨晚实际上发生了两次无法解释的停电,我想知道这些“内部虚拟连接”是否导致我们用尽了可用的连接。
更新 2010/04/16
8 小时后。/server-status 页面仍然显示有 243 行内容为“www.example.gov OPTION *”。我相信这些连接不活跃。服务器大部分时间处于空闲状态(当前正在处理 1 个请求,9 个空闲工作进程)。Unix 主机上只有 18 个活动的 httpd 进程。
如果这些连接未处于活动状态,为什么它们会显示在 /server-status 下?我原本以为它们会在初始化几分钟后过期。
答案1
Apache 处理惊群攻击的方式可能与您想象的略有不同。当您收到大量入站流量时,它会生成大量子进程,如果它确定需要更多子进程,它会在下一个间隔内生成两倍数量的子进程,直到最终有足够的进程来处理请求或达到最大客户端数。
如果您看到这些,则意味着 apache 只是在检查子进程,导致 apache 派生出这么多进程的事件可能已经消失。是的,它们确实占用了客户端连接,但是,导致进程延迟的事件可能已经消失。
我首先要检查您的日志中的是事件发生之前的一堆 302。
如果你有类似的东西
<?php include("http://www.oursite.com/header.php");?>
缺少 header.php 的地方
ErrorDocument 404 /404.php
404.php 包含 header.php,您会得到一个递归循环,并且该页面的点击会立即导致 apache 使用所有可用的连接。
答案2
我的理解是,鉴于这些是从父进程到子进程的连接,它们只是 Apache 跟踪子进程正在做的事情。请记住:
- 孩子们在处理完请求后可以逗留一段时间
- 内部虚拟连接定期发生
- 如果子进程没有做其他事情(因为服务器大部分时间处于空闲状态),虚拟连接将是它最近处理的事情
据我所知,虚拟连接不会“耗尽”子进程。Apache 会检查其子进程的状态,而不是测试它们是否正常工作。
答案3
如果记忆不错的话,这些是由轻量级代理(例如 Lighttpd)生成的测试连接,这些代理位于较重的服务器(例如 Apache)的前面。
假设你在监狱里,主机服务器是否可能通过 lighttpd 将请求代理到(私人)监狱 IP?
答案4
嗯,答案很意外。这是由于我们在午夜拍摄 UFS 文件系统快照时出现文件系统问题而导致的。
这似乎是由 FreeBSD UFS 错误引起的。我们在 FreeBSD Host 上使用 FreeBSD Jails,使用默认的 UFS 文件系统。UFS 文件系统很大——1.8TB。
每晚我们都会使用“dump(8)”运行一次备份。dump(8) 在备份文件系统之前会创建文件系统的快照,这会冻结文件系统。Dump 应该适用于小于 2TB 的文件系统,但在我们的情况下却失败了。这家伙也遇到了同样的问题。
(我将我的答案从问题部分移到了答案部分。stefan,20100608)