Http 在大多数端口上侦听时发生Node.js EACCES错误

Http 在大多数端口上侦听时发生Node.js EACCES错误,http,node.js,permission-denied,Http,Node.js,Permission Denied,我正在测试一个应用程序(希望能在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

我正在测试一个应用程序(希望能在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)
joe@joebuntu:~$node
>var h=require('http').createServer();
>听(900);
错误:EACCES,权限被拒绝
在服务器上。\u doListen(net.js:1062:5)
net.js:1033:14
在Object.lookup(dns.js:132:45)
在Server.listen(net.js:1027:20)
在[对象上下文]:1:3
在接口处。(回复js:150:22)
在Interface.emit(events.js:42:17)
在接口处在线(readline.js:132:10)
在接口处。\u行(readline.js:387:8)
在接口处写入(readline.js:564:14)
我没有在端口900(或我尝试过的其他20个端口中的任何一个)上运行任何东西,因此这应该可以工作。奇怪的是,它在某些端口上工作。例如,端口3000工作正常

这是什么原因造成的

更新1: 我发现在我的本地计算机上,EACCES错误即将出现,因为我必须以root身份运行节点才能绑定到这些特定端口。我不知道为什么会发生这种情况,但使用sudo可以解决它。然而,这并不能解释我将如何在Heroku上修复它。在Heroku上无法以root用户身份运行,因此如何在端口80上侦听?

在您的工作站上运行 一般来说,没有root权限运行的进程不能绑定到1024以下的端口

因此,请尝试更高的端口,或通过
sudo
以提升的权限运行。使用和绑定到低端端口后,可以降级权限

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

const server=require('http').createServer();
const port=process.env.port | 3000;
server.listen(端口,()=>console.log(`Listening on${port}`));
在您的工作站上运行 一般来说,没有root权限运行的进程不能绑定到1024以下的端口

因此,请尝试更高的端口,或通过
sudo
以提升的权限运行。使用和绑定到低端端口后,可以降级权限

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

const server=require('http').createServer();
const port=process.env.port | 3000;
server.listen(端口,()=>console.log(`Listening on${port}`));

非特权用户(非root用户)无法在1024以下的端口上打开侦听套接字。

非特权用户(非root用户)无法在1024以下的端口上打开侦听套接字。

我在mac上遇到此错误,因为默认情况下,它使用与节点服务器使用的端口相同的端口运行apache服务器,在我的示例中,该端口是80。我所要做的就是用
sudo apachectl stop


希望这对某人有所帮助。

我在mac上遇到了这个错误,因为默认情况下,它使用与节点服务器相同的端口运行apache服务器,在我的示例中,该端口是80。我所要做的就是用
sudo apachectl stop


希望这对其他人有所帮助。

这意味着节点无法侦听已定义的端口。将其更改为1234、2000或3000,然后重新启动服务器。

这意味着节点无法在定义的端口上侦听。将其更改为1234、2000或3000之类的值,然后重新启动服务器。

请记住,如果您使用sudo绑定到端口80,并且正在使用环境变量port&NODE\env,则必须重新导出这些变量,因为您现在在根配置文件下,而不是在用户配置文件下。因此,为了让它在我的Mac上工作,我做了以下工作:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

请记住,如果使用sudo绑定到端口80,并且使用环境变量port&NODE_env,则必须重新导出这些变量,因为您现在处于根配置文件而不是用户配置文件下。因此,为了让它在我的Mac上工作,我做了以下工作:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

如果您尝试在其上本地承载的端口是portfowarded,则会发生这种情况。如果您尝试在其上本地承载的端口是portfowarded,则会发生这种情况。请检查以下内容:

授予安全用户使用端口80的权限

请记住,我们不希望以root用户身份运行您的应用程序, 但有一个问题:您的安全用户没有使用权限 默认的HTTP端口(80)。您的目标是能够发布 访问者可以通过导航到易于使用的URL(如
http://ip:port/

不幸的是,除非您以root用户身份登录,否则通常必须使用 类似
http://ip:port
-其中端口号>1024

很多人被困在这里,但解决办法很简单。有一些 但这是我喜欢的。键入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
现在,当您告诉节点应用程序希望它在端口上运行时 80,它不会抱怨

选中此项:

授予安全用户使用端口80的权限

请记住,我们不希望以root用户身份运行您的应用程序, 但有一个问题:您的安全用户没有使用权限 默认的HTTP端口(80)。您的目标是能够发布 访问者可以通过导航到易于使用的URL(如
http://ip:port/

不幸的是,除非您以root用户身份登录,否则通常必须使用 类似
http://ip:port
-其中端口号>1024

很多人被困在这里,但解决办法很简单。有一些 但这是我喜欢的。键入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
现在,当您告诉节点应用程序希望它在端口上运行时 80,它不会抱怨

尝试authbind:

安装后,您可以在以下文件夹中添加一个具有要使用的端口号名称的文件:/etc/authbind/byport/

给500
app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});
const port = process.env.PORT || 8085;
PORT=8080 # The port the server runs at
HOST=127.0.0.1,
HOST=127.0.0.1