Не удается запустить приложение node js, прослушивающее 443

У меня есть сокет-приложение, которое я пытаюсь заставить прослушивать порт 443 (https). Если я изменю порт (например, на 8080), у меня не возникнет проблем.

Показанная ошибка

error raised: Error: listen EACCES

Исходный код моего приложения:

var fs = require('fs');

// create the https server and listen on port
var options = {
    ca:   fs.readFileSync('ca.pem'),
    cert: fs.readFileSync('cert.pem'),
    key:  fs.readFileSync('server.key')
};

var server = require('https').createServer(options);
var portNo = 443;
var app = server.listen(portNo, function() {
  console.log((new Date()) + " Server is listening on port " + portNo);
});

// create the socket server on the port
var io = require('socket.io').listen(app);


// This callback function is called every time a socket
// tries to connect to the server
io.sockets.on('connection', function (socket) {

    console.log((new Date()) + ' Connection established.');

    // When a user send a SDP message
    // broadcast to all users in the room
    socket.on('message', function (message) {
        socket.broadcast.emit('message', message);
    });

    // When the user hangs up
    // broadcast bye signal to all users in the room
    socket.on('disconnect', function () {
        // close user connection
        console.log((new Date()) + " Peer disconnected.");
        socket.broadcast.emit('user disconnected');
    });
});

Я видел много ответов, касающихся Linux, в которых говорилось, что они должны работать от имени sudo, поэтому я попытался запустить сервер узла от имени администратора, но безрезультатно.

Это работает на коробке Windows Server 2012.

Спасибо.


person rashleighp    schedule 15.05.2013    source источник


Ответы (2)


Вы убедились, что порт 443 еще не используется?

Перейдите в командную строку, запустите netstat -a и убедитесь, что :443 еще нет в списке. Если это так, вам нужно будет завершить любой процесс, использующий этот порт, прежде чем продолжить.

person Spencer Ruport    schedule 15.05.2013
comment
Могу ли я не делиться портом с IIS (у меня есть сайт, работающий как https на том же ip)? Если бы не это, это объяснило бы это. Я не знал, что это ограничение. - person rashleighp; 15.05.2013
comment
Вы не можете совместно использовать порт с IIS. Процессы не могут совместно использовать порты TCP. - person Daniel; 15.05.2013
comment
IIS может обслуживать несколько сайтов на одном порту, поскольку все они обрабатываются одним и тем же процессом. Когда он получает HTTP-запрос, он просматривает HTTP-заголовок имени хоста и использует его, чтобы определить, какой веб-сайт обслуживать. Тем не менее, это не относится к 443 по причинам, которые я не совсем понимаю, но я подозреваю, что это как-то связано с тем, как работает SSL. - person Spencer Ruport; 15.05.2013

Я просто хотел бы добавить, что если у вас нет уровня разрешений root при запуске приложения node, вы не сможете работать на порту 443.

person Squivo    schedule 09.10.2014
comment
Можно ли как-нибудь снять рут защиту для 443? - person Sharjeel Ahmed; 26.06.2016
comment
Я использую Ubuntu 14.04 - person Sharjeel Ahmed; 28.06.2016
comment
stackoverflow.com/questions/413807/ --- Я думаю, это может вам помочь. Я использую macOS, поэтому я просто запускаю свое приложение, используя .plist под управлением root, но если вы хотите запускать свои приложения без привилегий root, эта статья должна по крайней мере охватывать основы. - person Squivo; 28.06.2016