Узел.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
посмотреть этот пример использования:
в приведенном выше примере локально запущенный экземпляр 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
надеюсь, что это помогает...