Узел.JS connect работает только на localhost

Я написал небольшой узел.JS app, используя Connect, который обслуживает веб-страницу, а затем отправляет ее регулярные обновления. Он также принимает и записывает наблюдения пользователя в файл диска.

он отлично работает, пока я на localhost, но я не могу заставить другие коммпутеры в той же интрасети видеть его. Я использую порт 3000, но переход на порт 8080 или 80 не помог.

вот код, который я использую для настройки соединения:

    
var io = require('socket.io'),
  connect = require('connect');

var app = connect().use(connect.static('public')).listen(3000);
var chat_room = io.listen(app);

как указано выше, я пробовал изменить номер порта на 8080 или 80 и не видел никакой разницы, поэтому я не думаю, что это проблема брандмауэра (но я могу ошибаться). Я также думал о том, что после прочтения подобных вопросов, касающихся HTTP, добавить 0.0.0.0 в listen (), но не похоже, что listen() принимает параметр маски IP.

7 ответов


скорее всего, ваш сокет сервера привязан к IP-адресу loopback 127.0.0.1 вместо" все IP-адреса " символический IP 0.0.0.0 (обратите внимание, что это не маска сети). Чтобы подтвердить это, запустите sudo netstat -ntlp (Если вы на linux) или netstat -an -f inet -p tcp | grep LISTEN (OSX) и проверьте, к какому IP привязан ваш процесс (найдите строку с ":3000"). Если вы видите "127.0.0.1", это проблема. Исправьте это, передав "0.0.0.0" в listen звоните:

var app = connect().use(connect.static('public')).listen(3000, "0.0.0.0");

чтобы получить доступ для других пользователей к вашей локальной машине, я обычно использую сайту ngrok. Ngrok предоставляет ваш localhost в интернете и имеет оболочку NPM, которая проста в установке и запуске:

$ npm install ngrok -g
$ ngrok http 3000

посмотреть этот пример использования:

enter image description here

в приведенном выше примере локально запущенный экземпляр sails at:localhost: 3000 теперь доступен в Интернете по адресу: http://69f8f0ee.ngrok.io или https://69f8f0ee.ngrok.io


привязка к 0.0.0.0-это полдела. Существует IP-брандмауэр (отличный от того, что в Системных настройках), который блокирует TCP-порты. Следовательно, порт также должен быть разблокирован там, выполнив:

sudo ipfw add <PORT NUMBER> allow tcp from any to any

на вашем приложении, делает его доступным с любого устройства в сети:

app.listen(3000, "0.0.0.0");

для NodeJS в Azure, GCP & AWS

для виртуальной машины Azure, развернутой в resource manager, проверьте группу безопасности виртуальной сети и откройте порты или диапазоны портов, чтобы сделать ее доступной, иначе в конечных точках облака, если виртуальная машина развернута в старой версии azure.

просто найдите его эквивалент для GCP и AWS


у меня есть очень простое решение этой проблемы: process.argv дает вам список аргументов, переданных в приложение node. Поэтому, если вы бежите:

node server.js 0.0.0.0

вы получите:

process.argv[0] //=> "node"
process.argv[1] //=> "server.js"
process.argv[2] //=> "0.0.0.0"

так что вы можете использовать process.argv[2] чтобы указать, что в качестве IP-адреса вы хотите прослушать:

http.listen(3000, process.argv[2]);

теперь ваше приложение прослушивает" все " IP-адреса, например http://192.168.1.4:3000/your_app.

Я надеюсь, это поможет кому-то!


Fedora или в CentOS distro проверьте selinux и firewalld в моем случае firewalld предотвратил соединение:

Selinux: $sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   {{checkmode}}
Mode from config file:          {{checkconfig}}
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30

Firewalld status: $systemctl status firewalld

Работа для меня с этой строкой (просто добавьте --слушай при работе) :

node server.js -p 3000 -a : --listen 192.168.1.100

надеюсь, что это помогает...