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

新手上路,请多包涵

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

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 。

原文由 Cyrus the Great 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4k
2 个回答

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

检查 这个

授予安全用户使用端口 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 命令中添加一个空格

原文由 Sohan 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 sudo node app.js

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

原文由 huytc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏