FreeBSD 上的 Apache22 - 启动,不响应请求

FreeBSD 上的 Apache22 - 启动,不响应请求

我在 Amazon 的 EC2 上的 FreeBSD 8.2-RC1 上运行带有 peruser MPM 的 Apache 2.2.17(因此它是 XEN)。它是从 ports 安装的。

我的问题是,尽管 Apache 正在运行、监听和接受连接,但它实际上并没有响应任何连接,也没有在日志中显示它们。

如果我通过 telnet 连接到它正在监听的端口并输入一个 HTTP 请求:

GET / HTTP/1.1
Host: asdfasdf

然后按了几次回车键,它就停在那里……什么都没有。用浏览器请求也没有响应。错误日志中似乎没有任何有用的信息:

[Sun Jan 09 16:56:24 2011] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Sun Jan 09 16:56:25 2011] [notice] Digest: generating secret for digest authentication ...
[Sun Jan 09 16:56:25 2011] [notice] Digest: done
[Sun Jan 09 16:56:25 2011] [notice] Apache/2.2.17 (FreeBSD) mod_ssl/2.2.17 

访问日志保持为空:

root:/var/log# wc httpd-access.log 
       0       0       0 httpd-access.log
root:/var/log#

我尝试过启用和禁用 accf_http 和 accf_data,以及使用原有配置和自定义配置。我还尝试过卸载 apache22-peruser-mpm 并直接安装 apache22... 仍然没有成功。我尝试从 httpd.conf 中删除所有 LoadModule 行,然后重新启用解析配置所需的行。最后只加载了以下内容:

root:/usr/local/etc/apache22# /usr/local/sbin/apachectl -M
Loaded Modules:
 core_module (static)
 mpm_peruser_module (static)
 http_module (static)
 so_module (static)
 authz_host_module (shared)
 log_config_module (shared)
 alias_module (shared)
Syntax OK
root:/usr/local/etc/apache22#

结果相同。

阿帕奇肯定是在端口 80 上监听的:

root:/usr/local/etc/apache22# sockstat -4 | grep httpd
root     httpd      43789 3  tcp4 6 *:80                  *:*
root     httpd      43789 4  tcp4   *:*                   *:*
root:/usr/local/etc/apache22#

我知道这不是防火墙问题,因为本地没有运行任何东西,从本地机器连接到 127.0.0.1:80 会导致同样的问题。

有人知道发生了什么吗?为什么会这样?我已经用尽了我所有的调试专业知识。:/

谢谢您的任何建议!

编辑:根据 Phil Hollenback 的建议,我对系统调用进行了跟踪。这是我通过 ktrace 和 truss 发现的。

48443 httpd    CALL  select(0,0,0,0,0xbf7feab4)
48443 httpd    RET   select 0
48443 httpd    CALL  gettimeofday(0xbf7feae4,0)
48443 httpd    RET   gettimeofday 0
48443 httpd    CALL  wait4(0xffffffff,0xbf7fea98,WNOHANG|WUNTRACED,0)
48443 httpd    RET   wait4 -1 errno 10 No child processes
48443 httpd    CALL  select(0,0,0,0,0xbf7feab4)
48443 httpd    RET   select 0
48443 httpd    CALL  gettimeofday(0xbf7feae4,0)
48443 httpd    RET   gettimeofday 0
48443 httpd    CALL  wait4(0xffffffff,0xbf7fea98,WNOHANG|WUNTRACED,0)
48443 httpd    RET   wait4 -1 errno 10 No child processes
48443 httpd    CALL  select(0,0,0,0,0xbf7feab4)

同样的事情一遍又一遍地重复。(这些是最后几行。)似乎正在发生的事情是它运行到选择,挂起片刻,返回 0,然后重试。我不知道这是否是正常行为,但我觉得没问题,因为这听起来就像它只是在轮询套接字?

我有点担心的是等待返回进程不存在的错误。truss(我用它来启动进程,获取初始设置)的输出显示对 fork() 的调用似乎返回正常(返回 PID,无错误)。

如果有帮助的话,桁架的输出:http://nucleardog.com/apache-truss.txt(已更新httpd -X。)

我在运行期间确实连接了 - select 似乎从未返回新连接?此外,我在 Apache 配置中将 LogLevel 调高至 Debug 并尝试再次运行 - 它从未记录任何连接。

我认为这可能更多的是 FreeBSD 的问题而不是 Apache 的问题,因为 Apache 似乎从未收到请求。:/

还有什么想法吗?

编辑2:这似乎是 FreeBSD 中的问题,因为 Apache 似乎从未收到连接请求。我在 FreeBSD 论坛 (forums.freebsd.org/showthread.php?p=118612) 上发了一篇帖子,看看能否在那里找到帮助。感谢大家抽出时间!

答案1

请尝试以下操作:

  1. pstree | less查找主 apache 进程 pid
  2. strace -p <pid> -f从步骤 1 开始观察进程中的系统调用。
  3. 使用 telnet 或 Web 浏览器连接到 apache。

您可能需要从 freebsd ports 安装 pstree 和 strace。您应该看到 strace 的滚动输出,因为它记录了正在运行的 apache 进程生成的系统调用(文件打开等)。这应该会给您一些线索,让您知道 apache 是否真的在运行,只是由于某种原因没有产生输出。

本页关于调试 Apache包含上述信息以及您可以使用的其他故障排除提示。

另外,您提到了访问日志,但没有提到错误日志,您看过了吗?那里可能有一些额外的诊断信息。

编辑:嗯,你确实说过你查看了错误日志,抱歉。另外,truss 是默认的 freebsd 调用跟踪工具,而不是 strace。使用 truss 是一个更好的答案,因为你不必像 strace 那样从 ports 编译它。

相关内容