Apache 无法在 Mountain Lion 中启动。语法正常。发生了什么?

Apache 无法在 Mountain Lion 中启动。语法正常。发生了什么?

在两天的时间里,我对 Apache 配置进行了大量更改。有时更改似乎没有被采纳,而且总是我不知何故弄乱了配置文件的语法,总会apachectl -t显示一些问题。系统日志还会显示有关重生 httpd 的错误消息。

第二天,我需要进行一些额外的更改,并注意到 Apache 没有发现这些更改。我想在 apache error_log 中查看错误,但什么也没看到。删除它们并重新启动 apache 没有任何作用。文件甚至没有重新创建!

因此,我当然再次检查了语法,然后apachectl -t输出了Syntax OK。 看起来,那里没什么问题。 然后我检查了我的系统日志,里面全是有关 httpd 的错误:

Mar 13 11:03:41 skinny com.apple.launchd[1] (org.apache.httpd[22707]): Exited with code: 1
Mar 13 11:03:41 skinny com.apple.launchd[1] (org.apache.httpd): Throttling respawn: Will start in 10 seconds

使用 apachectl 停止、启动、重新启动都没有任何效果。但我实际上设法访问了 localhost。那么发生了什么?

答案1

当我意识到我实际上可以通过端口 80 访问 localhost 时,即使我已发出apachectl stop,通往照明的道路也清晰了。我需要找出实际占用端口 80 的是什么,然后将其杀死。

首先我检查了是什么抓住了它

netstat -ta |grep LISTEN
tcp4       0      0  *.65374                *.*                    LISTEN     
tcp4       0      0  *.65373                *.*                    LISTEN     
tcp4       0      0  *.spytechphone         *.*                    LISTEN     
tcp4       0      0  *.blp1                 *.*                    LISTEN     
tcp4       0      0  *.8193                 *.*                    LISTEN     
tcp46      0      0  *.http                 *.*                    LISTEN     
tcp4       0      0  localhost.25986        *.*                    LISTEN     

这并没有给我 PID,但至少向我展示了实际上是 Apache 占用了端口 80。接下来我得到了 PID

$  sudo lsof -iTCP -sTCP:LISTEN
COMMAND     PID              USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd       1              root   24u  IPv6 0x3917f1c4693aa457      0t0  TCP *:rfb (LISTEN)
launchd       1              root   25u  IPv4 0x3917f1c4693af43f      0t0  TCP *:rfb (LISTEN)
httpd     11654              root    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     11655              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     11662              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     11663              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     11664              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     20907              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     20909              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     20910              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)
httpd     20933              _www    5u  IPv6 0x3917f1c46be2d077      0t0  TCP *:http (LISTEN)

使用 PID,我现在可以在终止进程之前了解一些进程信息

$  ps -ef 11654
  UID   PID  PPID   C STIME   TTY           TIME CMD
    0 11654     1   0  3:40PM ??         0:00.54 /usr/sbin/httpd -k start -e debug

就是这样。看来我前一天使用调试标志启动的 Apache 进程在向 发出停止命令时没有被终止apachectl。因此我不得不手动终止它。

$  sudo killall httpd

这解决了“僵尸”问题(好吧,根据操作系统理论,这不是僵尸进程,但仍然不想死)。重新启动 apache 现在可以正常工作了!

相关内容