不知道在 OS X 中侦听端口 80

geo*_*off 38 networking port port-forwarding iptables macos

我在 OSX Mountain Lion 10.8.3 上,我刚刚重新启动了我的 Mac。

我想启动一个服务(比如端口 80 上的 Apache),但是端口 80 已经发生了一些事情:

telnet localhost 80

Trying ::1...
Connected to localhost.
Escape character is '^]'.
Run Code Online (Sandbox Code Playgroud)

等等,我听到你说,你可以用 lsof 或 netstat 找到。除了什么都没有

netstat -an | grep LISTEN | grep '\.80'

*comes back blank*

lsof -i :80 | grep LISTEN

*comes back blank
Run Code Online (Sandbox Code Playgroud)

因此,根据我对 unix 系统的了解,我认为这一定是数据包转发规则吗?即数据包正在从入站端口 80 转发到其他正在侦听该服务的东西。

ipfw show

65535 0 0 allow ip from any to any
Run Code Online (Sandbox Code Playgroud)

嗯,没什么异常

pfctl -s nat

No ALTQ support in kernel
ALTQ related functions disabled
Run Code Online (Sandbox Code Playgroud)

没有什么不寻常的

我的问题是,如何显示任何数据包转发规则...在 Linux 上,我可能只执行 iptables -L -t NAT 或 iptables -L。或者,任何 OSX 专家可以帮助我诊断这个问题吗?

Dan*_*eck 51

您需要运行这些命令root来显示其他用户的进程,例如:

sudo lsof -i ':80'
Run Code Online (Sandbox Code Playgroud)

Mac OS X中包括可使用控制的Apache Web服务器apachectl作为root。通常通过 启动launchd,对应的配置文件是/System/Library/LaunchAgents/org.apache.httpd.plist. 如果不是这个 Apache 在端口 80 上运行,它可能是launchd,Apple 的守护进程管理器实现。根据维基百科

当 launchd 在启动时扫描作业 plist 时,它会保留并侦听这些作业请求的所有端口。如果在 plist 中通过“OnDemand”键指示,守护进程实际上并没有被加载。相反,launchd 将侦听端口,在需要时启动守护进程,并在不需要时将其关闭。加载守护进程后,launchd 将跟踪它并确保它在需要时正在运行。

  • 对我来说,解决问题的是在终端中运行`sudo apachectl stop`。 (3认同)

geo*_*off 10

只是为了让实际答案清楚,以防用户搜索此问题。

  1. launchd 会/System/Library/LaunchDaemons/在启动时扫描并从中计算org.apache.httpd.plist出,当 apache 启动时,它需要将端口 80 转发到它上面。

  2. sudo apachectl start 已完成

  3. 然而,httpd.conf文件中有一个错误,意味着 apache 没有启动,尽管这不是通过apachectl命令报告的。

  4. Launchd 决定侦听端口 80,因为它认为 apache 已启动。

  5. 但是任何 HTTP 请求的内容都会导致连接立即关闭。

  6. sudo lsof -i :80 没有答案

  7. sudo netstat -an | grep LISTEN 端口 80 没有响应

  8. 据我所知,在任何诊断工具中都没有任何信息表明端口 80 正在使用或正在侦听。

  9. 修复 apache 的 httpd.conf 并成功重新启动 apache,因此 httpd 在 ps 表中,导致 HTTP 请求成功。

  10. 因此,我错误地认为我无法运行 apache,因为已经有一些东西在监听端口 80,而不是 apache conf 本身才是原因