![FreeBSD 上的 Apache22 - 启动,不响应请求](https://linux22.com/image/535206/FreeBSD%20%E4%B8%8A%E7%9A%84%20Apache22%20-%20%E5%90%AF%E5%8A%A8%EF%BC%8C%E4%B8%8D%E5%93%8D%E5%BA%94%E8%AF%B7%E6%B1%82.png)
我在 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
请尝试以下操作:
pstree | less
查找主 apache 进程 pidstrace -p <pid> -f
从步骤 1 开始观察进程中的系统调用。- 使用 telnet 或 Web 浏览器连接到 apache。
您可能需要从 freebsd ports 安装 pstree 和 strace。您应该看到 strace 的滚动输出,因为它记录了正在运行的 apache 进程生成的系统调用(文件打开等)。这应该会给您一些线索,让您知道 apache 是否真的在运行,只是由于某种原因没有产生输出。
本页关于调试 Apache包含上述信息以及您可以使用的其他故障排除提示。
另外,您提到了访问日志,但没有提到错误日志,您看过了吗?那里可能有一些额外的诊断信息。
编辑:嗯,你确实说过你查看了错误日志,抱歉。另外,truss 是默认的 freebsd 调用跟踪工具,而不是 strace。使用 truss 是一个更好的答案,因为你不必像 strace 那样从 ports 编译它。