无法在我的服务器上监听80端口

6

对于这种问题我很新,我试图在80端口上启动服务器(对我来说使用这个特定端口非常重要)。

它失败了,但是在其他端口上可以工作(即使我是root并且端口号<1024,但仍然在80端口上失败)。

我可能有一些东西运行在80端口上,我想识别它以更改其侦听端口。

我看到这个命令可以帮助查看特定端口的状态:netstat -ano|grep 80|grep LISTEN,但我不确定是否理解结果。

这是我得到的结果:

tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp6       0      0 :::80                   :::*                    LISTEN      off (0.00/0/0)
unix  2      [ ACC ]     STREAM     LISTENING     8805     /tmp/mongodb-27017.sock
unix  2      [ ACC ]     STREAM     LISTENING     13112    /home/me/.pulse/04d802bb34ddb9da49b1f9060000000b-runtime/native

我在第二行读到端口80似乎没有监听,但是不太理解。

更新:

sudo lsof -i :80

COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache2   1107     root    4u  IPv6   7630      0t0  TCP *:http (LISTEN)
apache2   1131 www-data    4u  IPv6   7630      0t0  TCP *:http (LISTEN)
apache2   1132 www-data    4u  IPv6   7630      0t0  TCP *:http (LISTEN)
apache2   1133 www-data    4u  IPv6   7630      0t0  TCP *:http (LISTEN)
apache2   1134 www-data    4u  IPv6   7630      0t0  TCP *:http (LISTEN)
apache2   1136 www-data    4u  IPv6   7630      0t0  TCP *:http (LISTEN)
ubuntu-ge 2095     me    7u  IPv4  82145      0t0  TCP me-Ubuntu.local:43345->mulberry.canonical.com:http (CLOSE_WAIT)

感谢(我正在使用Ubuntu)!

1
这是Linux吗?还是其他的UNIX版本? - Jack Leow
:::80告诉你通过IPv6监听端口80的情况,而::相当于IPv4中的0.0.0.0。下面mvp的回答应该会告诉你当前在端口80上运行的进程是什么。 - Devin Stewart
1
这个应该放在 Serverfault 上吧? - Kien Truong
这个问题可能会被认为是 Stack Overflow 的离题问题。你可以尝试在 Ask UbuntuUnix.SESuper User 上询问(但请先在相应网站上搜索相关内容)。 - Eliah Kagan
2个回答

12

如果这是Linux(也许其他一些UNIX系统也可以,但不包括MacOS),请尝试运行以下命令:

sudo netstat -lnp
你会得到类似于以下的输出:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
...
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     26156/apache2       
...
我会列出一些有趣的部分:
  • 本地地址:0.0.0.0:80 - 该地址指的是所有接口上的80端口。
  • 状态:LISTEN - 它正在监听
  • PID/程序名 - 26156/apache2 - 正在监听该端口的进程的ID和名称。

基本上,您需要确保上述程序未在运行(例如,在我的情况下,我必须关闭apache2守护程序,并配置操作系统在下一次启动时不自动启动它)。

另一方面,如果您只想快速解决问题,可以杀死该进程:

kill -9 <pid>
在我的例子中:
kill -9 26156

当你重启计算机或某人启动该服务时,这个问题当然会再次出现。


好的,谢谢你的解释,是的,对于我的情况,Apache是在端口80上运行的程序。更改它的端口是否是一个好主意?我猜想Apache需要匹配HTTP请求,所以我不想对它做一些错误的操作... - Ludo
我的情况下运作正常,显示了Apache2,我将其停止作为守护进程>;-O - Jacek Pietal

4
你可以使用lsof来查找以下内容:
sudo lsof -i :80

如果您没有lsof,请使用以下命令进行安装。
sudo apt-get install lsof

lsof 是一种像瑞士军刀一样的工具,可以告诉你目前是谁正在使用文件和套接字。


我已经更新了主贴并附上了结果,Apache似乎正在监听这个端口,但我猜它必须这样做才能匹配HTTP请求...?(抱歉,我有点迷失^^) - Ludo
1
你必须启动另一个绑定在80端口的Apache实例。你应该先停止它:sudo service apache2 stop。换句话说,lsof不应显示任何正在监听80端口的进程,否则你将无法启动另一个实例。 - mvp
是的,我理解了这一点,但有没有办法让Apache在另一个端口上工作?因为我需要它与特定路径(其中有我的Web应用程序)匹配,然后我需要一个Node.js服务器侦听端口80。 - Ludo
是的,你可以让Apache在任意端口上工作(http://httpd.apache.org/docs/2.2/bind.html)。但是要记住,大多数用户网站之外的其他端口很可能会被防火墙屏蔽。更好的选择是使用Apache中的ProxyPass(http://httpd.apache.org/docs/2.2/vhosts/examples.html#proxy)将其代理到在某个内部端口上运行的Node.js。 - mvp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接