nodejs: прослушать EACCES: отказано в разрешении 0.0.0.0:80 - PullRequest
2 голосов
/ 24 февраля 2020

Я пытаюсь создать https-сервер для проверки сокета io по node js. Согласно этой странице

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

enter image description here

я создал privatekey.pem и certificate.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.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2020

Пользователь без привилегий (не root) не может открыть прослушивающий сокет на портах ниже 1024.

Проверьте this

Give Safe Разрешение пользователя на использование порта 80

Помните, мы НЕ хотим запускать ваши приложения от имени пользователя root, но есть некоторая проблема: ваш безопасный пользователь не имеет разрешения использовать порт HTTP по умолчанию (80 ). Ваша цель - иметь возможность публиковать sh веб-сайт, который посетители могут использовать, перейдя на простой в использовании URL-адрес, такой как http://ip: порт /

К сожалению, если вы не войдете в систему как root, вы обычно должны использовать URL-адрес, такой как http://ip: порт - где номер порта> 1024.

Многие люди здесь застряли, но решение это просто. Есть несколько вариантов, но это тот, который мне нравится. Введите следующие команды:

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

Теперь, когда вы сообщаете приложению Node, что вы хотите, чтобы оно запускалось на порту 80, оно не будет жаловаться.

2 голосов
/ 24 февраля 2020

Полагаю, вам нужны root привилегии для работы на портах ниже 1024.

sudo node app.js

Если у вас нет учетной записи sudo, попробуйте использовать другие порты, например 8080 и 4433.

0 голосов
/ 24 февраля 2020

Попробуйте,

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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...