nodejs:听 EACCES:权限被拒绝 0.0.0.0:80

Posted

技术标签:

【中文标题】nodejs:听 EACCES:权限被拒绝 0.0.0.0:80【英文标题】:nodejs: listen EACCES: permission denied 0.0.0.0:80 【发布时间】:2020-06-07 21:19:20 【问题描述】:

我正在尝试创建 https 服务器以通过节点 js 测试套接字 io。根据this page

openssl genrsa -out privatekey.pem 2048 
openssl req -new -key privatekey.pem -out certrequest.csr 
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

我创建了privatekey.pemcertificate.pem,这是我的代码:

var express = require('express');
var https = require('https');
var fs = require('fs');

var options = 
    key: fs.readFileSync('privatekey.pem'),
    cert: fs.readFileSync('certificate.pem')
  ;
var app = express();

 var server = https.createServer(options, app).listen(443);

var io = require('socket.io').listen(server,()=>
    console.log('listen to https');
);



io.on('connection', function (socket) 
    console.log(' user connected');
    socket.on('disconnect', function () 
        console.log('a user disconnected');
    );
);

但是在运行服务器后我得到了这个错误:

tazik@mx:/mnt/Projects/Projects/nodejs/socketserver
$ node app.js 
events.js:288
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES: permission denied 0.0.0.0:80
    at Server.setupListenHandle [as _listen2] (net.js:1292:21)
    at listenInCluster (net.js:1357:12)
    at Server.listen (net.js:1445:7)
    at Object.<anonymous> (/mnt/Projects/Projects/nodejs/socketserver/app.js:15:24)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47
Emitted 'error' event on Server instance at:
    at emitErrorNT (net.js:1336:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) 
  code: 'EACCES',
  errno: 'EACCES',
  syscall: 'listen',
  address: '0.0.0.0',
  port: 80

我正在使用 linux mx。

【问题讨论】:

我认为 Apache 正在使用端口 80,所以请确保端口没有冲突(如果您的系统上有 apache)? enter image description here 对于 Windows .. 我在这里杀死端口号:1024 并且工作正常:) 这能回答你的问题吗? Node.js EACCES error when listening on most ports 【参考方案1】:

非特权用户(非 root)无法在低于 1024 的端口上打开监听套接字。

查看this

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

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

很遗憾,除非您以 root 身份登录,否则您通常必须使用 像 http://ip:port 这样的 URL - 其中端口号 > 1024。

很多人都被困在这里,但解决方案很简单。有几个 选项,但这是我喜欢的选项。输入以下命令:

> sudo apt-get install libcap2-bin 
> sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\`` 

现在,当您告诉 Node 应用程序时 你希望它在 80 端口上运行,它不会抱怨。

编辑:在setcap 命令中添加一个空格

【讨论】:

当我做你的建议时,我希望打印 console.log('listen to https');但什么也没有发生。我认为我的代码中有问题@sohan 我正在尝试理解您上面的代码,您在哪里使用http 端口开始服务。我只能看到 https 被使用。你能清理一下代码吗? @sayreskabir 我建议你关注这个。socket.io/get-started/chat 和 socket.io/docs。我认为您没有使用html 为您的请求提供服务,并且未创建套接字。因为在使用 express 时有一定的步骤 当客户端加入时你如何通知服务器,你在做这样的事情,` var socket = io.connect('localhost:3000'); socket.on('connect', function(data) socket.emit('join', 'Hello World from client'); );` @Chiptus 啊哇,这太明显了。我应该意识到的。谢谢!【参考方案2】:

我认为您需要 root 权限才能在 1024 以下的端口上运行。

sudo node app.js

如果您没有 sudo 帐户,请尝试使用其他端口,例如 8080 和 4433。

【讨论】:

当我做你的建议时,我希望打印console.log('listen to https');,但没有发生任何事情@huytc @sayreskabir 那么控制台上是否打印了任何内容? 没有打印:pasteall.org/pic/show.php?id=ad0ad07fbc112f4e2e89a44bc05e17e0@huytc @sayreskabir 将此部分 // Create an HTTP service. var io = require('socket.io').listen(server,()=&gt; console.log('listen to https'); ); 移动到 var server = ... 下方。删除此行:var io = require('socket.io').listen(server);. 这会将节点服务器作为“root”运行,出于安​​全原因,这是一个坏主意。 syskall.com/dont-run-node-dot-js-as-root【参考方案3】:

这是权限问题,你可以写sudo作为前缀

sudo npm start

它对我有用!

【讨论】:

这会以 root 用户身份运行节点。这被认为是糟糕的安全性。考虑一种替代方法,例如授予节点进程特定权限。 syskall.com/dont-run-node-dot-js-as-root【参考方案4】:

server.listen 中,第一个参数必须是端口,然后是主机名:

server.listen(port , hostname , () => 
    console.log('server started'); 
);

【讨论】:

【参考方案5】:

如果是 Windows 用户,其他一些应用程序或服务正在使用端口 80,这就是我们收到此错误的原因。您可以查看哪些应用正在使用该服务

您可以通过在您的命令中使用以下命令来停止所有使用端口 80 的服务:

net stop http

现在尝试运行您想在端口 80 上运行的应用程序。

【讨论】:

【参考方案6】:

这个问题可能是因为您的用户没有使用端口 80 的权限。您可以像 root 用户一样登录或像 DigitalOcean 推荐的那样将权限授予 NodeJS:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node 

sudo setcap cap_net_bind_service=+ep /usr/local/node 

参考:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps#give-safe-user-permission-to-use-port-80

【讨论】:

【参考方案7】:

试试这个,

var server = https.createServer(options, app); // Creating a server
var io = require('socket.io').listen(server); // Mapping socket with server

server.listen(8443,() =>  // setting port for existing server
    console.log('Https listening'); // Now socket and server both listens to same port
);

【讨论】:

以上是关于nodejs:听 EACCES:权限被拒绝 0.0.0.0:80的主要内容,如果未能解决你的问题,请参考以下文章

听 EACCES:Windows 中的权限被拒绝

错误:EACCES:权限被拒绝,mkdir '/.npm'

“Errno::EACCES ...权限被拒绝”运行指南针手表

npm 包无法安装“npm ERR!错误:EACCES:权限被拒绝”

错误:EACCES:权限被拒绝

FileNotFoundException:EACCES(权限被拒绝)