我正在测试一个应用程序(希望在heroku上运行,但在本地也有问题)。当它运行http.Server.listen()时,它给我一个EACCES错误-但它只发生在一些端口上。

我在本地运行:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

我没有在端口900(或我尝试过的其他20个端口中的任何一个)上运行任何东西,因此这应该可以工作。奇怪的是,它确实在某些端口上工作。例如,端口3000可以正常工作。

是什么导致了这种情况?

更新1:

我发现在我的本地计算机上,EACCES错误出现了,因为我必须以root身份运行node才能绑定到那些特定的端口。我不知道为什么会发生这种情况,但是使用sudo可以修复它。然而,这并不能解释我如何在Heroku上修复它。没有办法在Heroku上以root身份运行,所以我怎么能在端口80上监听?


当前回答

在尝试了许多不同的方法之后,在我的窗口上重新安装IIS解决了这个问题。

其他回答

试试authbind:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

安装完成后,可以在“/etc/authbind/byport/”文件夹中添加一个以端口号命名的文件

使用chmod给它500个权限,并将所有权更改为您想要在其下运行程序的用户。

之后,在项目中以该用户执行“authbind node…”。

重启还不够!解决这个问题的唯一办法是:

你必须终止在该端口上运行的服务。

在cmd下,以管理员身份运行,然后输入: Netstat -aon | find /i "listening"

然后,您将获得一个带有活动服务的列表,搜索在4200n上运行的端口,并使用进程id(最后一列)来终止它

taskkill /F /PID 2652

在Windows系统上,重新启动“主机网络服务”服务,解决了该问题。

2023

Linux(任何发行版)

您可以使用CAP_NET_BIND_SERVICE,这是Linux的核心功能之一:

CAP_NET_BIND_SERVICE 将套接字绑定到Internet域特权端口(端口号小于1024)。

您可以给任何二进制文件一个永久权限来访问< 1024个端口。

以Node.js为例,它看起来像:

sudo setcap CAP_NET_BIND_SERVICE=+eip $(which node)

如果您愿意,您也可以稍后通过运行以下命令删除此权限:

setcap -r $(which node)

在工作站上运行

作为一般规则,没有根权限的进程不能绑定到1024以下的端口。

所以尝试一个更高的端口,或者通过sudo以更高的权限运行。在使用进程绑定到低端口后,可以降级特权。Setgid和process.setuid。

在heroku上奔跑

当你在heroku上运行你的应用程序时,你必须使用port环境变量中指定的端口。

参见http://devcenter.heroku.com/articles/node-js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));