在两天的时间里,我对 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 现在可以正常工作了!