Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 在大多数端口上侦听时发生Node.js EACCES错误_Http_Node.js_Permission Denied - Fatal编程技术网

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以下的端口上打开侦听套接字。

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


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

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

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

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

如果您试图在其上本地承载的端口是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,它不会抱怨

尝试authbind:

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

使用chmod为其授予500个权限,并将所有权更改为要在其下运行程序的用户


之后,以项目中的用户身份执行“authbind node…”。

另一种方法是进行端口重定向:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000
并在>1024端口上运行服务器:

require('http').createServer().listen(3000);

顺便说一下,https(443)端口也可以这样做。

我在mac上也遇到了这个错误。我使用
npm run dev
在Windows中运行我的Nodejs应用程序,它工作正常。但是我在mac上遇到了这个错误-
给出的错误是:error:bind EACCES null:80

解决此问题的一种方法是使用root访问权限运行它。您可以使用
sudo npm run dev
,需要输入密码

通常最好在非特权端口(如3000)上为应用程序提供服务,该端口将在没有根权限的情况下工作


参考资料:

天哪!!在我的例子中,我做的是
…listen(ip,port)
而不是
…listen(port,ip)
,这就抛出了错误消息:
错误:listen EACCES localhost

我使用端口号>=3000,甚至尝试了管理员访问。没有结果。然后再仔细看,我注意到了这个问题。将其更改为
…侦听(端口,ip)
,一切都开始正常工作


如果它对其他人有用的话,只需大声说出来…

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

我的错误通过(在Windows上)解决

app.set('PORT',4000 | |进程环境端口);
app.listen(app.get('PORT'),()=>{
log(“服务器运行在”+app.get('PORT'));
});

允许NodeJS应用程序访问Windows防火墙中的网络。

我的错误通过更改server.js中的端口号得到解决 特别是在这方面

const port = process.env.PORT || 8085;
我把端口号从8080改为8085


希望有帮助。

我遇到了一个类似的问题,它拒绝在8080端口上运行,但也拒绝在其他端口上运行

事实证明,这是因为它读取的
env.local
文件在变量名后面包含注释,如:

PORT=8080 # The port the server runs at
它这样解释,试图使用端口“
8080”#服务器运行的端口
”,即
PORT=8080 # The port the server runs at
HOST=127.0.0.1,
HOST=127.0.0.1