Node.js连接只能在localhost上运行
我使用Connect编写了一个小型的node.js应用程序,它提供了一个网页,然后定期发送更新。 它也接受和logging用户观察到一个磁盘文件。
只要我在本地主机上,它就能正常工作,但是我不能在同一个内部网上看到其他的计算机。 我正在使用端口3000,但更改为端口8080或80没有帮助。
这是我用来build立连接的代码:
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问题之后,我们在listen()中添加了0.0.0.0,但是listen()并没有使用IP掩码参数。
很可能您的服务器套接字绑定到回送IP地址127.0.0.1
而不是“所有IP地址”符号IP 0.0.0.0
(注意这不是一个networking掩码)。 要确认这一点,运行sudo netstat -ntlp
(如果你在Linux上)或者netstat -an -f inet -p tcp | grep LISTEN
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将你的本地主机公开到networking上,并且有一个NPM包装器,它很容易安装和启动:
$ npm install ngrok -g $ ngrok http 3000
看到这个例子用法:
在上面的例子中,在localhost:3000上的sails的本地运行实例现在可以在以下url获得: http : //69f8f0ee.ngrok.io或https://69f8f0ee.ngrok.io
绑定到0.0.0.0是战斗的一半。 有一个IP防火墙(不同于系统首选项)阻止TCP端口。 因此,港口必须通过以下方式畅通无阻:
sudo ipfw添加允许tcp从任何任何
我有这个问题的一个非常简单的解决scheme: process.argv
给你一个传递给节点应用程序的参数列表。 所以如果你运行:
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
我希望这会帮助别人!
在您的应用程序上,使其可以从networking中的任何设备访问:
app.listen(3000, "0.0.0.0");
对于Azure中的NodeJS,GCP和AWS
对于部署在资源pipe理器中的Azure虚拟机,请检查您的虚拟networking安全组,并打开端口或端口范围以使其可达,否则在您的云端点中部署虚拟机以旧版本的Azure。
只要寻找相当于GCP和AWS的
为我工作这一行(只需添加 – 运行时):
node server.js -p 3000 -a : --listen 192.168.1.100
希望它有帮助…
Fedora或Centos发行版检查你的selinux和firewalld在我的情况下firewalld阻止了连接:
Selinux:$ sestatus SELinux状态:启用 SELinuxfs挂载:/ sys / fs / selinux SELinux根目录:/ etc / selinux 加载的策略名称:有针对性的 当前模式:{{checkmode}} configuration文件中的模式:{{checkconfig}} 政策MLS状态:启用 政策deny_unknown状态:允许 最大内核策略版本:30 Firewalld状态:$ systemctl status firewalld