以编程方式检测本地Web服务器是否已挂起

时间:2014-10-01 12:58:42

标签: c linux apache watchdog boa

我意识到我会得到至少一个答案,就像“(重新)编写代码所以它不会挂起”但我们假设我们并没有生活在那个闪亮的快乐乌托邦中......

在我们的嵌入式系统中,我们有一个很棒的SDK,包括一个Web服务器(Boa),这是用户交互的主要方法。

在月球的某些阶段,某些可能会导致Web服务器挂起或以其他方式卡住,以使进程正常运行(不会崩溃/死机/使用) 100%CPU)但不提供任何网页

所以,问题是,我们如何测试/检测这种情况?

1 个答案:

答案 0 :(得分:2)

要测试服务器是否挂起,请创建TCP套接字并连接到IP地址80上的端口127.0.0.1(环回地址)。然后通过套接字发送以下文本

GET / HTTP/1.1\r\n\r\n

大多数服务器会将其解释为index.html的请求。或者,您可以实现一个未记录的URL进行测试(允许更短的预定响应),例如

GET /test/fdoaoqfaf12491r2h1rfda HTTP/1.1\r\n\r\n

然后,您需要从服务器读取响应。这涉及使用具有合理超时的select来确定是否有任何数据从服务器返回,如果是,请使用recv来读取数据。来自服务器的响应将包含一个标题,后跟内容。标题由文本行组成,标题末尾有一个空行。行以\r\n结尾,因此标题的结尾为\r\n\r\n

获取内容涉及调用selectrecv,直到recv返回0.这假定服务器将发送响应然后关闭套接字。一些复杂的服务器将打开套接字以允许通过同一套接字的多个请求。一个简单的嵌入式服务器不应该这样做。 (如果您的服务器 尝试为多个请求使用相同的套接字,那么您需要弄清楚如何关闭该功能。)


这一切都非常好,但你真的需要重写你的代码,所以它不会挂起。

问题的最可能原因是服务器有一堆悬空套接字,即来自客户端的连接从未正确清理过。悬空套接字最终会阻止服务器接受更多连接,因为服务器对打开的连接数有限制,或者因为运行服务器的进程占用了所有文件描述符。

要检查的第一件事是TCP超时值。我工作的一个项目默认超时为5小时,这意味着悬挂的插座保持打开5个小时。合理的超时是1分钟。

然后你需要创建一个故意行为不端的客户端。

客户可能行为不端
  • 在没有读取服务器响应的情况下打开套接字
  • 在阅读回复时突然关闭套接字
  • 在阅读回复时正常关闭套接字

第一种情况应该由TCP超时处理。另外两个需要由服务器代码正确处理。通过ioctlshutdown函数的SO_LINGER选项控制优雅和突然的套接字闭包。客户端在服务器进程中行为不端check the number of open file descriptors后,验证服务器是否已正确处理该情况。