2012-01-09 3 views
7

Я написал веб-сервер, используя Node.js. Когда я попытался протестировать свой сервер с помощью тестера, который я написал для него, мне удалось, только если порт, который я использую для сервера, не 80. Я проверил netstat, и никакое другое приложение не использует порт 80. ошибки я получаю на консоли:Node.js: ECONNREFUSED на порту 80

Error: connect ECONNREFUSED 
    at errnoException (net.js:640:11) 
    at Object.afterConnect [as oncomplete] (net.js:631:18) 

Что можно сделать в этом случае?

+0

Каков номер порта, на котором работал сервер? Возможно, у вас нет разрешения на привязку к порту 80. – Finslicer

+1

Я пробовал 8080, и это работает как шарм. – limlim

+0

Если вы используете Ubuntu, например (или другую систему Unix), вы можете попробовать 'sudo node sample.js'. Это обычно делает трюк. – alessioalex

ответ

3

Возможно, у вас нет прав на подключение к портам ниже 1024 (включая 80) в качестве обычного пользователя (например, без полномочий root), попробуйте порт с более высоким номером (выше 1024, например, 8080).

[Редактировать]

В зависимости от целевой системы, и если вы являетесь его администратором, то вы, вероятно, можете обойти эту проблему следующим образом:

  1. Выполнить программу с помощью "sudo », например: sudo node ./myprogram.js.

  2. Или войдите в систему как пользователь «root» и запустите программу в обычном режиме.

Однако, не получить в привычке делать либо из них на регулярной основе (пока вы не поймете, почему), они потенциально могут ввести дыры в безопасности, которые могут быть годными для использования злоумышленников, мотивированных людьми.

+0

Мне нужно установить порт на 80 (это назначение, которое я должен отправить, поэтому он должен работать и на порту 80). Как я могу получить это разрешение? – limlim

+0

Разрешение может быть предоставлено системным администратором. Обратите внимание, что ваша программа будет работать одинаково на любом номере порта, если у пользователя, запускающего программу, есть разрешение на привязку к этому порту. – maerics

+0

Это мой собственный компьютер. Как я могу это сделать? – limlim

10

Это в основном дополнение к ответу от maerics, но поскольку я хочу добавить пример кода, я пишу еще один ответ с дополнительной информацией, как предотвратить проблемы безопасности.

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

Вы можете сделать это с помощью node.js, используя process.setuid("username").

Следующий пример запускает сервер, а затем падение корневых прав доступа для пользователя «WWW-данных» после того, как она привязала себя к порту 80, когда начался как корень:

function StartServer() { 
    console.log("Starting server..."); 
    // Initalizations such as reading the config file, etc. 
    server = http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
    }); 
    try { 
    server.listen(80, "0.0.0.0", function(){ 
     process.setuid("www-data"); 
    }); 
    } 
    catch(err) { 
    console.error("Error: [%s] Call: [%s]", err.message, err.syscall); 
    process.exit(1); 
    } 
} 
+1

+1 Кроме того, только FYI вы можете добавить [подсказки подсветки синтаксиса языка] (http://meta.stackexchange.com/questions/981/syntax-highlighting-language-hints) ([link] (http: // meta. stackexchange.com/questions/981/syntax-highlighting-language-hints)) к вашим фрагментам кода, чтобы сделать их красивее! – maerics

+0

спасибо, угадайте, что он не работал сам по себе без тега javascript в вопросе :) – Bastian

+0

Да, у автодетектора, по всей видимости, самая большая проблема с производными ECMAScript по какой-то причине. – maerics

17

Вы не должны сделать привычку запущенного узла как привилегированного пользователя. Вот метод я использую на 6 различных машин:

Использование iptables направить входящий трафик на порт 80 на 8080, как так:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

Тогда не забудьте сохранить, что

sudo iptables-save 

Вы также хотите добавить это в rc.local, чтобы они были установлены при перезагрузке или запуске экземпляра (в случае EC2 или другого облака).

Затем вы можете безопасно начать прослушивание узла на 8080 как любой пользователь.

+0

Вам также не нужно направлять исходящий трафик на порт 8080 в порт 80? – Tom

+0

@Tom У вас нет. Это автоматически. – talentedmrjones

+0

Огромный +1 на этом решении. Я решил использовать apache virtualhost, чтобы сделать то же самое, но это сделало трюк! – benipsen

0

Альтернативный вариант, который я не видел в приведенном выше списке, также позволяет вашему процессу связываться с привилегированным портом (< 1024), выполнив следующую команду на исполняемом элементе. (Adapt путь)

setcap 'cap_net_bind_service=+ep' /opt/meteor/.meteor/tools/latest/bin/node 

Раздражение является то, что каждый раз при обновлении или изменении исполняемого узла необходимо переиздать эту команду.

Привет,

0

Я использую сервер Nginx (порт 80) в передней части Node.js (любой порт> 1024). Он отлично работает.