nodejs: listen EACCES: permission denied 0.0.0.0:80

2guxujil  于 2022-12-29  发布在  Node.js
关注(0)|答案(8)|浏览(920)

我正在尝试创建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。

vyu0f0g1

vyu0f0g11#

非特权用户(非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上运行时,它不会抱怨。

    • EDIT**:在setcap命令中添加空格
dba5bblo

dba5bblo2#

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

sudo node app.js

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

kb5ga3dv

kb5ga3dv3#

这是一个权限问题,您可以只将sudo作为前缀

sudo npm start

对我有效!

a9wyjsp7

a9wyjsp74#

@Sohan回答候补
我不得不使用yum而不是apt-get

sudo yum install libcap2-bin 
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
3gtaxfhh

3gtaxfhh5#

在windows用户的情况下,一些其他的应用程序或服务正在使用端口80,这就是为什么我们得到这个错误。你可以检查哪些所有的应用程序正在使用这个服务
通过在命令中使用以下命令,可以停止使用端口80的所有服务:

net stop http

现在尝试运行应用程序,你要在端口80上运行。

4bbkushb

4bbkushb6#

这是可能发生的问题,因为您的用户没有权限使用端口80。您可以像根用户登录或给予权限NodeJS像DigitalOcean建议:

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
wqlqzqxt

wqlqzqxt7#

server.listen中,第一个参数必须是port,然后是hostname:

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

iovurdzv8#

试试这个

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
});

相关问题