看不到 apache 在 netstat 中运行

mec*_*oll 13 server apache2

我只是与Apache玩,我把它开始工作,这是我可以通过浏览连接到服务器http://127.0.0.1http://192.168.1.5我没有运行IPv6

然而这是 netstat 的结果

$ sudo service apache2 status
 * apache2 is running
$ netstat -an | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN

$ wget 127.0.0.1
--2014-06-26 01:32:15--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 11510 (11K) [text/html]
Saving to: ‘index.html’

100%[=====================================================================================================>] 11,510      --.-K/s   in 0s      

2014-06-26 01:32:15 (161 MB/s) - ‘index.html’ saved [11510/11510]
Run Code Online (Sandbox Code Playgroud)

我期待看到它在正常的 TCP 上监听,它显然是这样做的!?

编辑:

$ netstat -a | grep LISTEN
tcp        0      0 localhost:ipp           *:*                     LISTEN     
tcp        0      0 localhost:mysql         *:*                     LISTEN     
tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN     
tcp6       0      0 [::]:https              [::]:*                  LISTEN     
tcp6       0      0 [::]:http               [::]:*                  LISTEN     
Run Code Online (Sandbox Code Playgroud)

Edit2: 为什么投反对票?我错过了什么有人可以详细说明吗?

Joh*_*ith 21

TL; 博士

Apache确实出现在您的netstat输出中,并且正在运行。这就是为什么你的wget电话有效。但是,它绑定到您的 IPv6 地址而不是您的 IPv4 地址。地址映射在必要时处理转换。

寻找文档

这里显然有一些 IPv6-IPv4 回退机制。事实上,我没有在本地网络上使用 IPv6,但是:

$ netstat -tunla | grep LISTEN | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN
Run Code Online (Sandbox Code Playgroud)

重要的是要注意,无论您如何寻址您的机器,它最终仍然是相同的服务和端口。剩下的主要取决于您的浏览器和 DNS 解析服务。但是,有关 Apache 如何处理此问题的更多信息,您可能需要查看他们的文档

Apache 管理员的一个复杂因素是 IPv6 套接字是否可以同时处理 IPv4 连接和 IPv6 连接。使用 IPv6 套接字处理 IPv4 连接使用 IPv4 映射的 IPv6 地址,在大多数平台上默认允许,但在 FreeBSD、NetBSD 和 OpenBSD 上默认不允许,以便匹配这些平台上的系统范围策略。在默认情况下不允许的系统上,特殊的配置参数可以更改 Apache 的此行为。

基本上,这是关于处理 IPv4 和 IPv6 套接字的方式,以避免与跨平台兼容性和套接字处理相关的大多数问题。正如您所读到的,在像 Ubuntu 这样的 Linux 平台上,这个问题是使用IPv4 映射的 IPv6 地址解决的。该文件还指出:

如果您希望 Apache 仅处理 IPv4 连接,而不管您的平台和 APR 支持什么,请在所有 Listen 指令中指定 IPv4 地址。

这会在ports.conf文件中给出类似的内容:

Listen 0.0.0.0:80 # Or...
Listen 127.0.0.1:80 # Or...
Listen 192.0.2.1:80
Run Code Online (Sandbox Code Playgroud)

导致以下netstat输出之一...

$ netstat -tunla | grep LISTEN | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN 
$ netstat -tunla | grep LISTEN | grep 80
tcp        0      127.0.0.1:80              127.0.0.1:80            LISTEN
$ netstat -tunla | grep LISTEN | grep 80
tcp        0      192.0.2.1:80              192.0.2.1:80            LISTEN 
Run Code Online (Sandbox Code Playgroud)

一个漂亮但尚未准备好 IPv6 的侦听器。上述设置通常设置在/etc/apache2/ports.conf(或直接在apache2.conf旧版本中设置)。默认值为Listen 80,它执行自动绑定,即符合文档中给出的 IPv6 规范。

  • Huh 不知道地址映射,所以我必须注意 IPv6 和 IPv4 上的开放端口。 (2认同)